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
- Typ
GenerateMonthlyReportexact 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. - Wijzig targetMonth naar "January" en voer opnieuw uit — bevestig dat het rapport wordt bijgewerkt naar de nieuwe maand.
- 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.
1. GenerateMonthlyReport uitvoeren zoals het is
- Zorg ervoor dat het Pivot-blad en de draaitabel
ptProfitByRegionuit de eerdere opdracht daadwerkelijk bestaan — dezeSubvernieuwt 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
Subopnieuw 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 hetws-werkblad, niet de hele werkmap. - Bouw de bestandsnaam op dezelfde manier als het factuurgeneratievoorbeeld in het hoofdstuk: combineer
ThisWorkbook.Pathmet een naam dietargetMonthbevat, 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
MsgBoxdie de voltooiing bevestigt — anders verschijnt het bevestigingsbericht voordat het bestand daadwerkelijk bestaat.
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.
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.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.