Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Gegevens Sorteren en Filteren | Tabellen en Rapporten Automatiseren
Excel VBA voor Bedrijfsautomatisering

Gegevens Sorteren en Filteren

Veeg om het menu te tonen

Filteren beperkt wat zichtbaar is zonder de onderliggende gegevens aan te passen — essentieel voor het maken van een rapport dat slechts één maand of één regio tegelijk toont.

Figuur 4.2

Basis AutoFilter

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter verwijdert of verplaatst geen gegevens — het verbergt de rijen die niet overeenkomen, precies alsof je handmatig op de vervolgkeuzepijl had geklikt en alles behalve January had uitgevinkt. Field:=1 telt kolommen vanaf 1 binnen de Table zelf (Month, Region, Sales, Expenses, Profit, Target — dus Region is Field:=2, Profit Field:=5), daarom moet deze regel worden aangepast als de kolommen ooit worden herschikt.

Filters met meerdere voorwaarden

Filteren op meer dan één waarde in dezelfde kolom vereist xlFilterValues en een array met criteria:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Vergelijk dit met het filteren op één waarde hierboven: Criteria1 bevat nu een Array(...) met toegestane waarden in plaats van één enkele string, en Operator:=xlFilterValues geeft aan AutoFilter door dat deze array als een lijst met overeenkomsten moet worden behandeld in plaats van als één enkele criteria-expressie. Laat je Operator:=xlFilterValues weg, dan geeft deze regel een foutmelding of werkt onverwacht — het is makkelijk te vergeten en het loont om dit altijd te controleren wanneer Criteria1 een lijst is.

Filteren op een numerieke voorwaarde — bijvoorbeeld alleen rijen waar Profit de Target met een ruime marge overschrijdt — gebruikt in plaats daarvan vergelijkingsoperatoren:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Let op: ">15000" is geschreven als tekst tussen aanhalingstekens, ook al is het een numerieke vergelijking — AutoFilter verwacht Criteria1 altijd als een string en verwerkt het leidende > zelf. Criteria1:=15000 zonder het > zou filteren op rijen die exact gelijk zijn aan 15000 in plaats van groter dan 15000, wat een veelgemaakte fout is.

Sorteren

Het Sort-object ondersteunt meerdere sleutels, precies zoals het dialoogvenster Data → Sort:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear wordt als eerste uitgevoerd zodat overgebleven sorteersleutels van een vorige macro-run (of van een gebruiker die eerder handmatig de Table sorteerde) niet ongemerkt worden gecombineerd met de nieuwe — altijd wissen voordat je toevoegt. De volgorde waarin de twee .Add2-aanroepen verschijnen is net zo belangrijk als hun Order:=xlAscending/xlDescending instellingen: de eerste die wordt toegevoegd, wordt de primaire sorteersleutel (Month), en de tweede wordt de beslissende factor binnen elke groep (Profit, hoogste eerst binnen elke maand). .Header = xlYes geeft aan Excel aan dat rij 1 een kop is en nooit door de sortering mag worden verplaatst; .Apply voert daadwerkelijk de sortering uit — alles ervoor bouwt alleen de instructies op.

Filters wissen

Wis altijd filters aan het begin van een rapportmacro, zodat elke uitvoering begint vanuit een bekende, niet-gefilterde toestand:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode is een Boolean die True is wanneer een filter momenteel de zichtbare rijen van de Table beperkt — dit eerst controleren voorkomt een runtime-fout, omdat het aanroepen van ShowAllData wanneer er niets gefilterd is een foutmelding geeft in plaats van stilletjes niets te doen.

Taak

  1. Schrijf een macro die tblReports filtert op alleen februari, met gebruik van AutoFilter Field:=1.
  2. Breid deze uit om Regio (Field:=2) te filteren op alleen "East" en "West" tegelijk, met gebruik van xlFilterValues.
  3. Wis beide filters, sorteer vervolgens de tabel eerst op Regio oplopend en daarna op Winst aflopend, met gebruik van het hierboven getoonde Sort-object.
Hint
expand arrow

1. Filteren op februari

  • Field:=1 verwijst naar de eerste kolom van de Tabel, niet van het werkblad — Maand is kolom 1 binnen tblReports, ongeacht in welke werkbladkolom deze fysiek staat.
  • Criteria1 neemt de exacte tekst waarop je filtert, tussen aanhalingstekens.
  • Je roept AutoFilter aan op tbl.Range, niet direct op het werkblad.

2. De Regio-filter toevoegen

  • Regio is de tweede kolom van de tabel, dus dat is een ander Field:= nummer dan de Maand-filter.
  • Filteren op twee waarden in dezelfde kolom vereist Criteria1:=Array(...) met beide waarden erin, plus Operator:=xlFilterValues — het weglaten van deze operator is de meest voorkomende fout hier.
  • Beide filters (Maand en Regio) kunnen tegelijk actief zijn — roep AutoFilter twee keer aan, één keer per kolom.

3. Filters wissen en sorteren

  • Controleer tbl.AutoFilter.FilterMode voordat je ShowAllData aanroept — als je deze aanroept wanneer er niets gefilterd is, krijg je een foutmelding.
  • Het Sort-object vereist eerst .SortFields.Clear, daarna één .SortFields.Add2 per sorteerniveau — de volgorde waarin je ze toevoegt bepaalt welke de primaire sleutel is en welke de tie-breaker, niet de volgorde waarin ze in de tabel staan.
  • Regio oplopend moet vóór Winst aflopend worden toegevoegd, omdat Regio de primaire sortering moet zijn.
Oplossing
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Voer FilterFebruaryEastWest uit en je ziet alleen de rijen van februari voor de regio's East en West. Voer daarna ClearFiltersAndSort uit — alle rijen verschijnen weer, gesorteerd eerst op Regio (alfabetisch), en binnen elke Regio verschijnt de hoogste Winst bovenaan.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Gegevens Sorteren en Filteren

Filteren beperkt wat zichtbaar is zonder de onderliggende gegevens aan te passen — essentieel voor het maken van een rapport dat slechts één maand of één regio tegelijk toont.

Figuur 4.2

Basis AutoFilter

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter verwijdert of verplaatst geen gegevens — het verbergt de rijen die niet overeenkomen, precies alsof je handmatig op de vervolgkeuzepijl had geklikt en alles behalve January had uitgevinkt. Field:=1 telt kolommen vanaf 1 binnen de Table zelf (Month, Region, Sales, Expenses, Profit, Target — dus Region is Field:=2, Profit Field:=5), daarom moet deze regel worden aangepast als de kolommen ooit worden herschikt.

Filters met meerdere voorwaarden

Filteren op meer dan één waarde in dezelfde kolom vereist xlFilterValues en een array met criteria:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Vergelijk dit met het filteren op één waarde hierboven: Criteria1 bevat nu een Array(...) met toegestane waarden in plaats van één enkele string, en Operator:=xlFilterValues geeft aan AutoFilter door dat deze array als een lijst met overeenkomsten moet worden behandeld in plaats van als één enkele criteria-expressie. Laat je Operator:=xlFilterValues weg, dan geeft deze regel een foutmelding of werkt onverwacht — het is makkelijk te vergeten en het loont om dit altijd te controleren wanneer Criteria1 een lijst is.

Filteren op een numerieke voorwaarde — bijvoorbeeld alleen rijen waar Profit de Target met een ruime marge overschrijdt — gebruikt in plaats daarvan vergelijkingsoperatoren:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Let op: ">15000" is geschreven als tekst tussen aanhalingstekens, ook al is het een numerieke vergelijking — AutoFilter verwacht Criteria1 altijd als een string en verwerkt het leidende > zelf. Criteria1:=15000 zonder het > zou filteren op rijen die exact gelijk zijn aan 15000 in plaats van groter dan 15000, wat een veelgemaakte fout is.

Sorteren

Het Sort-object ondersteunt meerdere sleutels, precies zoals het dialoogvenster Data → Sort:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear wordt als eerste uitgevoerd zodat overgebleven sorteersleutels van een vorige macro-run (of van een gebruiker die eerder handmatig de Table sorteerde) niet ongemerkt worden gecombineerd met de nieuwe — altijd wissen voordat je toevoegt. De volgorde waarin de twee .Add2-aanroepen verschijnen is net zo belangrijk als hun Order:=xlAscending/xlDescending instellingen: de eerste die wordt toegevoegd, wordt de primaire sorteersleutel (Month), en de tweede wordt de beslissende factor binnen elke groep (Profit, hoogste eerst binnen elke maand). .Header = xlYes geeft aan Excel aan dat rij 1 een kop is en nooit door de sortering mag worden verplaatst; .Apply voert daadwerkelijk de sortering uit — alles ervoor bouwt alleen de instructies op.

Filters wissen

Wis altijd filters aan het begin van een rapportmacro, zodat elke uitvoering begint vanuit een bekende, niet-gefilterde toestand:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode is een Boolean die True is wanneer een filter momenteel de zichtbare rijen van de Table beperkt — dit eerst controleren voorkomt een runtime-fout, omdat het aanroepen van ShowAllData wanneer er niets gefilterd is een foutmelding geeft in plaats van stilletjes niets te doen.

Taak

  1. Schrijf een macro die tblReports filtert op alleen februari, met gebruik van AutoFilter Field:=1.
  2. Breid deze uit om Regio (Field:=2) te filteren op alleen "East" en "West" tegelijk, met gebruik van xlFilterValues.
  3. Wis beide filters, sorteer vervolgens de tabel eerst op Regio oplopend en daarna op Winst aflopend, met gebruik van het hierboven getoonde Sort-object.
Hint
expand arrow

1. Filteren op februari

  • Field:=1 verwijst naar de eerste kolom van de Tabel, niet van het werkblad — Maand is kolom 1 binnen tblReports, ongeacht in welke werkbladkolom deze fysiek staat.
  • Criteria1 neemt de exacte tekst waarop je filtert, tussen aanhalingstekens.
  • Je roept AutoFilter aan op tbl.Range, niet direct op het werkblad.

2. De Regio-filter toevoegen

  • Regio is de tweede kolom van de tabel, dus dat is een ander Field:= nummer dan de Maand-filter.
  • Filteren op twee waarden in dezelfde kolom vereist Criteria1:=Array(...) met beide waarden erin, plus Operator:=xlFilterValues — het weglaten van deze operator is de meest voorkomende fout hier.
  • Beide filters (Maand en Regio) kunnen tegelijk actief zijn — roep AutoFilter twee keer aan, één keer per kolom.

3. Filters wissen en sorteren

  • Controleer tbl.AutoFilter.FilterMode voordat je ShowAllData aanroept — als je deze aanroept wanneer er niets gefilterd is, krijg je een foutmelding.
  • Het Sort-object vereist eerst .SortFields.Clear, daarna één .SortFields.Add2 per sorteerniveau — de volgorde waarin je ze toevoegt bepaalt welke de primaire sleutel is en welke de tie-breaker, niet de volgorde waarin ze in de tabel staan.
  • Regio oplopend moet vóór Winst aflopend worden toegevoegd, omdat Regio de primaire sortering moet zijn.
Oplossing
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Voer FilterFebruaryEastWest uit en je ziet alleen de rijen van februari voor de regio's East en West. Voer daarna ClearFiltersAndSort uit — alle rijen verschijnen weer, gesorteerd eerst op Regio (alfabetisch), en binnen elke Regio verschijnt de hoogste Winst bovenaan.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 2
some-alt