· ExcelWorkflow · VBA & Automatisation · 8 min read
VBA Excel : Automatiser 10h de Travail par Semaine avec les Macros (Guide Complet 2026)
Découvrez comment créer des macros VBA puissantes pour automatiser vos traitements Excel : boucles, manipulation de fichiers, formulaires, envoi d'emails et connexion aux bases de données. Guide pratique avec 10 macros prêtes à l'emploi.

Introduction : VBA, Toujours Indispensable en 2026 ?
Dans un monde où Python et Power Automate gagnent du terrain, VBA (Visual Basic for Applications) reste indispensable pour des millions de professionnels Excel. Pourquoi ?
- VBA est intégré nativement dans Excel, aucune installation requise
- Il offre un contrôle total sur chaque cellule, feuille et classeur
- Les macros sont portables — elles fonctionnent sur n’importe quel poste Excel
- Pour les entreprises qui ne peuvent pas installer Python, VBA est la seule option
- La productivité gain est immédiate : pas de courbe d’apprentissage longue
Un professionnel qui maîtrise VBA peut automatiser des tâches qui prenaient des heures en quelques secondes. Dans ce guide, vous allez créer 10 macros concrètes utilisables dès aujourd’hui.
1. Les Fondamentaux VBA en 20 Minutes
L’Éditeur VBA (Alt + F11)
L’éditeur VBA est votre environnement de développement. Il contient :
- L’explorateur de projets (gauche) : arborescence de vos classeurs et modules
- L’éditeur de code (centre) : où vous écrivez vos macros
- La fenêtre Exécution (bas) : pour déboguer avec
Debug.Print
Structure de Base d’une Macro
Sub MaPremiereMacro()
' Ceci est un commentaire
' Déclarer des variables
Dim nomFeuille As String
Dim derniereLigne As Long
Dim i As Long
' Référencer des éléments Excel
nomFeuille = "Données"
' Désactiver les mises à jour (performance)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Votre code ici...
MsgBox "Macro exécutée avec succès !"
' Toujours réactiver à la fin !
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End SubRéférences aux Objets Excel
' Référencer une cellule
Range("A1").Value = "Bonjour" ' Par référence
Cells(1, 1).Value = "Bonjour" ' Par index (ligne, colonne)
ActiveCell.Value = "Cellule active" ' Cellule active
' Référencer une plage
Range("A1:D10").ClearContents ' Vider une plage
Range("A1:A" & derniereLigne).Copy ' Copier une plage dynamique
' Dernière ligne avec données
derniereLigne = Cells(Rows.Count, "A").End(xlUp).Row
' Dernière colonne
dernierColonne = Cells(1, Columns.Count).End(xlToLeft).Column
' Feuilles
Sheets("Données").Activate
Worksheets(1).Name = "Nouveau nom"
ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Rapport"2. Macro 1 : Nettoyage Automatique de Données
La macro la plus universelle — elle transforme des données brutes en données exploitables en 2 secondes.
Sub NettoyerDonnees()
Dim ws As Worksheet
Dim derniereLigne As Long
Dim derniereColonne As Long
Dim rng As Range
Dim cell As Range
Set ws = ActiveSheet
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Trouver la plage de données
derniereLigne = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
derniereColonne = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(derniereLigne, derniereColonne))
' 1. Supprimer les espaces en trop dans toutes les cellules texte
Dim strValue As String
For Each cell In rng
If cell.HasFormula = False And VarType(cell.Value) = vbString Then
cell.Value = Trim(Application.Clean(cell.Value))
End If
Next cell
' 2. Mettre en majuscule la 1ère lettre des colonnes texte clés
Dim colNames As Range
Set colNames = ws.Range("B2:B" & derniereLigne) ' Adapter selon vos colonnes
For Each cell In colNames
If Len(cell.Value) > 0 Then
cell.Value = StrConv(cell.Value, vbProperCase)
End If
Next cell
' 3. Normaliser les emails (minuscules)
Dim colEmail As Range
' Trouver la colonne Email automatiquement
Dim headerRow As Range
Dim emailCol As Long
Set headerRow = ws.Rows(1)
For Each cell In headerRow
If InStr(1, LCase(cell.Value), "email") > 0 Then
emailCol = cell.Column
Exit For
End If
Next cell
If emailCol > 0 Then
Set colEmail = ws.Range(ws.Cells(2, emailCol), ws.Cells(derniereLigne, emailCol))
For Each cell In colEmail
cell.Value = LCase(Trim(cell.Value))
Next cell
End If
' 4. Supprimer les lignes entièrement vides
Dim i As Long
For i = derniereLigne To 2 Step -1
If Application.CountA(ws.Rows(i)) = 0 Then
ws.Rows(i).Delete
End If
Next i
' 5. Supprimer les doublons (basé sur colonne A)
ws.Range(ws.Cells(1, 1), ws.Cells(ws.Cells(ws.Rows.Count, 1).End(xlUp).Row, derniereColonne)).RemoveDuplicates _
Columns:=1, Header:=xlYes
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "Nettoyage terminé ! " & ws.Cells(ws.Rows.Count, 1).End(xlUp).Row - 1 & " lignes traitées.", vbInformation
End Sub3. Macro 2 : Rapport Automatique Multi-Feuilles
Consolide des données de plusieurs feuilles en un rapport unique.
Sub ConsoliderFeuilles()
Dim wsRapport As Worksheet
Dim ws As Worksheet
Dim derniereLigne As Long
Dim ligneRapport As Long
Application.ScreenUpdating = False
' Créer ou vider la feuille Rapport
On Error Resume Next
Set wsRapport = ThisWorkbook.Sheets("Rapport Consolidé")
On Error GoTo 0
If wsRapport Is Nothing Then
Set wsRapport = ThisWorkbook.Sheets.Add()
wsRapport.Name = "Rapport Consolidé"
Else
wsRapport.Cells.Clear
End If
' En-têtes du rapport
wsRapport.Range("A1").Value = "Feuille Source"
wsRapport.Range("B1").Value = "Date"
wsRapport.Range("C1").Value = "Description"
wsRapport.Range("D1").Value = "Montant"
wsRapport.Range("E1").Value = "Statut"
wsRapport.Rows(1).Font.Bold = True
wsRapport.Rows(1).Interior.Color = RGB(15, 23, 42) ' Couleur sombre
wsRapport.Rows(1).Font.Color = RGB(16, 185, 129) ' Vert émeraude
ligneRapport = 2
' Parcourir toutes les feuilles sauf Rapport
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "Rapport Consolidé" And ws.Name <> "Config" Then
derniereLigne = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If derniereLigne > 1 Then
Dim i As Long
For i = 2 To derniereLigne
wsRapport.Cells(ligneRapport, 1).Value = ws.Name
wsRapport.Cells(ligneRapport, 2).Value = ws.Cells(i, 1).Value ' Date
wsRapport.Cells(ligneRapport, 3).Value = ws.Cells(i, 2).Value ' Desc
wsRapport.Cells(ligneRapport, 4).Value = ws.Cells(i, 3).Value ' Montant
wsRapport.Cells(ligneRapport, 5).Value = ws.Cells(i, 4).Value ' Statut
ligneRapport = ligneRapport + 1
Next i
End If
End If
Next ws
' Mise en forme automatique
wsRapport.Range("A1").CurrentRegion.Columns.AutoFit
' Totaux
wsRapport.Cells(ligneRapport + 1, 3).Value = "TOTAL"
wsRapport.Cells(ligneRapport + 1, 4).Formula = "=SUM(D2:D" & ligneRapport - 1 & ")"
wsRapport.Cells(ligneRapport + 1, 3).Font.Bold = True
wsRapport.Cells(ligneRapport + 1, 4).Font.Bold = True
Application.ScreenUpdating = True
MsgBox "Consolidation terminée ! " & ligneRapport - 2 & " lignes importées.", vbInformation
End Sub4. Macro 3 : Export PDF Automatique
Générer un rapport PDF nommé automatiquement avec la date et l’heure.
Sub ExporterEnPDF()
Dim cheminFichier As String
Dim nomFichier As String
Dim dossierSortie As String
' Définir le dossier de sortie (même dossier que le classeur par défaut)
dossierSortie = ThisWorkbook.Path & "\"
' Nom du fichier avec horodatage
nomFichier = "Rapport_" & Format(Now, "YYYYMMDD_HHMMSS") & ".pdf"
cheminFichier = dossierSortie & nomFichier
' Exporter la feuille active en PDF
ActiveSheet.ExportAsFixedFormat _
Type:=xlTypePDF, _
Filename:=cheminFichier, _
Quality:=xlQualityStandard, _
IncludeDocProperties:=True, _
IgnorePrintAreas:=False
' Ouvrir le PDF automatiquement (optionnel)
Shell "explorer.exe """ & cheminFichier & """", vbNormalFocus
MsgBox "PDF exporté : " & nomFichier, vbInformation
End Sub5. Macro 4 : Envoi Email Automatique via Outlook
La macro la plus demandée en entreprise : envoyer un rapport par email automatiquement.
Sub EnvoyerRapportEmail()
Dim outlookApp As Object
Dim email As Object
Dim cheminPDF As String
' Générer le PDF d'abord
CheminPDF = ThisWorkbook.Path & "\Rapport_" & Format(Now, "YYYYMMDD") & ".pdf"
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CheminPDF
' Créer l'email Outlook
Set outlookApp = CreateObject("Outlook.Application")
Set email = outlookApp.CreateItem(0)
With email
.To = "direction@entreprise.com; commercial@entreprise.com"
.CC = "manager@entreprise.com"
.Subject = "Rapport Hebdomadaire — " & Format(Now, "DD/MM/YYYY")
.Body = "Bonjour," & vbCrLf & vbCrLf & _
"Veuillez trouver ci-joint le rapport hebdomadaire automatiquement généré." & vbCrLf & _
"Période : " & Format(Date - 7, "DD/MM/YYYY") & " au " & Format(Date, "DD/MM/YYYY") & vbCrLf & vbCrLf & _
"Ce rapport a été généré automatiquement par Excel." & vbCrLf & _
"Cordialement"
.Attachments.Add CheminPDF
.Send ' Ou .Display pour vérifier avant envoi
End With
Set email = Nothing
Set outlookApp = Nothing
MsgBox "Email envoyé avec succès !", vbInformation
End Sub6. Macros 5-10 : Les Essentielles du Quotidien
' Macro 5 : Créer un tableau Excel formaté automatiquement
Sub CreerTableau()
Dim rng As Range
Set rng = ActiveSheet.Range("A1").CurrentRegion
' Créer le tableau
ActiveSheet.ListObjects.Add(xlSrcRange, rng, , xlYes).Name = "Tableau_Données"
' Appliquer un style
ActiveSheet.ListObjects("Tableau_Données").TableStyle = "TableStyleMedium2"
MsgBox "Tableau créé avec succès !"
End Sub
' Macro 6 : Mise en forme conditionnelle dynamique
Sub MiseEnFormeConditionnelle()
Dim ws As Worksheet
Dim rng As Range
Dim derniereLigne As Long
Set ws = ActiveSheet
derniereLigne = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
Set rng = ws.Range("D2:D" & derniereLigne)
rng.FormatConditions.Delete
' Rouge si négatif ou très bas
With rng.FormatConditions.Add(xlCellValue, xlLess, 10000)
.Interior.Color = RGB(254, 202, 202)
.Font.Color = RGB(153, 27, 27)
End With
' Vert si objectif atteint
With rng.FormatConditions.Add(xlCellValue, xlGreater, 50000)
.Interior.Color = RGB(167, 243, 208)
.Font.Color = RGB(6, 78, 59)
End With
End Sub
' Macro 7 : Importer tous les fichiers CSV d'un dossier
Sub ImporterCSVDossier()
Dim dossier As String
Dim fichier As String
Dim wsNouveau As Worksheet
Dim wb As Workbook
dossier = "C:\Données\CSV\" ' Adapter le chemin
fichier = Dir(dossier & "*.csv")
Do While fichier <> ""
Set wb = Workbooks.Open(dossier & fichier)
wb.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Left(fichier, Len(fichier) - 4)
wb.Close False
fichier = Dir()
Loop
MsgBox "Importation terminée !"
End SubConclusion : Commencer Dès Aujourd’hui
VBA n’est pas un langage du passé — c’est un outil de productivité d’une puissance extraordinaire pour tout utilisateur Excel. La courbe d’apprentissage est rapide et les gains sont immédiats.
Commencez par ces étapes :
- Enregistrez une macro (Onglet Développeur > Enregistrer une macro) et observez le code généré
- Adaptez et personnalisez le code enregistré à vos besoins
- Appliquez les 10 macros de cet article à vos propres fichiers
- Combinez les techniques pour créer des automatisations complexes
👉 Maîtrisez VBA complètement avec notre formation VBA & Automatisation Excel.
