Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Sortering og filtrering av data | Automatisering av tabeller og rapporter
Excel VBA for Forretningsautomatisering

Sortering og filtrering av data

Sveip for å vise menyen

Filtrering begrenser hva som er synlig uten å endre de underliggende dataene — viktig for å lage en rapport som kun viser én måned eller én region om gangen.

Figur 4.2

Grunnleggende AutoFilter

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

AutoFilter sletter eller flytter ikke noen data — den skjuler radene som ikke samsvarer, akkurat som om du hadde klikket på nedtrekksmenyen og fjernet alt unntatt January manuelt. Field:=1 teller kolonner fra 1 innenfor selve tabellen (Month, Region, Sales, Expenses, Profit, Target — så Region blir Field:=2, Profit Field:=5), derfor må denne linjen holdes oppdatert hvis kolonnene noen gang blir omorganisert.

Filtrering med flere betingelser

Filtrering på mer enn én verdi i samme kolonne krever xlFilterValues og et array med kriterier:

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

Sammenlign dette med filteret for én verdi over: Criteria1 inneholder nå et Array(...) med aksepterte verdier i stedet for én enkel streng, og Operator:=xlFilterValues forteller AutoFilter at arrayet skal behandles som en liste med treff i stedet for å tolkes som ett enkelt kriterieuttrykk. Hvis du utelater Operator:=xlFilterValues, vil denne linjen enten gi feil eller oppføre seg uventet — det er lett å glemme og verdt å dobbeltsjekke hver gang Criteria1 er en liste.

Filtrering på en numerisk betingelse — for eksempel kun rader hvor Profit overstiger Target med god margin — bruker sammenligningsoperatorer i stedet:

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

Merk at ">15000" er skrevet som tekst i anførselstegn selv om det er en numerisk sammenligning — AutoFilter forventer alltid Criteria1 som en streng, og tolker selv det innledende >. Skriver du Criteria1:=15000 uten >, vil det filtrere for rader som er nøyaktig lik 15000 i stedet for større enn, noe som er en vanlig og lett feil.

Sortering

Sort-objektet støtter flere nøkler, akkurat som Data → Sorter-dialogen:

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 kjøres først slik at gjenværende sorteringsnøkler fra et tidligere makrokjøring (eller fra at en bruker har sortert tabellen manuelt tidligere) ikke kombineres stille med de nye — rydd alltid før du legger til. Rekkefølgen de to .Add2-kallene vises i, er like viktig som deres Order:=xlAscending/xlDescending-innstillinger: den første som legges til blir primær sorteringsnøkkel (Month), og den andre blir avgjørende innen hver gruppe (Profit, høyest først innen hver måned). .Header = xlYes forteller Excel at rad 1 er en overskrift og aldri skal flyttes av sorteringen; .Apply er det som faktisk utfører sorteringen — alt før bygger bare opp instruksjonene.

Fjerne filtre

Fjern alltid filtre i starten av en rapportmakro, slik at hver kjøring starter fra en kjent, ufiltrert tilstand:

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

FilterMode er en boolsk verdi som er True når et filter for øyeblikket begrenser tabellens synlige rader — å sjekke dette først unngår kjøretidsfeil, siden kall til ShowAllData når ingenting faktisk er filtrert gir en feil i stedet for å gjøre ingenting.

Oppgave

  1. Skriv en makro som filtrerer tblReports til kun februar, ved å bruke AutoFilter Field:=1.
  2. Utvid den til å filtrere Region (Field:=2) til kun "East" og "West" samtidig, ved å bruke xlFilterValues.
  3. Fjern begge filtrene, og sorter deretter tabellen etter Region stigende, deretter etter Profit synkende, ved å bruke Sort-objektet vist ovenfor.
Tips
expand arrow

1. Filtrering til februar

  • Field:=1 refererer til den første kolonnen i tabellen, ikke regnearket — Month er kolonne 1 i tblReports, uavhengig av hvilken regnearkskolonne den faktisk ligger i.
  • Criteria1 bruker den eksakte teksten du filtrerer på, i anførselstegn.
  • Du kaller AutoFiltertbl.Range, ikke direkte på regnearket.

2. Legge til filter for Region

  • Region er den andre kolonnen i tabellen, så det er et annet Field:=-nummer enn Month-filteret.
  • For å filtrere til to verdier i samme kolonne må du bruke Criteria1:=Array(...) med begge verdiene inni, samt Operator:=xlFilterValues — å utelate denne operatoren er den vanligste feilen her.
  • Begge filtrene (Month og Region) kan være aktive samtidig — bare kall AutoFilter to ganger, én gang per kolonne.

3. Fjerne filtre og sortere

  • Sjekk tbl.AutoFilter.FilterMode før du kaller ShowAllData — å kalle denne når ingenting er filtrert gir en feil.
  • Sort-objektet trenger .SortFields.Clear først, deretter én .SortFields.Add2 per sorteringsnivå — rekkefølgen du legger dem til i avgjør hva som er primærnøkkel og hva som er sekundær, ikke rekkefølgen de vises i tabellen.
  • Region stigende skal legges til før Profit synkende, siden Region skal være primær sortering.
Løsning
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

Kjør FilterFebruaryEastWest og du skal kun se februar-rader for East og West regionene synlige. Deretter kjører du ClearFiltersAndSort — alle rader vises igjen, sortert først etter Region (alfabetisk), og innenfor hver Region vises høyeste Profit først.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 4. Kapittel 2
some-alt