Creazione di report automatizzati
Scorri per mostrare il menu
Il modello di report mensile Ogni report automatizzato in questo corso segue la stessa struttura: cancellare lo stato precedente, filtrare o riepilogare i dati, aggiornare o ricostruire l'output visivo, applicare la formattazione di presentazione e confermare il completamento all'utente.
Esempio pratico: Report mensile con un clic
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
I cinque commenti numerati non sono solo etichette: rappresentano letteralmente il modello di report descritto in precedenza in questa sezione, un passaggio per ogni fase. Alcuni dettagli da evidenziare:
targetMonth As String, impostato su un valore fisso vicino all'inizio, è l'unica riga che il Task chiede di cambiare in "January" — poiché ogni passaggio successivo legge da questa singola variabile invece che dalla parola "March" ripetuta altrove nella Sub, cambiare il mese di riferimento del report richiede di modificare solo una riga;- Il passaggio 3 racchiude RefreshTable tra On Error Resume Next / On Error GoTo 0 per lo stesso motivo visto nella macro di creazione della Pivot nella sezione 4.3: se il foglio Pivot non esiste ancora, questa riga genererebbe un errore e fermerebbe l'intera macro del report, invece di saltare semplicemente un passaggio non ancora pronto;
- Il passaggio 4 PrintArea = tbl.Range.Address collega l'area di stampa direttamente all'indirizzo della Tabella, quindi se in seguito vengono aggiunte righe tramite ListRows.Add, l'area di stampa corrisponde sempre esattamente ai dati — nessuna manutenzione separata dell'area di stampa necessaria;
- Il passaggio 5 MsgBox concatena targetMonth nel testo di conferma, così il messaggio indica sempre il mese effettivamente elaborato.
Aggiornamento del dashboard
Se una cartella di lavoro contiene diverse PivotTable e grafici che alimentano un foglio dashboard, RefreshAll ricalcola ogni connessione dati e PivotCache in un'unica chiamata — la versione in una riga di ciò che GenerateMonthlyReport fa manualmente per una singola PivotTable: ThisWorkbook.RefreshAll
Questa singola riga svolge la stessa funzione del passaggio 3 in GenerateMonthlyReport, ma su scala dell'intera cartella di lavoro invece che su una sola PivotTable — utile quando un dashboard include più PivotTable, connessioni dati esterne o query collegate che devono rimanere sincronizzate.
Formattazione pronta per l'esportazione
Oltre all'impostazione della pagina, un report finito spesso deve essere esportato fuori da Excel. ExportAsFixedFormat produce un PDF direttamente dal codice:
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
Quality:=xlQualityStandard
ThisWorkbook.Path restituisce la cartella in cui è salvata la cartella di lavoro corrente, senza barra finale — per questo il nome file viene costruito concatenando esplicitamente "\March_Report.pdf". Se ThisWorkbook non è stato ancora salvato, .Path restituisce una stringa vuota e questa riga proverebbe a salvare semplicemente come "\March_Report.pdf" nella radice dell'unità corrente, quindi è importante assicurarsi che la cartella di lavoro sia stata salvata almeno una volta prima di affidarsi a questo modello.
Task
- Digitare
GenerateMonthlyReportesattamente come mostrato (è necessario che il foglio Pivot dei capitoli precedenti esista già) ed eseguirlo. Confermare che la tabella venga filtrata su March e che la Pivot venga aggiornata. - Cambiare targetMonth in "January" e rieseguire — confermare che il report si aggiorni per riflettere il nuovo mese.
- Aggiungere una riga alla fine della Sub, prima del MsgBox, che esporti il foglio Reports in PDF usando ExportAsFixedFormat come mostrato sopra.
1. Esecuzione di GenerateMonthlyReport così com'è
- Assicurarsi che il foglio Pivot e la PivotTable
ptProfitByRegiondel task del capitolo precedente esistano effettivamente — questaSubaggiorna una PivotTable esistente, non ne crea una da zero. - Digitare la procedura esattamente come mostrato, eseguirla e verificare due cose: la tabella Reports dovrebbe ora essere filtrata per mostrare solo le righe di March e i numeri del foglio Pivot dovrebbero rifletterlo (anche se la Pivot stessa riepiloga tutti i mesi indipendentemente dal filtro della tabella Reports, poiché le PivotCache leggono l'intervallo completo, non la vista filtrata).
2. Modifica di targetMonth in January
- È necessario modificare solo una riga — l'assegnazione
targetMonth = "March"vicino all'inizio. - Rieseguire l'intera
Sube confermare che la tabella Reports ora venga filtrata su January.
3. Aggiunta di una riga per l'esportazione in PDF
- Questa è esattamente la stessa riga
ExportAsFixedFormatvista in precedenza nel capitolo — si sta esportando il fogliows, non l'intera cartella di lavoro. - Costruire il nome file nello stesso modo dell'esempio di generazione fattura del capitolo: combinare
ThisWorkbook.Pathcon un nome che includatargetMonth, così ogni esecuzione produce un file con nome distinto invece di sovrascrivere sempre lo stesso. - La posizione è importante: deve essere inserita dopo i passaggi di filtro/aggiornamento/formattazione, ma prima che il
MsgBoxfinale confermi il completamento — altrimenti il messaggio di conferma apparirebbe prima che il file esista realmente.
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
Eseguirlo una volta con targetMonth = "March" e una volta con "January" — dovresti ottenere due PDF separati (March_Report.pdf e January_Report.pdf) accanto alla tua cartella di lavoro, ciascuno con i dati filtrati correttamente al momento dell'esecuzione.
Se viene visualizzata una finestra di dialogo che richiede di scegliere una stampante (anziché far fallire direttamente il codice), selezionare qualsiasi opzione disponibile — inclusi "Microsoft Print to PDF", "Microsoft XPS Document Writer" o qualsiasi altra stampante elencata, anche un driver fax. La stampante specifica scelta non è rilevante in questo caso; VBA necessita semplicemente di una stampante selezionata per soddisfare il processo di PageSetup/esportazione, poiché Excel gestisce queste operazioni tramite il sottosistema della stampante in background, indipendentemente da quale sia attiva.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione