· 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.

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 Sub

Ré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 Sub

3. 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 Sub

4. 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 Sub

5. 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 Sub

6. 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 Sub

Conclusion : 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 :

  1. Enregistrez une macro (Onglet Développeur > Enregistrer une macro) et observez le code généré
  2. Adaptez et personnalisez le code enregistré à vos besoins
  3. Appliquez les 10 macros de cet article à vos propres fichiers
  4. Combinez les techniques pour créer des automatisations complexes

👉 Maîtrisez VBA complètement avec notre formation VBA & Automatisation Excel.

Back to Blog

Related Posts

View All Posts »