Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Création de rapports automatisés | Automatisation des tableaux et des rapports
VBA Excel Pour l'Automatisation des Entreprises

Création de rapports automatisés

Glissez pour afficher le menu

Le modèle de rapport mensuel Chaque rapport automatisé dans ce cours suit la même structure : effacer l'état précédent, filtrer ou résumer les données, actualiser ou reconstruire la sortie visuelle, appliquer la mise en forme de présentation et confirmer la finalisation à l'utilisateur.

Exemple traité : Rapport mensuel en 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

Les cinq commentaires numérotés ne sont pas de simples étiquettes — ils traduisent littéralement le modèle de rapport présenté plus tôt dans cette section, une étape par phase. Quelques points méritent une attention particulière :

  • targetMonth As String, défini à une valeur fixe en haut, est la seule ligne que la tâche vous demande de modifier en "January" — car chaque étape ultérieure lit cette variable unique plutôt que de répéter le mot "March" ailleurs dans la procédure, changer le mois cible du rapport ne nécessite donc jamais de modifier plus d'une ligne ;
  • L'étape 3 encadre RefreshTable avec On Error Resume Next / On Error GoTo 0 pour la même raison que la macro de création de tableau croisé dynamique dans la section 4.3 : si la feuille Pivot n'existe pas encore, cette ligne provoquerait sinon une erreur et arrêterait toute la macro du rapport, au lieu de simplement ignorer une étape qui n'est pas encore prête ;
  • À l'étape 4, PrintArea = tbl.Range.Address lie la zone d'impression directement à l'adresse du tableau, donc si des lignes sont ajoutées ultérieurement via ListRows.Add, la zone d'impression correspond toujours exactement aux données — aucune maintenance séparée de la zone d'impression n'est requise ;
  • À l'étape 5, MsgBox concatène targetMonth dans le texte de confirmation, de sorte que le message affiche toujours le mois effectivement traité.

Actualisation du tableau de bord

Si un classeur contient plusieurs tableaux croisés dynamiques et graphiques alimentant une feuille de tableau de bord, RefreshAll recalcule chaque connexion de données et PivotCache en un seul appel — la version en une ligne de ce que GenerateMonthlyReport fait manuellement pour un seul tableau croisé dynamique : ThisWorkbook.RefreshAll

Cette ligne unique accomplit la même tâche que l'étape 3 de GenerateMonthlyReport, mais à l'échelle de tout le classeur plutôt que d'un seul tableau croisé dynamique nommé — utile dès qu'un tableau de bord comprend plusieurs tableaux croisés dynamiques, connexions de données externes ou requêtes liées qui doivent toutes rester synchronisées.

Mise en forme prête à l'export

Au-delà de la mise en page, un rapport finalisé doit souvent quitter Excel. ExportAsFixedFormat permet de produire un PDF directement depuis le code :

ws.ExportAsFixedFormat Type:=xlTypePDF, _
    Filename:=ThisWorkbook.Path & "\March_Report.pdf", _
    Quality:=xlQualityStandard

ThisWorkbook.Path retourne le dossier dans lequel le classeur courant est enregistré, sans barre oblique finale — c'est pourquoi le nom de fichier est construit en concaténant explicitement "\March_Report.pdf". Si ThisWorkbook n'a pas encore été enregistré, .Path retourne une chaîne vide et cette ligne essaiera d'enregistrer simplement sous "\March_Report.pdf" à la racine du lecteur courant, il est donc recommandé de vérifier que le classeur a bien été enregistré au moins une fois avant de s'appuyer sur ce modèle.

Tâche

  1. Saisir GenerateMonthlyReport exactement comme indiqué (vous devez d'abord disposer de la feuille Pivot du chapitre précédent) et l'exécuter. Vérifier que le tableau est filtré sur March et que le tableau croisé dynamique est actualisé.
  2. Modifier targetMonth en "January" et relancer — vérifier que le rapport se met à jour pour refléter le nouveau mois.
  3. Ajouter une ligne à la fin de la procédure, avant le MsgBox, qui exporte la feuille Reports en PDF à l'aide de ExportAsFixedFormat comme montré ci-dessus.
Astuces
expand arrow

1. Exécution de GenerateMonthlyReport tel quel

  • Vérifier d'abord que la feuille Pivot et le tableau croisé dynamique ptProfitByRegion issus de la tâche du chapitre précédent existent bien — ce Sub actualise un tableau croisé dynamique existant, il n'en crée pas un à partir de zéro.
  • Saisir la procédure exactement comme indiqué, l'exécuter et vérifier deux éléments : le tableau Reports doit maintenant être filtré pour n'afficher que les lignes de March, et les chiffres de la feuille Pivot doivent refléter cela (même si le tableau croisé dynamique résume tous les mois indépendamment du filtre Reports, car PivotCaches lit toute la plage, pas seulement la vue filtrée).

2. Modification de targetMonth en January

  • Une seule ligne doit être modifiée — l'affectation targetMonth = "March" en haut.
  • Relancer tout le Sub et vérifier que le tableau Reports est maintenant filtré sur January.

3. Ajout d'une ligne d'export PDF

  • Il s'agit exactement de la même ligne ExportAsFixedFormat vue plus haut dans le chapitre — vous exportez la feuille ws, pas tout le classeur.
  • Construire le nom de fichier de la même manière que l'exemple de génération de facture du chapitre : combiner ThisWorkbook.Path avec un nom incluant targetMonth, afin que chaque exécution produise un fichier distinct au lieu d'écraser le même à chaque fois.
  • Le placement est important : la ligne doit être placée après les étapes de filtrage/actualisation/mise en forme, mais avant que le MsgBox final ne confirme la finalisation — sinon le message de confirmation apparaîtrait avant que le fichier n'existe réellement.
Solution
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

Lancer une fois avec targetMonth = "March" puis avec "January" — vous devriez obtenir deux PDF distincts (March_Report.pdf et January_Report.pdf) placés à côté de votre classeur, chacun reflétant les données filtrées au moment de l'exécution.

Note
Remarque

Si une boîte de dialogue s'affiche vous demandant de choisir une imprimante (au lieu que le code échoue immédiatement), sélectionnez n'importe quelle option disponible — y compris « Microsoft Print to PDF », « Microsoft XPS Document Writer » ou toute autre imprimante listée, même un pilote de fax. L'imprimante choisie importe peu ici ; VBA a simplement besoin qu'une imprimante soit sélectionnée pour satisfaire le processus PageSetup/exportation, car Excel effectue ces opérations via le sous-système d'impression en arrière-plan, quel que soit le périphérique actif.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 5

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 4. Chapitre 5
some-alt