Cours Complet VBA Excel

Formation Progressive de Débutant à Avancé

Sommaire du Cours

Cours Complet VBA Excel : De Zéro à Héros de l'Automatisation

Introduction : Pourquoi le VBA est votre Super-Pouvoir dans Excel

Le VBA, ou Visual Basic for Applications, est le langage de programmation intégré à Excel (et aux autres logiciels Office). Imaginez que vous avez un assistant personnel ultra-rapide qui peut exécuter des tâches répétitives, complexes ou chronophages en un seul clic. C'est exactement ce que le VBA vous permet de faire !

Pourquoi apprendre le VBA ?


Partie 1 : Premiers Pas et Environnement de Travail

↑ Retour en haut
### 1.1 Activer l'onglet Développeur Pour commencer, vous devez rendre visible l'outil magique : l'onglet **Développeur**. 1. Allez dans **Fichier** > **Options**. 2. Cliquez sur **Personnaliser le ruban**. 3. Dans la colonne de droite, cochez la case **Développeur**. 4. Cliquez sur **OK**. ### 1.2 L'Éditeur Visual Basic (VBE) C'est votre laboratoire secret ! Pour y accéder : * Cliquez sur l'onglet **Développeur** > **Visual Basic**. * Le raccourci clavier le plus rapide : **ALT + F11**. Le VBE est divisé en plusieurs fenêtres : * **Explorateur de Projet (à gauche) :** Il liste tous les classeurs ouverts, les feuilles, et les modules (là où vous écrivez votre code). * **Fenêtre de Code (au centre) :** C'est ici que vous tapez vos instructions. * **Fenêtre Propriétés (en bas à gauche) :** Elle affiche les caractéristiques de l'objet sélectionné (feuille, classeur, etc.). ### 1.3 Votre Première Macro : "Bonjour le Monde" Une macro est simplement un ensemble d'instructions VBA. Nous allons en créer une simple. 1. Dans le VBE, allez dans **Insertion** > **Module**. Un nouveau module apparaît dans l'Explorateur de Projet. 2. Dans la fenêtre de code du module, tapez le code suivant :
Sub BonjourMonde()
    ' Ceci est un commentaire, il n'est pas exécuté
    MsgBox "Bonjour le monde du VBA !"
End Sub
**Explication :** * `Sub BonjourMonde()` : Déclare le début de votre procédure (votre macro). * `MsgBox` : Est une instruction qui affiche une boîte de message à l'écran. * `End Sub` : Indique la fin de la procédure. Pour l'exécuter, placez votre curseur n'importe où dans la macro et appuyez sur **F5** ou cliquez sur le bouton **Exécuter** (le triangle vert). ---

Partie 2 : Les Bases du Langage VBA

↑ Retour en haut
### 2.1 Les Variables : Des Boîtes pour Stocker l'Information Une variable est un espace nommé dans la mémoire de l'ordinateur pour stocker une valeur. C'est comme une boîte étiquetée. **Déclaration :** On utilise le mot-clé `Dim` (Dimension).
Dim nomDeMaVariable As TypeDeDonnee
**Types de Données Courants :** | Type de Donnée | Description | Exemple de Valeur | | :--- | :--- | :--- | | `Long` | Nombres entiers (grands) | 150000 | | `Integer` | Nombres entiers (petits) | 42 | | `String` | Texte | "Mon texte" | | `Double` | Nombres décimaux | 3.14159 | | `Boolean` | Vrai ou Faux | True ou False | | `Date` | Dates et heures | #11/11/2025# | | `Variant` | Peut contenir n'importe quel type (à éviter si possible) | | **Exemple Précis :**
Sub DeclarationEtUtilisation()
    ' 1. Déclaration des variables
    Dim ageUtilisateur As Integer
    Dim nomProduit As String
    Dim prixUnitaire As Double

    ' 2. Affectation des valeurs
    ageUtilisateur = 35
    nomProduit = "Clavier Ergonomique"
    prixUnitaire = 49.99

    ' 3. Utilisation des variables
    MsgBox "Le produit " & nomProduit & " coûte " & prixUnitaire & " €."
End Sub
### 2.2 Les Constantes : Des Valeurs Immuables Une constante est une variable dont la valeur ne peut pas changer pendant l'exécution du code.
Const TauxTVA As Double = 0.20
---

Partie 3 : Les Objets Fondamentaux d'Excel

↑ Retour en haut
Le VBA fonctionne en manipulant des **objets**. Un objet est un élément d'Excel (un classeur, une feuille, une cellule, etc.) qui possède des **propriétés** (ses caractéristiques) et des **méthodes** (les actions qu'il peut effectuer). ### 3.1 L'Objet `Range` : La Cellule, le Cœur d'Excel L'objet `Range` représente une ou plusieurs cellules. C'est l'objet le plus utilisé. **Syntaxe pour cibler une cellule :**
' 1. Par son adresse (le plus courant)
Range("A1").Value = "Titre"

' 2. Par la méthode Cells(ligne, colonne)
Cells(2, 1).Value = 100 ' Équivalent à Range("A2")
**Exemple Précis : Manipulation de Cellules**
Sub ManipulationCellules()
    ' Écrire une valeur dans la cellule B5
    Range("B5").Value = "Total Ventes"

    ' Lire la valeur de A1 et l'afficher
    Dim valeurA1 As Variant
    valeurA1 = Range("A1").Value
    MsgBox "La valeur de A1 est : " & valeurA1

    ' Changer la couleur de fond de la cellule C1
    Range("C1").Interior.Color = RGB(255, 0, 0) ' Rouge

    ' Sélectionner une plage de cellules (A1 à D10)
    Range("A1:D10").Select
End Sub
### 3.2 Les Objets `Worksheet` et `Workbook` * **`Worksheet` (Feuille de calcul) :** Représente une feuille. * **`Workbook` (Classeur) :** Représente le fichier Excel entier. **Exemple Précis :**
Sub GestionFeuillesEtClasseurs()
    ' Cibler la feuille nommée "Données"
    Worksheets("Données").Activate

    ' Ajouter une nouvelle feuille et la renommer
    Worksheets.Add.Name = "Rapport"

    ' Sauvegarder le classeur actif
    ActiveWorkbook.Save

    ' Fermer le classeur (sans sauvegarder)
    ThisWorkbook.Close SaveChanges:=False
End Sub
---

Partie 4 : Les Structures de Contrôle

↑ Retour en haut
Ces structures permettent à votre code de prendre des décisions et de s'adapter aux données. ### 4.1 La Condition `If...Then...Else` Elle permet d'exécuter un bloc de code si une condition est VRAIE. **Syntaxe :**
If condition Then
    ' Code à exécuter si la condition est VRAIE
ElseIf autre_condition Then
    ' Code si la première est FAUSSE et la seconde VRAIE
Else
    ' Code à exécuter si toutes les conditions sont FAUSSES
End If
**Exemple Précis : Vérification de Stock**
Sub VerifierStock()
    Dim stock As Integer
    stock = Range("A1").Value

    If stock > 100 Then
        MsgBox "Stock suffisant."
    ElseIf stock > 0 Then
        MsgBox "Stock faible, commander rapidement."
    Else
        MsgBox "RUPTURE DE STOCK !"
    End If
End Sub
### 4.2 La Condition `Select Case` Idéale pour tester une variable contre plusieurs valeurs possibles. C'est plus propre qu'une longue série de `ElseIf`. **Exemple Précis : Attribuer une Mention**
Sub AttribuerMention()
    Dim note As Integer
    note = Range("B2").Value
    Dim mention As String

    Select Case note
        Case 0 To 9
            mention = "Échec"
        Case 10 To 13
            mention = "Passable"
        Case 14 To 16
            mention = "Bien"
        Case Is >= 17
            mention = "Très Bien"
        Case Else
            mention = "Note Invalide"
    End Select

    Range("C2").Value = mention
End Sub
---

Partie 5 : Les Boucles : Répéter sans se Répéter

↑ Retour en haut
Les boucles sont essentielles pour traiter de grandes quantités de données. Elles permettent d'exécuter le même bloc de code plusieurs fois. ### 5.1 La Boucle `For...Next` : Répéter un Nombre Fixe de Fois Utilisée lorsque vous savez exactement combien de fois vous devez répéter l'action. **Syntaxe :**
For compteur = debut To fin [Step pas]
    ' Code à répéter
Next compteur
**Exemple Précis : Remplir une Colonne**
Sub RemplirColonne()
    Dim i As Integer

    ' Remplir les 10 premières lignes de la colonne A
    For i = 1 To 10
        Cells(i, 1).Value = "Ligne n° " & i
    Next i
End Sub
### 5.2 La Boucle `For Each...Next` : Parcourir une Collection d'Objets La plus pratique pour parcourir toutes les feuilles, toutes les cellules d'une plage, ou tous les objets d'une collection. **Exemple Précis : Masquer toutes les Feuilles Vides**
Sub MasquerFeuillesVides()
    Dim ws As Worksheet

    ' Parcourir chaque feuille du classeur actif
    For Each ws In ThisWorkbook.Worksheets
        ' Si la feuille a moins de 5 cellules utilisées, on la considère vide
        If Application.CountA(ws.Cells) < 5 Then
            ws.Visible = xlSheetHidden ' Masquer la feuille
        End If
    Next ws
End Sub
### 5.3 La Boucle `Do While...Loop` : Répéter Tant qu'une Condition est Vraie Utilisée lorsque vous ne savez pas à l'avance combien de fois la boucle doit s'exécuter. **Exemple Précis : Trouver la Première Cellule Vide**
Sub TrouverPremiereLigneVide()
    Dim ligne As Long
    ligne = 1

    ' Tant que la cellule de la colonne A n'est PAS vide
    Do While Cells(ligne, 1).Value <> ""
        ligne = ligne + 1 ' Passer à la ligne suivante
    Loop

    ' Écrire le résultat dans la première ligne vide trouvée
    Cells(ligne, 1).Value = "Nouvelle Entrée"
End Sub
---

Partie 6 : Les Procédures et Fonctions

↑ Retour en haut
### 6.1 Les Procédures (`Sub`) C'est ce que nous avons utilisé jusqu'à présent. Une procédure exécute une série d'actions mais ne renvoie pas de valeur. ### 6.2 Les Fonctions (`Function`) Une fonction est similaire à une procédure, mais elle est conçue pour **calculer et renvoyer une seule valeur**. Elles sont utilisées comme les fonctions intégrées d'Excel. **Syntaxe :**
Function NomDeMaFonction(argument1 As Type, argument2 As Type) As TypeDeRetour
    ' Code de calcul
    NomDeMaFonction = resultat
End Function
**Exemple Précis : Calculer le Prix TTC** Créons une fonction personnalisée pour calculer le prix toutes taxes comprises (TTC).
Function CalculerTTC(prixHT As Double, Optional taux As Double = 0.2) As Double
    ' Le type de retour est Double

    ' Calcul
    Dim prixTTC As Double
    prixTTC = prixHT * (1 + taux)

    ' La fonction renvoie la valeur en affectant le résultat à son nom
    CalculerTTC = prixTTC
End Function
**Utilisation :** Dans Excel, vous pouvez maintenant taper `=CalculerTTC(A1)` dans une cellule. ---

Partie 7 : Gestion des Erreurs

↑ Retour en haut
Le code VBA peut planter si, par exemple, il essaie de diviser par zéro ou de cibler une feuille qui n'existe pas. La gestion des erreurs permet d'éviter ces plantages. ### 7.1 L'Instruction `On Error` L'instruction la plus courante est `On Error GoTo`. **Syntaxe :**
Sub MaMacroSecurisee()
    ' 1. Activer la gestion d'erreur
    On Error GoTo GestionErreur

    ' Code normal
    Worksheets("FeuilleInexistante").Activate ' Cette ligne va générer une erreur
    MsgBox "Ceci ne s'affichera pas si l'erreur survient."

    ' 2. Sortir de la procédure si tout va bien
    Exit Sub

' 3. Étiquette de gestion d'erreur
GestionErreur:
    ' Code à exécuter en cas d'erreur
    MsgBox "Une erreur est survenue : " & Err.Description

    ' Réinitialiser la gestion d'erreur
    On Error GoTo 0
End Sub
**Explication :** * `On Error GoTo GestionErreur` : Si une erreur survient, le code saute immédiatement à l'étiquette `GestionErreur:`. * `Exit Sub` : Empêche le code de la gestion d'erreur de s'exécuter si la macro se termine normalement. * `Err.Description` : Propriété de l'objet `Err` qui donne la description de l'erreur. ---

Partie 8 : Interaction avec l'Utilisateur

↑ Retour en haut
Le VBA permet de communiquer avec l'utilisateur via des boîtes de dialogue. ### 8.1 La Boîte de Message (`MsgBox`) Nous l'avons déjà vue. Elle affiche une information et attend que l'utilisateur clique sur OK. ### 8.2 La Boîte de Saisie (`InputBox`) Elle permet de demander une information à l'utilisateur. **Syntaxe :**
variable = InputBox(prompt, [title], [default])
**Exemple Précis : Demander un Nom de Fichier**
Sub DemanderNom()
    Dim nomFichier As String

    nomFichier = InputBox("Quel nom voulez-vous donner au nouveau rapport ?", "Saisie Utilisateur", "Rapport_Mensuel")

    If nomFichier <> "" Then
        MsgBox "Le fichier sera nommé : " & nomFichier
    Else
        MsgBox "Opération annulée."
    End If
End Sub
---

Partie 9 : Optimisation et Bonnes Pratiques

↑ Retour en haut
Pour que vos macros soient rapides et fiables, quelques astuces de pro : ### 9.1 Accélérer l'Exécution Le VBA est ralenti par les mises à jour de l'écran et les calculs automatiques d'Excel. Désactivez-les temporairement !
Sub MacroRapide()
    ' Désactiver les mises à jour d'écran et les événements
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual ' Désactiver le recalcul

    ' Votre code très long ici...

    ' Rétablir les paramètres à la fin (TRÈS IMPORTANT !)
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub
### 9.2 Utiliser les Variables Objets (`Set`) Pour manipuler des objets complexes (comme une feuille ou une plage), il est plus efficace de les stocker dans une variable objet.
Sub UtiliserVariablesObjets()
    ' Déclaration de la variable objet
    Dim ws As Worksheet

    ' Affectation de l'objet à la variable (mot-clé SET obligatoire)
    Set ws = ThisWorkbook.Worksheets("Feuille1")

    ' Utilisation de la variable (plus rapide et plus lisible)
    ws.Range("A1").Value = "OK"
    ws.Range("B1").Value = "Terminé"

    ' Libérer la mémoire (bonne pratique)
    Set ws = Nothing
End Sub
### 9.3 Utiliser `With...End With` Pour éviter de répéter le nom d'un objet plusieurs fois, utilisez `With`.
' Au lieu de :
' Range("A1").Font.Bold = True
' Range("A1").Font.Italic = True
' Range("A1").Interior.Color = vbYellow

' Utilisez :
With Range("A1")
    .Font.Bold = True
    .Font.Italic = True
    .Interior.Color = vbYellow
End With
---

Partie 10 : Exemple Pratique Complet : Le Nettoyeur de Données

↑ Retour en haut
Cet exemple combine plusieurs notions vues pour créer une macro utile : elle nettoie une colonne de données en supprimant les doublons et en triant le résultat.
Sub NettoyeurDeDonnees()

    ' 1. Optimisation pour la vitesse
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' Déclaration des variables objets
    Dim ws As Worksheet
    Dim derniereLigne As Long
    Dim plageDonnees As Range

    ' Cibler la feuille active
    Set ws = ActiveSheet

    ' 2. Déterminer la plage de données (colonne A)
    ' Trouver la dernière ligne non vide de la colonne A
    derniereLigne = ws.Cells(Rows.Count, "A").End(xlUp).Row

    ' Définir la plage de A1 jusqu'à la dernière ligne
    Set plageDonnees = ws.Range("A1:A" & derniereLigne)

    ' 3. Supprimer les doublons
    plageDonnees.RemoveDuplicates Columns:=1, Header:=xlYes

    ' 4. Trier les données restantes
    ws.Sort.SortFields.Clear
    ws.Sort.SortFields.Add Key:=ws.Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

    With ws.Sort
        .SetRange plageDonnees
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' 5. Rétablir les paramètres
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic

    ' Message de confirmation
    MsgBox "Nettoyage de la colonne A terminé : doublons supprimés et données triées.", vbInformation

    ' Libérer la mémoire
    Set ws = Nothing
    Set plageDonnees = Nothing
End Sub
Ce cours vous donne les bases solides pour commencer à automatiser vos tâches. La clé est la pratique : essayez de réécrire ces exemples et de les adapter à vos propres besoins !