Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Draaitabellen Maken met VBA | Tabellen en Rapporten Automatiseren
Excel VBA voor Bedrijfsautomatisering

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.

Figuur 4.3

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
Regel voor regel uitgelegd
expand arrow
  • On Error Resume Next in combinatie met de DisplayAlerts-schakelaar en .Delete is 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 = False onderdrukt Excel's eigen bevestigingspop-up "weet u zeker dat u dit werkblad wilt verwijderen?";
  • On Error GoTo 0 direct daarna schakelt de normale foutmelding weer in — als On Error Resume Next actief blijft voor de rest van de Sub, worden ook latere, niet-gerelateerde fouten stilletjes genegeerd, wat een valkuil is die je wilt vermijden;
  • ThisWorkbook.PivotCaches.Create maakt 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.CreatePivotTable zet 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 = xlRowField en 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;
  • AddDataField vult 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

  1. Voer BuildProfitPivot exact uit zoals getoond en controleer of er een nieuw "Pivot"-werkblad verschijnt met Region in de rijen en Month in de kolommen.
  2. Voeg handmatig een nieuwe March-rij toe aan tblReports voor een fictieve zesde regio en voer alleen de RefreshTable-regel uit — controleer of de draaitabel wordt bijgewerkt zonder deze opnieuw op te bouwen.
  3. Pas BuildProfitPivot aan 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.
Hulpmiddel
expand arrow

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.

Hint
expand arrow

1. BuildProfitPivot uitvoeren zoals het is

  • Kopieer de Sub exact 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 tblReports en voeg een maart-rij toe voor een verzonnen regio, bijvoorbeeld "Southwest."
  • Voer BuildProfitPivot niet 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 veld xlRowField is, welk veld xlColumnField is, en naar welk veld AddDataField verwijst.
  • Geef deze aangepaste versie een andere Sub-naam en een andere TableName — 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.
Oplossing
expand arrow

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.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 3

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 4. Hoofdstuk 3
some-alt