Opbygning af automatiserede rapporter
Stryg for at vise menuen
Månedlig rapportmønster Alle automatiserede rapporter i dette kursus følger samme struktur: ryd tidligere tilstand, filtrer eller opsummer dataene, opdater eller genopbyg det visuelle output, anvend præsentationsformatering og bekræft færdiggørelse til brugeren.
Gennemarbejdet eksempel: Én-klik månedlig rapport
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 nummererede kommentarer er ikke kun etiketter — de udgør rapportmønsteret fra tidligere i dette afsnit, gjort bogstaveligt, ét trin pr. fase. Nogle detaljer, der er værd at fremhæve:
targetMonth As String, sat til en fast værdi øverst, er den ene linje, som Opgaven beder dig ændre til "January" — fordi alle senere trin læser fra denne ene variabel i stedet for at ordet "March" gentages andre steder i Sub'en, kræver det kun én ændring at skifte rapportens mål-måned;- Trin 3 omslutter RefreshTable med On Error Resume Next / On Error GoTo 0 af samme grund som Pivot-makroen gjorde i afsnit 4.3: hvis Pivot-arket ikke eksisterer endnu, ville denne linje ellers give en fejl og stoppe hele rapportmakroen, i stedet for blot at springe et trin over, der ikke er klar endnu;
- Trin 4's PrintArea = tbl.Range.Address binder udskriftsområdet direkte til Tabelens egen adresse, så hvis rækker senere tilføjes via ListRows.Add, matcher udskriftsområdet stadig præcist dataene — ingen separat vedligeholdelse af udskriftsområde er nødvendig;
- Trin 5's MsgBox sammenkæder targetMonth med bekræftelsesteksten, så beskeden altid nævner den måned, der faktisk netop er blevet behandlet.
Dashboard-opdatering
Hvis en projektmappe indeholder flere pivottabeller og diagrammer, der føder et dashboard-ark, genberegner RefreshAll alle datakilder og PivotCache med ét kald — den énliniers version af det, GenerateMonthlyReport gør manuelt for en enkelt pivottabel: ThisWorkbook.RefreshAll
Denne ene linje udfører samme opgave som trin 3 i GenerateMonthlyReport, blot i hele projektmappen i stedet for én navngiven pivottabel — nyttigt, når et dashboard er vokset til at inkludere flere pivottabeller, eksterne datakilder eller tilknyttede forespørgsler, der alle skal holdes synkroniseret.
Eksportklar formatering
Ud over sideopsætning skal en færdig rapport ofte eksporteres ud af Excel. ExportAsFixedFormat genererer en PDF direkte fra koden:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path returnerer mappen, hvor den aktuelle projektmappe er gemt, uden en afsluttende backslash — derfor bygges filnavnet ved at sammenkæde "\March_Report.pdf" eksplicit. Hvis ThisWorkbook ikke er gemt endnu, returnerer .Path en tom streng, og denne linje vil forsøge at gemme til blot "\March_Report.pdf" på roden af det aktuelle drev, så det er værd at sikre, at projektmappen er gemt mindst én gang, før dette mønster anvendes.
Opgave
- Skriv
GenerateMonthlyReportnøjagtigt som vist (du skal have Pivot-arket fra tidligere kapitler oprettet først) og kør det. Bekræft, at tabellen filtreres til March, og at Pivot opdateres. - Skift targetMonth til "January" og kør igen — bekræft, at rapporten opdateres til at afspejle den nye måned.
- Tilføj én linje i slutningen af Sub'en, før MsgBox, der eksporterer Reports-arket til PDF ved hjælp af ExportAsFixedFormat som vist ovenfor.
1. Kørsel af GenerateMonthlyReport som den er
- Sørg for, at Pivot-arket og
ptProfitByRegionpivottabellen fra opgaven i det tidligere kapitel faktisk eksisterer først — denneSubopdaterer en eksisterende pivottabel, den opretter ikke en fra bunden. - Skriv proceduren nøjagtigt som vist, kør den, og tjek to ting: Reports-tabellen skal nu være filtreret til kun at vise rækker for March, og Pivot-arkets tal skal afspejle dette (selvom Pivot i sig selv opsummerer alle måneder uanset Reports-filteret, da PivotCaches læser hele området, ikke kun det filtrerede visning).
2. Ændring af targetMonth til January
- Kun én linje skal ændres — tildelingen
targetMonth = "March"øverst. - Kør hele
Subigen og bekræft, at Reports-tabellen nu filtreres til January i stedet.
3. Tilføjelse af en PDF-eksportlinje
- Dette er præcis samme
ExportAsFixedFormat-linje som tidligere i kapitlet — du eksportererws-arket, ikke hele projektmappen. - Byg filnavnet på samme måde som kapitrets eksempel på fakturagenerering: kombiner
ThisWorkbook.Pathmed et navn, der inkluderertargetMonth, så hver kørsel producerer en fil med et unikt navn i stedet for at overskrive den samme hver gang. - Placering er vigtig: den skal indsættes efter filtrerings-/opdaterings-/formateringstrinene er udført, men før den endelige
MsgBoxbekræfter færdiggørelse — ellers vises bekræftelsesbeskeden, før filen faktisk eksisterer.
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 én gang med targetMonth = "March" og én gang med "January" — du bør ende med to separate PDF-filer (March_Report.pdf og January_Report.pdf) liggende ved siden af din projektmappe, hver afspejlende de korrekt filtrerede data på det tidspunkt, de blev kørt.
Hvis der vises en dialogboks, der beder dig om at vælge en printer (i stedet for at koden fejler direkte), skal du vælge en hvilken som helst tilgængelig mulighed — herunder "Microsoft Print to PDF", "Microsoft XPS Document Writer" eller en anden printer på listen, selv en faxdriver. Det er ikke vigtigt, hvilken specifik printer der vælges her; VBA kræver blot, at en eller anden printer er valgt for at opfylde PageSetup-/eksportprocessen, da Excel håndterer disse operationer via printersystemet i baggrunden, uanset hvilken printer der er aktiv.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat