Draaitabellen Maken met VBA
Veeg om het menu te tonen
Een draaitabel vat een tabel samen door velden naar Rijen, Kolommen en Waarden te slepen — en elk van deze sleepacties heeft een directe VBA-tegenhanger, wat betekent dat een volledig draaitabelrapport elke keer dat er nieuwe gegevens binnenkomen, volledig opnieuw kan worden opgebouwd door een macro.
Een draaitabel bouwen
Sub BuildProfitPivot()
Dim wsData As Worksheet, wsPivot As Worksheet
Dim tbl As ListObject
Dim pc As PivotCache
Dim pt As PivotTable
Set wsData = ThisWorkbook.Worksheets("Reports")
Set tbl = wsData.ListObjects("tblReports")
' start clean: remove an existing Pivot sheet if this has run before
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Pivot").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsPivot = ThisWorkbook.Worksheets.Add
wsPivot.Name = "Pivot"
Set pc = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=tbl.Range)
Set pt = pc.CreatePivotTable( _
TableDestination:=wsPivot.Range("A3"), _
TableName:="ptProfitByRegion")
With pt
.PivotFields("Region").Orientation = xlRowField
.PivotFields("Month").Orientation = xlColumnField
.AddDataField .PivotFields("Profit"), "Sum of Profit", xlSum
End With
End Sub
- On Error Resume Next in combinatie met de
DisplayAlerts-schakelaar en.Deleteis een veilige "verwijder als deze bestaat"-methode: het verwijderen van een werkblad dat niet bestaat zou normaal gesproken een fout veroorzaken en de macro stoppen, maar On Error Resume Next zorgt ervoor dat VBA stilletjes doorgaat bij die specifieke fout;DisplayAlerts = Falseonderdrukt Excel's eigen bevestigingspop-up "weet u zeker dat u dit werkblad wilt verwijderen?"; - On
Error GoTo 0direct daarna schakelt de normale foutmelding weer in — alsOn Error Resume Nextactief blijft voor de rest van deSub, worden ook latere, niet-gerelateerde fouten stilletjes genegeerd, wat een valkuil is die je wilt vermijden; ThisWorkbook.PivotCaches.Createmaakt een momentopname van de gegevens van de Tabel — de PivotCache, niet de draaitabel zelf — dit is het object waar elke draaitabel daadwerkelijk op wordt gebaseerd achter de schermen;pc.CreatePivotTablezet die momentopname om in een zichtbare draaitabel, geplaatst vanaf cel A3 op het nieuwe Pivot-werkblad en krijgt de naam ptProfitByRegion zodat latere code (zoals RefreshTable) deze weer kan vinden op naam;PivotFields("Region").Orientation = xlRowFielden de Month-regel direct daaronder zijn het directe code-equivalent van het slepen van Region naar het Rijenvak en Month naar het Kolomvak in de veldlijst;AddDataFieldvult het Waarden-gebied — het tweede argument ("Sum of Profit") is alleen het label dat Excel als kolomkop weergeeft, en xlSum geeft aan dat de waarden moeten worden opgeteld in plaats van gemiddeld of geteld.
Rapporten verversen
Zodra een draaitabel bestaat, wordt deze niet opnieuw opgebouwd telkens als er nieuwe gegevens binnenkomen — je ververst hem, wat sneller is en handmatige lay-outaanpassingen van de gebruiker behoudt:
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
Deze ene regel leest de PivotCache opnieuw uit de huidige staat van tblReports en werkt elk getal in de draaitabel bij — maar laat de lay-out precies zoals die is, inclusief kolombreedtes, getalnotatie of veldindeling die een gebruiker handmatig heeft aangepast nadat de draaitabel voor het eerst is gemaakt. Dat is het belangrijkste voordeel ten opzichte van het opnieuw aanroepen van BuildProfitPivot: opnieuw opbouwen zou het werkblad opnieuw aanmaken en alle handmatige aanpassingen wissen.
Draaitabelgrafieken bijwerken
Een draaitabelgrafiek die is gebaseerd op een draaitabel werkt zijn gegevens automatisch bij wanneer de draaitabel wordt ververst — dus het verversen van de tabel is meestal alles wat een rapportmacro hoeft te doen om een gekoppelde grafiek ook actueel te houden:
Dim pt As PivotTable
Set pt = ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion")
pt.RefreshTable
' any PivotChart based on pt updates automatically — no extra code needed
Dit is het vergelijken waard met de gewone grafieken die in de volgende sectie worden behandeld: een gewone grafiek heeft een expliciete SetSourceData-aanroep nodig om deze naar nieuwe gegevens te laten verwijzen, terwijl een draaitabelgrafiek permanent is gekoppeld aan zijn draaitabel en automatisch meebeweegt. Als een dashboard een grafiek nodig heeft die altijd de nieuwste draaitabelcijfers weergeeft met zo min mogelijk code, is het bouwen als draaitabelgrafiek meestal de betere keuze.
Opdracht
- Voer
BuildProfitPivotexact uit zoals getoond en controleer of er een nieuw "Pivot"-werkblad verschijnt met Region in de rijen en Month in de kolommen. - Voeg handmatig een nieuwe March-rij toe aan
tblReportsvoor een fictieve zesde regio en voer alleen de RefreshTable-regel uit — controleer of de draaitabel wordt bijgewerkt zonder deze opnieuw op te bouwen. - Pas
BuildProfitPivotaan om Sales in plaats van Profit samen te vatten, en verwissel Region en Month zodat Month in de rijen staat en Region in de kolommen.
Hier is de code om een zesde regio toe te voegen als een nieuwe maart-rij in tblReports, met gebruik van ListRows.Add in plaats van deze handmatig in te voeren:
Sub AddSixthRegion()
Dim tbl As ListObject
Dim newRow As ListRow
Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "March" ' Month
newRow.Range(1, 2).Value = "Southwest" ' Region
newRow.Range(1, 3).Value = 41500 ' Sales
newRow.Range(1, 4).Value = 28200 ' Expenses
newRow.Range(1, 5).Value = 13300 ' Profit
newRow.Range(1, 6).Value = 39000 ' Target
End Sub
Voer dit één keer uit en voer daarna de RefreshProfitPivot Sub uit van eerder — de draaitabel zou nu "Southwest" als een nieuwe rij moeten tonen naast North, South, East, West en Central, zonder dat je de macro voor het bouwen van de draaitabel hebt aangepast.
1. BuildProfitPivot uitvoeren zoals het is
- Kopieer de
Subexact zoals geschreven in het hoofdstuk naar je module en voer deze één keer uit. - Controleer de Projectverkenner of je werkbladtabbladen — er zou een nieuw werkblad met de naam "Pivot" moeten verschijnen, met Region in de rijen en Month over de kolommen, waarbij Profit wordt opgeteld.
2. Een zesde regio toevoegen en alleen verversen
- Typ de nieuwe rij direct in het werkblad (niet via code) — ga naar de onderkant van
tblReportsen voeg een maart-rij toe voor een verzonnen regio, bijvoorbeeld "Southwest." - Voer
BuildProfitPivotniet opnieuw uit — dat zou het hele Pivot-werkblad verwijderen en opnieuw opbouwen, wat het doel van deze oefening tenietdoet. - Voer in plaats daarvan alleen de éénregelige
RefreshTable-instructie uit het hoofdstuk uit — je moet verwijzen naar de bestaande draaitabel op naam, op dezelfde manier als het voorbeeld voor verversen in het hoofdstuk.
3. Velden wisselen en de samengevatte waarde wijzigen
- Drie regels binnen het
With pt-blok moeten worden aangepast: welk veldxlRowFieldis, welk veldxlColumnFieldis, en naar welk veldAddDataFieldverwijst. - Geef deze aangepaste versie een andere
Sub-naam en een andereTableName— dezelfde namen als het origineel hergebruiken zou een fout veroorzaken of de eerste draaitabel stilzwijgend overschrijven. - Het label dat wordt meegegeven aan
AddDataField(het tweede argument, zoals"Sum of Profit") is alleen weergavetekst — pas dit aan zodat het overeenkomt met wat je nu samenvat.
Punt 2 — na het handmatig toevoegen van de rij voor de zesde regio, voer alleen dit uit:
Sub RefreshProfitPivot()
ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
End Sub
Punt 3 — een aparte, aangepaste versie:
Sub BuildSalesPivotByMonth()
Dim wsData As Worksheet, wsPivot As Worksheet
Dim tbl As ListObject
Dim pc As PivotCache
Dim pt As PivotTable
Set wsData = ThisWorkbook.Worksheets("Reports")
Set tbl = wsData.ListObjects("tblReports")
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("SalesPivot").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Set wsPivot = ThisWorkbook.Worksheets.Add
wsPivot.Name = "SalesPivot"
Set pc = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=tbl.Range)
Set pt = pc.CreatePivotTable( _
TableDestination:=wsPivot.Range("A3"), _
TableName:="ptSalesByMonth")
With pt
.PivotFields("Month").Orientation = xlRowField
.PivotFields("Region").Orientation = xlColumnField
.AddDataField .PivotFields("Sales"), "Sum of Sales", xlSum
End With
End Sub
Voer BuildSalesPivotByMonth uit en je krijgt een nieuw werkblad "SalesPivot" met Month in de rijen, Region over de kolommen en Sales-totalen in het midden — het spiegelbeeld van de oorspronkelijke indeling.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.