Sortering och filtrering av data
Svep för att visa menyn
Filtrering begränsar vad som är synligt utan att påverka den underliggande datan — avgörande för att skapa en rapport som bara visar en månad eller en region åt gången.
Grundläggande AutoFilter
tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)
AutoFilter tar inte bort eller flyttar någon data — den döljer rader som inte matchar, precis som om du hade klickat på rullgardinspilen och avmarkerat allt utom January manuellt. Field:=1 räknar kolumner med början från 1 inom själva tabellen (Month, Region, Sales, Expenses, Profit, Target — så Region blir Field:=2, Profit Field:=5), vilket är anledningen till att denna rad måste hållas synkroniserad om kolumnerna någonsin omordnas.
Filter med flera villkor
Filtrering på mer än ett värde i samma kolumn kräver xlFilterValues och en array av kriterier:
tbl.Range.AutoFilter Field:=2, _
Criteria1:=Array("North", "Central"), _
Operator:=xlFilterValues
Jämför detta med enkelvärdesfiltret ovan: Criteria1 innehåller nu en Array(...) av godkända värden istället för en vanlig sträng, och Operator:=xlFilterValues är det som talar om för AutoFilter att behandla arrayen som en lista med träffar istället för att försöka tolka den som ett enda kriterieuttryck. Utelämna Operator:=xlFilterValues och denna rad ger antingen fel eller beter sig oväntat — det är lätt att glömma och värt att dubbelkolla när Criteria1 är en lista.
Filtrering på ett numeriskt villkor — till exempel, endast rader där Profit överstiger Target med en god marginal — använder istället jämförelseoperatorer:
tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"
Observera att ">15000" skrivs som text inom citattecken även om det är en numerisk jämförelse — AutoFilter förväntar sig alltid Criteria1 som en sträng och tolkar själv det inledande >. Om du skriver Criteria1:=15000 utan > filtreras rader som är exakt lika med 15000 istället för större än det, vilket är ett vanligt och lätt misstag.
Sortering
Sort-objektet stöder flera nycklar, precis som dialogrutan Data → Sortera:
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 körs först så att kvarvarande sorteringsnycklar från ett tidigare makrokörning (eller från att en användare manuellt sorterat tabellen tidigare) inte tyst kombineras med de nya — rensa alltid innan du lägger till. Ordningen på de två .Add2-anropen är lika viktig som deras Order:=xlAscending/xlDescending-inställningar: den första som läggs till blir primär sorteringsnyckel (Month), och den andra blir avgörande inom varje grupp (Profit, högst först inom varje månad). .Header = xlYes talar om för Excel att rad 1 är en rubrik och aldrig ska flyttas vid sortering; .Apply är det som faktiskt utför sorteringen — allt innan bygger bara upp instruktionerna.
Rensa filter
Rensa alltid filter i början av ett rapportmakro, så att varje körning startar från ett känt, ofiltrerat läge:
If tbl.AutoFilter.FilterMode Then
tbl.AutoFilter.ShowAllData
End If
FilterMode är en boolesk variabel som är True när något filter för närvarande begränsar tabellens synliga rader — att kontrollera detta först undviker ett körtidsfel, eftersom ett anrop till ShowAllData när inget faktiskt är filtrerat ger ett fel istället för att tyst göra ingenting.
Uppgift
- Skriv en makro som filtrerar tblReports till endast februari, med hjälp av
AutoFilter Field:=1. - Utöka den för att filtrera Region (Field:=2) till endast "East" och "West" samtidigt, med hjälp av
xlFilterValues. - Rensa båda filtren, sortera sedan tabellen efter Region stigande och därefter efter Profit fallande, med hjälp av Sort-objektet som visas ovan.
1. Filtrering till februari
Field:=1syftar på den första kolumnen i tabellen, inte i kalkylbladet — Month är kolumn 1 itblReports, oavsett vilken kalkylbladskolumn den faktiskt ligger i.Criteria1kräver exakt den text du filtrerar på, inom citattecken.- Du anropar
AutoFilterpåtbl.Range, inte direkt på kalkylbladet.
2. Lägga till regionsfilter
- Region är den andra kolumnen i tabellen, så det är ett annat
Field:=-nummer än för Month-filtret. - För att filtrera på två värden i samma kolumn används
Criteria1:=Array(...)med båda värdena inuti, samtOperator:=xlFilterValues— att utelämna denna operator är det vanligaste misstaget här. - Båda filtren (Month och Region) kan vara aktiva samtidigt — anropa bara
AutoFiltertvå gånger, en gång per kolumn.
3. Rensa filter och sortera
- Kontrollera
tbl.AutoFilter.FilterModeinnan du anroparShowAllData— om du anropar det när inget är filtrerat uppstår ett fel. Sort-objektet kräver.SortFields.Clearförst, sedan en.SortFields.Add2per sorteringsnivå — ordningen du lägger till dem i avgör vilken som är primär nyckel och vilken som är sekundär, inte ordningen de visas i tabellen.- Region stigande ska läggas till före Profit fallande, eftersom Region ska vara 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
Kör FilterFebruaryEastWest och du ska endast se rader för februari för regionerna East och West synliga. Kör sedan ClearFiltersAndSort — alla rader visas igen, sorterade först på Region (alfabetiskt), och inom varje Region visas högsta Profit först.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal