Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Bygge automatiserte rapporter | Automatisering av tabeller og rapporter
Excel VBA for Forretningsautomatisering

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

  1. Skriv inn GenerateMonthlyReport nø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.
  2. Endre targetMonth til "January" og kjør på nytt — bekreft at rapporten oppdateres til å gjelde den nye måneden.
  3. Legg til én linje på slutten av Sub-en, før MsgBox, som eksporterer Reports-arket til PDF ved å bruke ExportAsFixedFormat som vist over.
Tips
expand arrow

1. Kjøre GenerateMonthlyReport som den er

  • Sørg for at Pivot-arket og ptProfitByRegion PivotTable fra oppgaven i tidligere kapittel faktisk eksisterer først — denne Sub oppdaterer 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 Sub på 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 eksporterer ws-arket, ikke hele arbeidsboken.
  • Bygg filnavnet på samme måte som kapittelets eksempel på fakturagenerering: kombiner ThisWorkbook.Path med et navn som inkluderer targetMonth, 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 MsgBox bekrefter ferdigstillelse — ellers vil bekreftelsesmeldingen vises før filen faktisk eksisterer.
Løsning
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

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.

Note
Merk

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.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 5

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 4. Kapittel 5
some-alt