Bygge automatiserte rapporter
Sveip for å vise menyen
Mønster for månedsrapport Hver automatiserte rapport i dette kurset følger samme struktur: fjern gammel tilstand, filtrer eller oppsummer dataene, oppdater eller bygg opp det visuelle resultatet på nytt, bruk presentasjonsformatering, og bekreft ferdigstillelse til brukeren.
Gjennomgått eksempel: Én-klikk månedsrapport
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 nummererte kommentarene er ikke bare etiketter — de er rapportmønsteret fra tidligere i denne seksjonen gjort bokstavelig, ett steg per fase. Noen detaljer det er verdt å merke seg spesielt:
targetMonth As String, satt til en fast verdi øverst, er den ene linjen Oppgaven ber deg endre til "January" — fordi alle senere steg leser fra denne ene variabelen i stedet for at ordet "March" gjentas andre steder i Sub-en, trenger du aldri endre mer enn én linje for å bytte rapportmåned;- Steg 3 pakker RefreshTable inn i On Error Resume Next / On Error GoTo 0 av samme grunn som Pivot-makroen gjorde i seksjon 4.3: hvis Pivot-arket ikke finnes ennå, ville denne linjen ellers gi en feil og stoppe hele rapportmakroen, i stedet for bare å hoppe over et steg som ikke er klart ennå;
- Steg 4 sin PrintArea = tbl.Range.Address knytter utskriftsområdet direkte til tabellens egen adresse, slik at hvis rader senere legges til via ListRows.Add, vil utskriftsområdet fortsatt nøyaktig matche dataene — ingen separat vedlikehold av utskriftsområde kreves;
- Steg 5 sin MsgBox setter sammen targetMonth i bekreftelsesteksten, slik at meldingen alltid navngir hvilken måned som faktisk nettopp ble behandlet.
Oppdatering av dashbord
Hvis en arbeidsbok inneholder flere PivotTabeller og diagrammer som mater et dashbordark, vil RefreshAll oppdatere alle datatilkoblinger og PivotCache i én operasjon — én linje som gjør det GenerateMonthlyReport gjør manuelt for én PivotTable: ThisWorkbook.RefreshAll
Denne ene linjen gjør samme jobb som steg 3 i GenerateMonthlyReport, bare på hele arbeidsboken i stedet for én navngitt PivotTable — nyttig når et dashbord har vokst til å inkludere flere PivotTabeller, eksterne datatilkoblinger eller koblede spørringer som alle må holdes synkronisert.
Eksportklar formatering
Utover sideoppsett trenger en ferdig rapport ofte å forlate Excel helt. ExportAsFixedFormat lager en PDF direkte fra koden:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path returnerer mappen den gjeldende arbeidsboken er lagret i, uten en avsluttende skråstrek — derfor bygges filnavnet ved å sette sammen "\March_Report.pdf" eksplisitt. Hvis ThisWorkbook ikke er lagret ennå, returnerer .Path en tom streng og denne linjen vil forsøke å lagre til bare "\March_Report.pdf" på roten av gjeldende stasjon, så det er verdt å sjekke at arbeidsboken er lagret minst én gang før du stoler på dette mønsteret.
Oppgave
- Skriv inn
GenerateMonthlyReportnøyaktig som vist (du må ha Pivot-arket fra tidligere kapitler på plass først) og kjør det. Bekreft at tabellen filtreres til March og at Pivot oppdateres. - Endre targetMonth til "January" og kjør på nytt — bekreft at rapporten oppdateres til å gjelde den nye måneden.
- Legg til én linje på slutten av Sub-en, før MsgBox, som eksporterer Reports-arket til PDF ved å bruke ExportAsFixedFormat som vist over.
1. Kjøre GenerateMonthlyReport som den er
- Sørg for at Pivot-arket og
ptProfitByRegionPivotTable fra oppgaven i tidligere kapittel faktisk eksisterer først — denneSuboppdaterer en eksisterende PivotTable, den bygger ikke en fra bunnen av. - Skriv inn prosedyren nøyaktig som vist, kjør den, og sjekk to ting: Reports-tabellen skal nå være filtrert til kun å vise March-rader, og tallene på Pivot-arket skal gjenspeile dette (selv om Pivot i seg selv oppsummerer alle måneder uavhengig av Reports-filteret, siden PivotCaches leser hele området, ikke bare filtrert visning).
2. Endre targetMonth til January
- Bare én linje må endres — tildelingen
targetMonth = "March"øverst. - Kjør hele
Subpå nytt og bekreft at Reports-tabellen nå filtreres til January i stedet.
3. Legge til en PDF-eksportlinje
- Dette er nøyaktig samme
ExportAsFixedFormat-linje som tidligere i kapittelet — du eksportererws-arket, ikke hele arbeidsboken. - Bygg filnavnet på samme måte som kapittelets eksempel på fakturagenerering: kombiner
ThisWorkbook.Pathmed et navn som inkluderertargetMonth, slik at hver kjøring gir en unikt navngitt fil i stedet for å overskrive samme fil hver gang. - Plassering er viktig: den må komme etter filtrering/oppdatering/formatering er ferdig, men før den siste
MsgBoxbekrefter ferdigstillelse — ellers vil bekreftelsesmeldingen vises 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
Kjør den én gang med targetMonth = "March" og én gang med "January" — du skal ende opp med to separate PDF-filer (March_Report.pdf og January_Report.pdf) liggende ved siden av arbeidsboken, hver med korrekt filtrerte data fra tidspunktet de ble kjørt.
Hvis det dukker opp en dialogboks som ber deg velge en skriver (i stedet for at koden feiler direkte), velg et hvilket som helst tilgjengelig alternativ — inkludert "Microsoft Print to PDF", "Microsoft XPS Document Writer" eller en annen skriver som er oppført, til og med en faksdriver. Hvilken skriver som velges spiller ingen rolle her; VBA trenger bare en valgt skriver for å tilfredsstille PageSetup-/eksportprosessen, siden Excel håndterer disse operasjonene via skriverundersystemet i bakgrunnen uansett hvilken som er aktiv.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår