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
- Saisir
GenerateMonthlyReportexactement 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é. - Modifier targetMonth en "January" et relancer — vérifier que le rapport se met à jour pour refléter le nouveau mois.
- 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.
1. Exécution de GenerateMonthlyReport tel quel
- Vérifier d'abord que la feuille Pivot et le tableau croisé dynamique
ptProfitByRegionissus de la tâche du chapitre précédent existent bien — ceSubactualise 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
Subet 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
ExportAsFixedFormatvue plus haut dans le chapitre — vous exportez la feuillews, 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.Pathavec un nom incluanttargetMonth, 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
MsgBoxfinal ne confirme la finalisation — sinon le message de confirmation apparaîtrait avant que le fichier n'existe réellement.
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.
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.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion