Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Skapa Automatiserade Rapporter | Automatisering av Tabeller och Rapporter
Excel VBA för affärsautomatisering

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

  1. Skriv GenerateMonthlyReport exakt 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.
  2. Ändra targetMonth till "January" och kör igen — bekräfta att rapporten uppdateras för att återspegla den nya månaden.
  3. Lägg till en rad i slutet av Sub:en, före MsgBox, som exporterar rapportbladet till PDF med ExportAsFixedFormat enligt ovan.
Tips
expand arrow

1. Köra GenerateMonthlyReport som den är

  • Kontrollera att pivotsidan och pivottabellen ptProfitByRegion från tidigare kapiteluppgift faktiskt finns — denna Sub uppdaterar 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 Sub igen 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 arbetsbladet ws, inte hela arbetsboken.
  • Bygg filnamnet på samma sätt som kapitlets exempel för fakturagenerering: kombinera ThisWorkbook.Path med ett namn som inkluderar targetMonth, 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 MsgBox som bekräftar slutförande — annars skulle bekräftelsemeddelandet visas innan filen faktiskt finns.
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

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.

Note
Obs

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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 5

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 4. Kapitel 5
some-alt