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

Geautomatiseerde Rapporten Opstellen

Veeg om het menu te tonen

Het maandelijkse rapportpatroon Elk geautomatiseerd rapport in deze cursus volgt dezelfde structuur: oude status wissen, gegevens filteren of samenvatten, visuele output vernieuwen of opnieuw opbouwen, opmaak voor presentatie toepassen en voltooiing bevestigen aan de gebruiker.

Uitgewerkt Voorbeeld: Maandrapport met één klik

Option Explicit
 
Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim targetMonth As String
 
    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "March"
 
    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData
 
    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth
 
    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0
 
    ' 4. Apply export-ready formatting
    With ws.PageSetup
        .Orientation = xlLandscape
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = tbl.Range.Address
    End With
 
    ' 5. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, " & _
        "refreshed, and print-formatted."
End Sub

De vijf genummerde opmerkingen zijn niet alleen labels — ze vormen het rapportpatroon uit het begin van deze sectie, letterlijk gemaakt, één stap per fase. Enkele details die extra aandacht verdienen:

  • targetMonth As String, ingesteld op een vaste waarde bovenaan, is de ene regel die je moet aanpassen naar "January" — omdat elke volgende stap deze enkele variabele gebruikt in plaats van het woord "March" elders in de Sub te herhalen, hoeft de doelmaand van het rapport nooit op meer dan één plek aangepast te worden;
  • Stap 3 plaatst RefreshTable tussen On Error Resume Next / On Error GoTo 0 om dezelfde reden als de macro voor het bouwen van de draaitabel in sectie 4.3: als het Pivot-blad nog niet bestaat, zou deze regel anders een fout veroorzaken en de hele rapportmacro stoppen, in plaats van gewoon een stap over te slaan die nog niet klaar is;
  • Stap 4's PrintArea = tbl.Range.Address koppelt het afdrukgebied direct aan het bereik van de tabel, zodat als er later rijen worden toegevoegd via ListRows.Add, het afdrukgebied nog steeds exact overeenkomt met de gegevens — geen apart onderhoud van het afdrukgebied nodig;
  • Stap 5's MsgBox voegt targetMonth samen in de bevestigingstekst, zodat het bericht altijd de maand noemt die zojuist verwerkt is.

Dashboard Vernieuwen

Als een werkmap meerdere draaitabellen en grafieken bevat die een dashboardblad voeden, herberekent RefreshAll elke gegevensverbinding en PivotCache in één keer — de éénregelige versie van wat GenerateMonthlyReport handmatig doet voor één draaitabel: ThisWorkbook.RefreshAll

Deze ene regel doet hetzelfde als stap 3 in GenerateMonthlyReport, maar dan op het niveau van de hele werkmap in plaats van één specifieke draaitabel — handig zodra een dashboard meerdere draaitabellen, externe gegevensverbindingen of gekoppelde query's bevat die allemaal synchroon moeten blijven.

Exportklare Opmaak

Naast pagina-instelling moet een afgerond rapport vaak Excel volledig verlaten. ExportAsFixedFormat maakt direct vanuit de code een PDF aan:

ws.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
    Quality:=xlQualityStandard

ThisWorkbook.Path geeft de map terug waarin de huidige werkmap is opgeslagen, zonder een afsluitende backslash — daarom wordt de bestandsnaam opgebouwd door "\March_Report.pdf" er expliciet aan toe te voegen. Als ThisWorkbook nog niet is opgeslagen, geeft .Path een lege tekenreeks terug en probeert deze regel op te slaan als alleen "\March_Report.pdf" op de hoofdmap van het huidige station, dus het is verstandig om te controleren of de werkmap minstens één keer is opgeslagen voordat je op dit patroon vertrouwt.

Opdracht

  1. Typ GenerateMonthlyReport exact zoals getoond (je hebt het Pivot-blad uit eerdere hoofdstukken nodig) en voer het uit. Bevestig dat de tabel filtert op March en de draaitabel wordt vernieuwd.
  2. Wijzig targetMonth naar "January" en voer opnieuw uit — bevestig dat het rapport wordt bijgewerkt naar de nieuwe maand.
  3. Voeg één regel toe aan het einde van de Sub, vóór de MsgBox, die het Reports-blad exporteert naar PDF met ExportAsFixedFormat zoals hierboven getoond.
Hints
expand arrow

1. GenerateMonthlyReport uitvoeren zoals het is

  • Zorg ervoor dat het Pivot-blad en de draaitabel ptProfitByRegion uit de eerdere opdracht daadwerkelijk bestaan — deze Sub vernieuwt een bestaande draaitabel, bouwt er geen vanaf nul.
  • Typ de procedure exact zoals getoond, voer deze uit en controleer twee dingen: de Reports-tabel moet nu gefilterd zijn om alleen de rijen van March te tonen, en de cijfers op het Pivot-blad moeten dat weerspiegelen (hoewel de draaitabel zelf alle maanden samenvat, ongeacht het filter op Reports, omdat PivotCaches het volledige bereik lezen, niet alleen de gefilterde weergave).

2. targetMonth wijzigen naar January

  • Slechts één regel hoeft aangepast te worden — de toewijzing targetMonth = "March" bovenaan.
  • Voer de hele Sub opnieuw uit en bevestig dat de Reports-tabel nu filtert op January.

3. Een PDF-exportregel toevoegen

  • Dit is exact dezelfde ExportAsFixedFormat-regel als eerder in het hoofdstuk — je exporteert het ws-werkblad, niet de hele werkmap.
  • Bouw de bestandsnaam op dezelfde manier als het factuurgeneratievoorbeeld in het hoofdstuk: combineer ThisWorkbook.Path met een naam die targetMonth bevat, zodat elke uitvoering een uniek bestand oplevert in plaats van telkens hetzelfde te overschrijven.
  • Plaatsing is belangrijk: deze regel moet na de filter-, vernieuwings- en opmaakstappen komen, maar vóór de laatste MsgBox die de voltooiing bevestigt — anders verschijnt het bevestigingsbericht voordat het bestand daadwerkelijk bestaat.
Oplossing
expand arrow
Option Explicit

Sub GenerateMonthlyReport()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim chtObj As ChartObject
    Dim printRange As Range
    Dim targetMonth As String

    Set ws = ThisWorkbook.Worksheets("Reports")
    Set tbl = ws.ListObjects("tblReports")
    targetMonth = "January"

    ' 1. Start from a clean slate
    If tbl.AutoFilter.FilterMode Then tbl.AutoFilter.ShowAllData

    ' 2. Filter to the month being reported on
    tbl.Range.AutoFilter Field:=1, Criteria1:=targetMonth

    ' 3. Refresh the summary PivotTable so it reflects current data
    On Error Resume Next
    ThisWorkbook.Worksheets("Pivot").PivotTables("ptProfitByRegion").RefreshTable
    On Error GoTo 0

    ' 4. Build a print area that covers the table AND the chart
    On Error Resume Next
    Set chtObj = ws.ChartObjects(1)
    If Not chtObj Is Nothing Then
        Set printRange = Union(tbl.Range, ws.Range(chtObj.TopLeftCell.Address, _
            chtObj.BottomRightCell.Address))
    Else
        Set printRange = tbl.Range
    End If
    On Error GoTo 0

    On Error Resume Next
    With ws.PageSetup
        .Orientation = xlLandscape
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 1
        .PrintArea = printRange.Address
    End With
    On Error GoTo 0

    ' 5. Export the filtered report to PDF
    ws.ExportAsFixedFormat Type:=xlTypePDF, _
        Filename:=ThisWorkbook.Path & "\" & targetMonth & "_Report.pdf", _
        Quality:=xlQualityStandard

    ' 6. Confirm completion
    MsgBox targetMonth & " report is ready — filtered, refreshed, and exported."
End Sub

Voer het één keer uit met targetMonth = "March" en één keer met "January" — je zou twee aparte PDF's moeten krijgen (March_Report.pdf en January_Report.pdf) naast je werkmap, elk met de correct gefilterde gegevens op het moment van uitvoeren.

Note
Opmerking

Als er een dialoogvenster verschijnt waarin u wordt gevraagd een printer te kiezen (in plaats van dat de code direct faalt), selecteer dan een willekeurige beschikbare optie — zoals "Microsoft Print to PDF", "Microsoft XPS Document Writer" of een andere vermelde printer, zelfs een faxstuurprogramma. Het maakt hier niet uit welke printer wordt gekozen; VBA heeft alleen een geselecteerde printer nodig om het PageSetup-/exportproces te voltooien, omdat Excel deze bewerkingen altijd via het printersubsysteem uitvoert, ongeacht welke printer actief is.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 5

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 5
some-alt