Skapa Automatiserade Rapporter
Svep för att visa menyn
Mönster för månadsrapport Varje automatiserad rapport i denna kurs följer samma struktur: rensa tidigare tillstånd, filtrera eller summera data, uppdatera eller återskapa den visuella utmatningen, tillämpa presentationsformatering och bekräfta slutförande till användaren.
Genomgång: Månadsrapport med ett klick
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 fem numrerade kommentarerna är inte bara etiketter — de är rapportmönstret från tidigare i detta avsnitt, bokstavligt, ett steg per fas. Några detaljer värda att lyfta fram:
targetMonth As String, satt till ett fast värde högst upp, är den enda raden som uppgiften ber dig ändra till "January" — eftersom varje senare steg läser från denna enda variabel istället för att ordet "March" upprepas någon annanstans i Sub:en, kräver det aldrig mer än en rad att byta rapportmånad;- Steg 3 omger RefreshTable med On Error Resume Next / On Error GoTo 0 av samma anledning som makrot för pivottabellbyggande gjorde i avsnitt 4.3: om pivotsidan inte finns ännu skulle denna rad annars ge ett fel och stoppa hela rapportmakrot, istället för att bara hoppa över ett steg som inte är redo än;
- Steg 4:s PrintArea = tbl.Range.Address kopplar utskriftsområdet direkt till tabellens egen adress, så om rader senare läggs till via ListRows.Add matchar utskriftsområdet fortfarande exakt datan — ingen separat hantering av utskriftsområde krävs;
- Steg 5:s MsgBox konkatenerar targetMonth in i bekräftelsetexten, så meddelandet alltid anger vilken månad som faktiskt just behandlats.
Uppdatering av dashboard
Om en arbetsbok innehåller flera pivottabeller och diagram som matar ett dashboardsblad, räknar RefreshAll om varje datakoppling och PivotCache i ett enda anrop — den enradiga versionen av vad GenerateMonthlyReport gör manuellt för en enskild pivottabell: ThisWorkbook.RefreshAll
Denna rad gör samma jobb som steg 3 i GenerateMonthlyReport, men på hela arbetsboken istället för en namngiven pivottabell — användbart när en dashboard har vuxit till att inkludera flera pivottabeller, externa datakopplingar eller länkade frågor som alla behöver hållas synkroniserade.
Exportklar formatering
Utöver sidinställning behöver en färdig rapport ofta lämna Excel helt. ExportAsFixedFormat skapar en PDF direkt från koden:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path returnerar mappen där den aktuella arbetsboken är sparad, utan avslutande omvänt snedstreck — därför byggs filnamnet genom att "\March_Report.pdf" konkateneras explicit. Om ThisWorkbook inte har sparats ännu returnerar .Path en tom sträng och denna rad försöker då spara till bara "\March_Report.pdf" i roten av aktuell enhet, så det är värt att kontrollera att arbetsboken har sparats minst en gång innan detta mönster används.
Uppgift
- Skriv
GenerateMonthlyReportexakt som visat (du behöver pivotsidan från tidigare kapitel först) och kör den. Bekräfta att tabellen filtreras till March och att pivottabellen uppdateras. - Ändra targetMonth till "January" och kör igen — bekräfta att rapporten uppdateras för att återspegla den nya månaden.
- Lägg till en rad i slutet av Sub:en, före MsgBox, som exporterar rapportbladet till PDF med ExportAsFixedFormat enligt ovan.
1. Köra GenerateMonthlyReport som den är
- Kontrollera att pivotsidan och pivottabellen
ptProfitByRegionfrån tidigare kapiteluppgift faktiskt finns — dennaSubuppdaterar en befintlig pivottabell, den bygger inte en från grunden. - Skriv proceduren exakt som visat, kör den och kontrollera två saker: rapporttabellen ska nu vara filtrerad så att endast rader för March visas, och pivotsidans siffror ska spegla detta (även om pivottabellen själv summerar alla månader oavsett rapporttabellens filter, eftersom PivotCaches läser hela området, inte den filtrerade vyn).
2. Ändra targetMonth till January
- Endast en rad behöver ändras — tilldelningen
targetMonth = "March"nära toppen. - Kör hela
Subigen och kontrollera att rapporttabellen nu filtreras till January istället.
3. Lägga till en rad för PDF-export
- Detta är exakt samma
ExportAsFixedFormat-rad som tidigare i kapitlet — du exporterar arbetsbladetws, inte hela arbetsboken. - Bygg filnamnet på samma sätt som kapitlets exempel för fakturagenerering: kombinera
ThisWorkbook.Pathmed ett namn som inkluderartargetMonth, så att varje körning skapar en unikt namngiven fil istället för att skriva över samma varje gång. - Placeringen är viktig: raden ska läggas efter filtrerings-/uppdaterings-/formateringsstegen är klara, men före den sista
MsgBoxsom bekräftar slutförande — annars skulle bekräftelsemeddelandet visas innan filen faktiskt finns.
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
Kör den en gång med targetMonth = "March" och en gång med "January" — du ska få två separata PDF-filer (March_Report.pdf och January_Report.pdf) bredvid din arbetsbok, där varje fil speglar korrekt filtrerad data vid körningstillfället.
Om en dialogruta dyker upp och ber dig välja en skrivare (istället för att koden misslyckas direkt), välj vilket alternativ som helst — inklusive "Microsoft Print to PDF", "Microsoft XPS Document Writer" eller någon annan skrivare som listas, även en faxdrivrutin. Det spelar ingen roll vilken specifik skrivare som väljs här; VBA behöver bara någon skrivare vald för att slutföra PageSetup-/exportprocessen, eftersom Excel hanterar dessa operationer via skrivarens subsystem i bakgrunden oavsett vilken som är aktiv.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal