Als je goed inzicht wilt verkrijgen in een ruwe dataset dan zijn er 2 hulpmiddelen die onmisbaar zijn, namelijk filteren en sorteren. Je kunt dit soort acties uitvoeren en tegelijkertijd opnemen met de macro recorder , maar de code die dan verschijnt is vaak onnodig lang. In dit artikel leer ik hoe je de code voor het sorteren netjes zelf kunt uitwerken, zodat je code korter en leesbaar blijft.
Sorteercode met behulp van de macro recorder
Laten wij eenvoudig beginnen door een rij met zeven willekeurige cijfers in een enkele kolom (kolom B bijvoorbeeld) te plaatsen. Stel wij willen deze cijfers sorteren in een macro door ze van laag naar hoog te laten oplopen. Als we deze actie nu zouden opnemen met een macro recorder dan zou de code er als volgt uitzien.
Sub Macro1()
'
' Macro1 Macro
'
'
Range("B2:B8").Select
ActiveWorkbook.Worksheets("filterTab").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("filterTab").Sort.SortFields.Add2 Key:=Range( _
"B2:B8"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("filterTab").Sort
.SetRange Range("B2:B8")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Sorteercode zelf geschreven met VBA
Net als bij het filteren staan er veel elementen in de opname die bij een simpele actie als deze geen toevoeging hebben aan het resultaat. Je zult verbaasd zijn hoe weinig code je nodig hebt om hetzelfde resultaat te bereiken.
Sub SorteerOefening1()
ThisWorkbook.Sheets("Blad1").Range("B2:B8").Sort Key1:=Range("B2"), Order1:=xlAscending
End Sub
Ja, je ziet het goed. Slechts één enkele regel code heb je nodig om een dataset te sorteren in een macro. Indien je dataset groter wordt of je wilt meerdere sorteersleutels toevoegen dan word je code daar niet veel complexer door. Een extra sorteersleutel voeg je toe door een ‘Key2’ plus bijbehorende range toe te voegen aan de onderstaande code. Met een ‘Order2’ geef je dan weer aan hoe je deze 2e sorteersleutel wilt laten sorteren. Stel je data bevat tekst in kolom C die je op alfabetische volgorde wilt sorteren. Dat schrijf je dan als volgt.
ThisWorkbook.Sheets("Blad1").Range("B2:C8").Sort Key1:=Range("B2"), Key2:=Range("C2"), Order1:=xlAscending, Order2:=xlAscending
Mocht je data overigens een header regel bevatten die onderdeel is van je range, maar die je niet gesorteerd wilt zien dan kun je dit simpel verwerken in dezelfde regel code door Header:=XlYes te plaatsen.
ThisWorkbook.Sheets("Blad1").Range("B2:C8").Sort Key1:=Range("B2"), Key2:=Range("C2"), Order1:=xlDescending, Order2:=xlDescending, Header:=xlYes
De sorteermethode bestaat dus simpel gezegd maar uit 3 onderdelen:
- Key (sorteersleutel)
- Order (hoe je de volgorde bepaalt)
- Header (Is er een header in je dataset?)
In de voorgaande voorbeelden hebben we tot nu toe alleen de ‘Order’ ‘xlAscending’ gebruikt. Dit betekent van laag naar hoog of als het tekst betreft op alfabetische volgorde. Indien het andersom gesorteerd dient te worden kun je daar ‘xlDescending’ van maken.
Mocht je na het lezen van dit artikel toch nog vragen hebben met betrekking tot het sorteren van data in een macro. Laat het weten in de reacties!
Pingback:Filteren in een macro - Macro Excel Advies
Pingback:Ranges in VBA -