Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Creazione di report automatizzati | Automazione di Tabelle e Report
Excel VBA per l'Automazione Aziendale

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

  1. Digitare GenerateMonthlyReport esattamente 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.
  2. Cambiare targetMonth in "January" e rieseguire — confermare che il report si aggiorni per riflettere il nuovo mese.
  3. Aggiungere una riga alla fine della Sub, prima del MsgBox, che esporti il foglio Reports in PDF usando ExportAsFixedFormat come mostrato sopra.
Suggerimenti
expand arrow

1. Esecuzione di GenerateMonthlyReport così com'è

  • Assicurarsi che il foglio Pivot e la PivotTable ptProfitByRegion del task del capitolo precedente esistano effettivamente — questa Sub aggiorna 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 Sub e 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 ExportAsFixedFormat vista in precedenza nel capitolo — si sta esportando il foglio ws, non l'intera cartella di lavoro.
  • Costruire il nome file nello stesso modo dell'esempio di generazione fattura del capitolo: combinare ThisWorkbook.Path con un nome che includa targetMonth, 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 MsgBox finale confermi il completamento — altrimenti il messaggio di conferma apparirebbe prima che il file esista realmente.
Soluzione
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

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.

Note
Nota

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.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 4. Capitolo 5
some-alt