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.
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
- Skriv en makro som filtrerer tblReports til kun februar, ved å bruke
AutoFilter Field:=1. - Utvid den til å filtrere Region (Field:=2) til kun "East" og "West" samtidig, ved å bruke
xlFilterValues. - Fjern begge filtrene, og sorter deretter tabellen etter Region stigende, deretter etter Profit synkende, ved å bruke Sort-objektet vist ovenfor.
1. Filtrering til februar
Field:=1refererer til den første kolonnen i tabellen, ikke regnearket — Month er kolonne 1 itblReports, uavhengig av hvilken regnearkskolonne den faktisk ligger i.Criteria1bruker den eksakte teksten du filtrerer på, i anførselstegn.- Du kaller
AutoFilterpåtbl.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, samtOperator:=xlFilterValues— å utelate denne operatoren er den vanligste feilen her. - Begge filtrene (Month og Region) kan være aktive samtidig — bare kall
AutoFilterto ganger, én gang per kolonne.
3. Fjerne filtre og sortere
- Sjekk
tbl.AutoFilter.FilterModefør du kallerShowAllData— å kalle denne når ingenting er filtrert gir en feil. Sort-objektet trenger.SortFields.Clearførst, deretter én.SortFields.Add2per 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.
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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår