Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Sortering och filtrering av data | Automatisering av Tabeller och Rapporter
Excel VBA för affärsautomatisering

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.

Figur 4.2

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

  1. Skriv en makro som filtrerar tblReports till endast februari, med hjälp av AutoFilter Field:=1.
  2. Utöka den för att filtrera Region (Field:=2) till endast "East" och "West" samtidigt, med hjälp av xlFilterValues.
  3. 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.
Tips
expand arrow

1. Filtrering till februari

  • Field:=1 syftar på den första kolumnen i tabellen, inte i kalkylbladet — Month är kolumn 1 i tblReports, oavsett vilken kalkylbladskolumn den faktiskt ligger i.
  • Criteria1 kräver exakt den text du filtrerar på, inom citattecken.
  • Du anropar AutoFiltertbl.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, samt Operator:=xlFilterValues — att utelämna denna operator är det vanligaste misstaget här.
  • Båda filtren (Month och Region) kan vara aktiva samtidigt — anropa bara AutoFilter två gånger, en gång per kolumn.

3. Rensa filter och sortera

  • Kontrollera tbl.AutoFilter.FilterMode innan du anropar ShowAllData — om du anropar det när inget är filtrerat uppstår ett fel.
  • Sort-objektet kräver .SortFields.Clear först, sedan en .SortFields.Add2 per 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.
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

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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 4. Kapitel 2
some-alt