Paljon Excel-toiminnallisuuksia on käytettävissä myös VBA:ssa – ja Autofilter-menetelmä on yksi tällainen toiminnallisuus.
Jos sinulla on tietokokonaisuus ja haluat suodattaa sen jonkin kriteerin avulla, se onnistuu helposti Data-ribbon Filter-vaihtoehdolla.
Ja jos haluat siitä kehittyneemmän version, Excelissä on myös kehittynyt suodatin.
Miksi sitten edes käyttää VBA:n automaattista suodatinta?
Jos sinun tarvitsee vain suodattaa tietoja ja tehdä joitain perusjuttuja, suosittelen pitäytymään Excelin käyttöliittymän tarjoamassa sisäänrakennetussa suodatintoiminnallisuudessa.
Sinun kannattaa käyttää VBA:n automaattista suodatinta silloin, kun haluat suodattaa tietoja osana automatisointia (tai jos se auttaa säästämään aikaa nopeuttamalla tietojen suodattamista).
Esitetään esimerkiksi, että haluat nopeasti suodattaa tiedot pudotusvalinnan perusteella ja sitten kopioida nämä suodatetut tiedot uuteen laskentataulukkoon.
Vaikka tämä voidaan tehdä käyttämällä sisäänrakennettua suodatintoimintoa yhdessä jonkin verran copy-paste-toiminnon kanssa, manuaalinen tekeminen voi viedä paljon aikaa.
Tällaisessa tilanteessa VBA-autosuodattimen käyttäminen voi nopeuttaa asioita ja säästää aikaa.
Huomautus: Käsittelen tätä esimerkkiä (tietojen suodattamista pudotusvalinnan perusteella ja kopiointia uuteen arkkiin) myöhemmin tässä opetusohjelmassa.
Tämä opetusohjelma kattaa:
- Excel VBA Autofilter -syntaksi
- Esimerkki:
- Esimerkki: Useita kriteerejä (AND/OR) samassa sarakkeessa
- Esim: Useita kriteerejä eri sarakkeilla
- Esimerkki: Suodata 10 parasta tietuetta käyttämällä AutoFilter-menetelmää
- Esimerkki: Suodata ylimmät 10 prosenttia käyttäen AutoFilter-menetelmää
- Esimerkki: Jokerimerkkien käyttäminen automaattisessa suodattimessa
- Esimerkki: Suodatettujen rivien kopioiminen uuteen arkistoon
- Esimerkki: Suodata tietoja solun arvon perusteella
- Excelin automaattisen suodattimen kytkeminen päälle/pois päältä VBA:n avulla
- Tarkista, onko AutoFilter jo käytössä
- Näytä kaikki tiedot
- Automaattisen suodattimen käyttäminen suojatuilla arkeilla
Excel VBA Autofilter -syntaksi
Expression. AutoFilter( _Field_ , _Criteria1_ , _Operator_ , _Criteria2_ , _VisibleDropDown_ )
- Ilmaisu: Tämä on alue, johon haluat soveltaa automaattista suodatusta.
- Kenttä: Tämä on sarakkeen numero, jota haluat suodattaa. Tämä lasketaan tietokokonaisuudessa vasemmalta. Jos siis haluat suodattaa tiedot toisen sarakkeen perusteella, tämä arvo on 2.
- Criteria1: Tämä on kriteeri, jonka perusteella haluat suodattaa tietokokonaisuuden.
- Operator: Jos käytät myös kriteeriä 2, voit yhdistää nämä kaksi kriteeriä Operatorin perusteella. Käytettävissä ovat seuraavat operaattorit: xlAnd, xlOr, xlBottom10Items, xlTop10Items, xlBottom10Percent, xlTop10Percent, xlFilterCellColor, xlFilterDynamic, xlFilterFontColor, xlFilterIcon, xlFilterValues
- Arvot
- Kriteeri2: Tämä on toinen kriteeri, jonka perusteella voit suodattaa tietokokonaisuuden.
- VisibleDropDown: Voit määrittää, haluatko suodattimen avattavan kuvakkeen näkyvän suodatetuissa sarakkeissa vai ei. Tämä argumentti voi olla TRUE tai FALSE.
Lisäksi Expression, kaikki muut argumentit ovat valinnaisia.
Jos et käytä yhtään argumenttia, se yksinkertaisesti soveltaisi tai poistaisi suodatinkuvakkeet sarakkeisiin.
Sub FilterRows()Worksheets("Filter Data").Range("A1").AutoFilterEnd Sub
Ylläoleva koodi yksinkertaisesti soveltaisi Autofilter-menetelmää sarakkeisiin (tai poistaisi sen, jos se on jo soveltaen).
Tämä tarkoittaa yksinkertaisesti sitä, että jos et näe suodatinkuvakkeita sarakkeiden otsikoissa, alat nähdä sen, kun tämä yllä oleva koodi suoritetaan, ja jos näet sen, se poistetaan.
Jos sinulla on suodatettuja tietoja, se poistaa suodattimet ja näyttää sinulle koko tietokokonaisuuden.
Katsotaan nyt joitakin esimerkkejä Excel VBA Autofilterin käyttämisestä, jotka selventävät sen käyttöä.
Esimerkki:
Oletetaan, että sinulla on alla esitetyn kaltainen tietokokonaisuus ja haluat suodattaa sen sarakkeen ’Nimike’ perusteella.
Alla oleva koodi suodattaisi kaikki rivit, joissa nimike on ’Tulostin’.
Sub FilterRows()Worksheets("Sheet1").Range("A1").AutoFilter Field:=2, Criteria1:="Printer"End Sub
Yllä oleva koodi viittaa Sheet1:een ja sen sisällä se viittaa A1:een (joka on tietokokonaisuuden solu).
Huomaa, että tässä olemme käyttäneet Field:=2:ta, koska Item-sarake on tietokokonaisuutemme toinen sarake vasemmalta.
Nyt jos mietit – miksi minun täytyy tehdä tämä VBA-koodilla. Tämä voidaan tehdä helposti käyttämällä sisäänrakennettua suodatintoimintoa.
Olet oikeassa!
Jos tämä on kaikki mitä haluat tehdä, parempi käyttää sisäänrakennettua suodatintoiminnallisuutta.
Mutta kun luet loput opetusohjelmasta, huomaat, että tämä voidaan yhdistää joihinkin lisäkoodeihin tehokkaan automaation luomiseksi.
Mutta ennen kuin näytän ne, käyn ensin läpi muutaman esimerkin, jotta näet, mitä kaikkea AutoFilter-metodilla voi tehdä.
Klikkaa tästä ladataksesi esimerkkitiedoston ja seurataksesi mukana.
Esimerkki: Useita kriteerejä (AND/OR) samassa sarakkeessa
Esitellään, että minulla on sama tietokokonaisuus, ja tällä kertaa haluan suodattaa kaikki tietueet, joissa kohde on joko ’Tulostin’ tai ’Projektori’.
Alhaalla oleva koodi tekisi tämän:
Sub FilterRowsOR()Worksheets("Sheet1").Range("A1").AutoFilter Field:=2, Criteria1:="Printer", Operator:=xlOr, Criteria2:="Projector"End Sub
Huomaa, että tässä olen käyttänyt xlOR-operaattoria.
Tämä kertoo VBA:lle, että se käyttää molempia kriteerejä ja suodattaa tiedot, jos jompikumpi kriteereistä täyttyy.
Vaikka voit käyttää myös AND-kriteerejä.
Jos esimerkiksi haluat suodattaa kaikki tietueet, joissa määrä on suurempi kuin 10 mutta pienempi kuin 20, voit käyttää alla olevaa koodia:
Sub FilterRowsAND()Worksheets("Sheet1").Range("A1").AutoFilter Field:=4, Criteria1:=">10", _ Operator:=xlAnd, Criteria2:="<20"End Sub
Esim: Useita kriteerejä eri sarakkeilla
Yksi oletetaan, että sinulla on seuraava tietokokonaisuus.
Autosuodattimella voit suodattaa useita sarakkeita samanaikaisesti.
Jos haluat esimerkiksi suodattaa kaikki tietueet, joissa nimike on ’Tulostin’ ja myyntiedustaja on ’Mark’, voit käyttää alla olevaa koodia:
Sub FilterRows()With Worksheets("Sheet1").Range("A1").AutoFilter field:=2, Criteria1:="Printer".AutoFilter field:=3, Criteria1:="Mark"End WithEnd Sub
Esimerkki: Suodata 10 parasta tietuetta käyttämällä AutoFilter-menetelmää
Asettele, että sinulla on alla oleva tietokokonaisuus.
Alhaalla on koodi, joka antaa sinulle 10 parasta tietuetta (määrä-sarakkeen perusteella):
Sub FilterRowsTop10()ActiveSheet.Range("A1").AutoFilter Field:=4, Criteria1:="10", Operator:=xlTop10ItemsEnd Sub
Yllä olevassa koodissa olen käyttänyt ActiveSheet. Voit halutessasi käyttää arkin nimeä.
Huomaa, että tässä esimerkissä, jos haluat saada 5 parasta nimikettä, vaihda vain Criteria1:=”10″-kohdassa oleva luku 10:stä 5:een.
Siten 5 parasta nimikettä varten koodi olisi:
Sub FilterRowsTop5()ActiveSheet.Range("A1").AutoFilter Field:=4, Criteria1:="5", Operator:=xlTop10ItemsEnd Sub
Mahdollisesti näyttää oudolta, mutta riippumatta siitä, kuinka monta parasta nimikettä haluat, operaattorin arvo pysyy aina xlTop10Items.
Vastaavasti alla oleva koodi antaisi sinulle 10 alinta kohdetta:
Sub FilterRowsBottom10()ActiveSheet.Range("A1").AutoFilter Field:=4, Criteria1:="10", Operator:=xlBottom10ItemsEnd Sub
Ja jos haluat 5 alinta kohdetta, vaihda Criteria1:=”10″-kohdassa oleva luku 10:stä 5:een.
Esimerkki: Suodata ylimmät 10 prosenttia käyttäen AutoFilter-menetelmää
Esitetään, että sinulla on sama tietokokonaisuus (jota käytettiin edellisissä esimerkeissä).
Alhaalla on koodi, joka antaa sinulle ylimmät 10 prosenttia tietueista (määrä-sarakkeen perusteella):
Sub FilterRowsTop10()ActiveSheet.Range("A1").AutoFilter Field:=4, Criteria1:="10", Operator:=xlTop10PercentEnd Sub
Meidän tietokokonaisuudessamme, koska meillä on 20 tietuetta, se palauttaa 2 ylimmät tietuetta (mikä on 10 % kaikista tietueista).
Esimerkki: Jokerimerkkien käyttäminen automaattisessa suodattimessa
Asettele, että sinulla on alla olevan kaltainen tietokokonaisuus:
Jos haluat suodattaa kaikki rivit, joissa kohteen nimi sisältää sanan ’Board’, voit käyttää alla olevaa koodia:
Sub FilterRowsWildcard()Worksheets("Sheet1").Range("A1").AutoFilter Field:=2, Criteria1:="*Board*"End Sub
Yllä olevassa koodissa olen käyttänyt jokerimerkkiä * (asterisk) ennen sanaa ’Board’ (joka on kriteeri) ja sanan ’Board’ (joka on kriteeri) jälkeen.
Tähti voi edustaa mitä tahansa merkkiä. Tämä suodattaisi siis kaikki kohteet, joissa on sana ’board’.
Esimerkki: Suodatettujen rivien kopioiminen uuteen arkistoon
Jos haluat paitsi suodattaa tietueet kriteerien perusteella myös kopioida suodatetut rivit, voit käyttää alla olevaa makroa.
Se kopioi suodatetut rivit, lisää uuden laskentataulukon ja liittää sitten nämä kopioidut rivit uuteen arkistoon.
Sub CopyFilteredRows()Dim rng As RangeDim ws As WorksheetIf Worksheets("Sheet1").AutoFilterMode = False ThenMsgBox "There are no filtered rows"Exit SubEnd IfSet rng = Worksheets("Sheet1").AutoFilter.RangeSet ws = Worksheets.Addrng.Copy Range("A1")End Sub
Yllä oleva koodi tarkistaa, onko Sheet1:ssä suodatettuja rivejä vai ei.
Jos suodatettuja rivejä ei ole, se näyttää viestiruudun, jossa se ilmoitetaan.
Jos suodatettuja rivejä on, se kopioi ne, lisää uuden laskentataulukon ja liittää nämä rivit tuohon hiljattain lisättyyn laskentataulukkoon.
Esimerkki: Suodata tietoja solun arvon perusteella
Käyttämällä VBA:n automaattista suodatusta yhdessä pudotusluettelon kanssa voit luoda toiminnallisuuden, jossa heti kun valitset kohteen pudotusluettelosta, kaikki kyseisen kohteen tietueet suodatetaan.
Jotain alla olevan kaltaista:
Klikkaa tästä ladataksesi esimerkkitiedoston ja seurataksesi mukana.
Tämmöinen konstruktio voi olla hyödyllinen, kun haluat nopeasti suodattaa tietoja ja käyttää niitä sitten edelleen työssäsi.
Alhaalla on koodi, joka tekee tämän:
Private Sub Worksheet_Change(ByVal Target As Range)If Target.Address = "$B" Then If Range("B2") = "All" Then Range("A5").AutoFilter Else Range("A5").AutoFilter Field:=2, Criteria1:=Range("B2") End IfEnd IfEnd Sub
Tämä on laskentataulukon tapahtumakoodi, joka suoritetaan vain silloin, kun laskentataulukossa tapahtuu muutos ja kohdesolu on B2 (jossa meillä on pudotusvalikko).
Myös If Then Else -ehtoa käytetään tarkistamaan, onko käyttäjä valinnut pudotusvalikosta ’Kaikki’. Jos Kaikki on valittu, näytetään koko tietokokonaisuus.
Tätä koodia EI sijoiteta moduuliin.
Sen sijaan se on sijoitettava sen laskentataulukon takaosaan, jossa nämä tiedot ovat.
Tässä ovat vaiheet tämän koodin sijoittamiseksi työarkin koodiikkunaan:
- Avaa VB-editori (pikanäppäinyhdistelmä – ALT + F11).
- Kaksoisnapsauta projektinhallintaikkunassa sen työarkin nimeä, johon haluat tämän suodatustoiminnon.
- Kopioi ja liitä yllä oleva koodi työarkin koodiikkunaan.
- Sulje VB-editori.
Nyt kun käytät pudotusluetteloa, se suodattaa tiedot automaattisesti.
Tämä on laskentataulukon tapahtumakoodi, joka suoritetaan vain silloin, kun laskentataulukossa tapahtuu muutos ja kohdesolu on B2 (jossa meillä on pudotusluettelo).
Myös If Then Else -ehtoa käytetään tarkistamaan, onko käyttäjä valinnut pudotusluettelosta ’Kaikki’. Jos Kaikki on valittu, näytetään koko tietokokonaisuus.
Excelin automaattisen suodattimen kytkeminen päälle/pois päältä VBA:n avulla
Kun sovellat automaattista suodatinta solualueeseen, joitakin suodattimia voi olla jo käytössä.
Voit käyttää alla olevaa koodia, jolla voit kytkeä pois päältä kaikki valmiiksi käytetyt automaattiset suodattimet:
Sub TurnOFFAutoFilter() Worksheets("Sheet1").AutoFilterMode = FalseEnd Sub
Tämä koodi tarkastaa koko arkit ja poistaa kaikki käytetyt suodattimet.
Jos et halua kytkeä suodattimia pois päältä koko arkilta vaan vain tietystä tietokokonaisuudesta, käytä alla olevaa koodia:
Sub TurnOFFAutoFilter() If Worksheets("Sheet1").Range("A1").AutoFilter Then Worksheets("Sheet1").Range("A1").AutoFilter End IfEnd Sub
Yllä oleva koodi tarkistaa, onko suodattimia jo käytössä vai ei.
Jos suodattimia on jo käytössä, se poistaa ne, muuten se ei tee mitään.
Jos haluat ottaa AutoFilterin käyttöön, käytä alla olevaa koodia:
Sub TurnOnAutoFilter() If Not Worksheets("Sheet1").Range("A4").AutoFilter Then Worksheets("Sheet1").Range("A4").AutoFilter End IfEnd Sub
Tarkista, onko AutoFilter jo käytössä
Jos sinulla on arkki, jossa on useita tietokokonaisuuksia, ja haluat varmistaa, ettei suodattimia ole jo käytössä, voit käyttää alla olevaa koodia.
Sub CheckforFilters()If ActiveSheet.AutoFilterMode = True ThenMsgBox "There are Filters already in place"ElseMsgBox "There are no filters"End IfEnd Sub
Tämä koodi käyttää viestiruutufunktiota, joka näyttää viestin ”Suodattimia on jo käytössä”, jos se löytää suodattimia arkilta, muuten se näyttää ”Suodattimia ei ole”.
Näytä kaikki tiedot
Jos tietokokonaisuuteen on sovellettu suodattimia ja haluat näyttää kaikki tiedot, käytä alla olevaa koodia:
Sub ShowAllData()If ActiveSheet.FilterMode Then ActiveSheet.ShowAllDataEnd Sub
Yllä oleva koodi tarkistaa, onko FilterMode TRUE vai FALSE.
Jos se on true, se tarkoittaa, että suodatinta on sovellettu, ja se käyttää ShowAllData-metodia kaikkien tietojen näyttämiseen.
Huomaa, että tämä ei poista suodattimia. Suodatinkuvakkeet ovat edelleen käytettävissä.
Automaattisen suodattimen käyttäminen suojatuilla arkeilla
Oletusarvoisesti, kun suojaat arkin, suodattimet eivät toimi.
Jos sinulla on jo suodattimet käytössä, voit ottaa automaattisen suodattimen käyttöön, jotta se toimii myös suojatuilla arkeilla.
Tehdäksesi tämän, merkitse Käytä automaattista suodatinta -valinta Käytä automaattista suodatinta -vaihtoehto, kun suojaat arkin.
Tämä toimii silloin, kun suodattimet ovat jo käytössä, mutta jos yrität lisätä Autofilttereitä VBA-koodilla, se ei toimi.
Sen vuoksi, että arkki on suojattu, mikään makro ei saisi suorittaa ja tehdä muutoksia Autofilteriin.
Siten sinun on käytettävä koodia työarkin suojaamiseen ja varmistettava, että automaattiset suodattimet ovat siinä käytössä.
Tämä voi olla hyödyllistä, kun olet luonut dynaamisen suodattimen (jotain, mitä käsittelin esimerkissä – ’Suodata tietoja solun arvon perusteella’).
Alhaalla on koodi, joka suojaa arkin, mutta antaa samalla mahdollisuuden käyttää siinä suodattimia sekä VBA-makroja.
Private Sub Workbook_Open()With Worksheets("Sheet1").EnableAutoFilter = True.Protect Password:="password", Contents:=True, UserInterfaceOnly:=TrueEnd WithEnd Sub
Tämä koodi on sijoitettava ThisWorkbook-koodiikkunaan.
Koodin sijoittaminen ThisWorkbook-koodiikkunaan tapahtuu seuraavasti:
- Avaa VB-editori (pikanäppäinyhdistelmä – ALT + F11).
- Kaksoisnapsauta Project Explorer -ikkunassa ThisWorkbook-objektia.
- Kopioi ja liitä avautuvaan koodiikkunaan yllä oleva koodi.
Heti kun avaat työkirjan ja otat makrot käyttöön, se suorittaa makron automaattisesti ja suojaa Sheet1.
Mutta ennen sitä se määrittää ’EnableAutoFilter = True’, mikä tarkoittaa, että suodattimet toimisivat myös suojatulla arkilla.
Se asettaa myös ’UserInterfaceOnly’-argumentin arvoksi ’True’. Tämä tarkoittaa, että vaikka työarkki on suojattu, VBA-makrojen koodi toimisi edelleen.
Voit pitää myös seuraavista VBA-oppaista:
- Excel VBA-silmukat.
- Suodata soluja lihavoidulla fontin muotoilulla.
- Makron tallentaminen.
- Lajittele tietoja VBA:n avulla.
- Lajittele työarkin välilehtiä Excelissä.