Parfait !
Continuons notre exploration du VBA Excel avec des concepts plus avancés qui vous
permettront de créer des solutions encore plus complètes. Cette série d'exercices se concentre
sur les tableaux (Arrays), les collections, les événements d'objets et la création de
procédures plus complexes.
Document d'Exercices d'Application : Les Bases du
VBA Excel (Suite 3)
Ces exercices vous aideront à mieux gérer des ensembles de données en mémoire et à rendre
vos applications plus réactives aux actions de l'utilisateur.
Travail avec les Tableaux (Arrays)
Objectif : Stocker et manipuler des ensembles de données en mémoire pour des traitements
plus rapides et efficaces.
Exercice 21 : Déclarer et remplir un tableau unidimensionnel
1. Dans Module1, ajoutez le code suivant :
Sub TableauUnidimensionnel()
' Déclaration d'un tableau de 5 éléments (indices de 0 à 4 par
défaut)
Dim mesFruits(4) As String ' Tableau de chaînes de caractères
' Remplir le tableau
mesFruits(0) = "Pomme"
mesFruits(1) = "Banane"
mesFruits(2) = "Cerise"
mesFruits(3) = "Datte"
mesFruits(4) = "Orange"
' Afficher les éléments du tableau
Dim i As Integer
Dim message As String
message = "Mes fruits préférés :" & vbCrLf
For i = LBound(mesFruits) To UBound(mesFruits) ' LBound donne
l'indice le plus bas, UBound le plus haut
message = message & "- " & mesFruits(i) & vbCrLf
Next i
MsgBox message, vbInformation, "Tableau de Fruits"
End Sub
2. Exécutez TableauUnidimensionnel.
Exercice 22 : Remplir un tableau à partir d'une plage Excel
1. Dans Feuil1, entrez des données dans la plage A1:A5 (ex: "Janvier", "Février", "Mars",
"Avril", "Mai").
2. Dans Module1, ajoutez :
Sub RemplirTableauDepuisPlage()
Dim mois() As Variant ' Utiliser Variant car la plage peut
contenir différents types
Dim plageSource As Range
Set plageSource = ThisWorkbook.Sheets("Feuil1").Range("A1:A5")
' Charger la plage dans un tableau (le tableau sera
bidimensionnel même pour une seule colonne)
mois = plageSource.Value
' Afficher les éléments (le tableau est 1-basé ici à cause de
.Value)
Dim i As Integer
Dim message As String
message = "Mois chargés depuis Excel :" & vbCrLf
' Le tableau `mois` aura des dimensions (1 à 5, 1 à 1) pour
une colonne A1:A5
For i = LBound(mois, 1) To UBound(mois, 1)
message = message & "- " & mois(i, 1) & vbCrLf
Next i
MsgBox message, vbInformation, "Mois de l'Année"
End Sub
3. Exécutez RemplirTableauDepuisPlage.
Exercice 23 : Utiliser un tableau dynamique avec ReDim Preserve
1. Dans Module1, ajoutez :
Sub TableauDynamique()
Dim elements() As String ' Tableau dynamique (sans taille
fixe)
Dim compteur As Integer
Dim saisie As String
compteur = 0
Do
saisie = InputBox("Entrez un élément (laissez vide pour
terminer) :", "Ajouter au Tableau")
If Trim(saisie) <> "" Then
' Redimensionner le tableau en conservant les données
existantes
ReDim Preserve elements(compteur)
elements(compteur) = saisie
compteur = compteur + 1
End If
Loop While Trim(saisie) <> ""
If compteur > 0 Then
Dim i As Integer
Dim message As String
message = "Éléments saisis :" & vbCrLf
For i = 0 To compteur - 1
message = message & "- " & elements(i) & vbCrLf
Next i
MsgBox message, vbInformation, "Votre Tableau Dynamique"
Else
MsgBox "Aucun élément n'a été saisi.", vbInformation
End If
End Sub
2. Exécutez TableauDynamique. Entrez plusieurs éléments, puis laissez la zone vide pour
terminer.
Travail avec les Collections
Objectif : Gérer des ensembles d'objets, avec la possibilité d'ajouter, supprimer et accéder aux
éléments par clé ou par index.
Exercice 24 : Créer et manipuler une collection simple
1. Dans Module1, ajoutez :
Sub UtiliserCollection()
Dim mesObjets As New Collection ' Crée une nouvelle collection
Dim element As Variant
' Ajouter des éléments à la collection
mesObjets.Add "Premier élément", "Cle1" ' Ajoute avec une
clé
mesObjets.Add "Deuxième élément", "Cle2"
mesObjets.Add "Troisième élément" ' Ajoute sans clé
(sera indexé numériquement)
mesObjets.Add "Quatrième élément", "Cle4"
' Accéder aux éléments par index
MsgBox "Deuxième élément (par index 2) : " &
mesObjets.Item(2), vbInformation
' Accéder aux éléments par clé
MsgBox "Élément avec Cle4 : " & mesObjets.Item("Cle4"),
vbInformation
' Parcourir la collection
Dim message As String
message = "Contenu de la collection :" & vbCrLf
For Each element In mesObjets
message = message & "- " & element & vbCrLf
Next element
MsgBox message, vbInformation, "Ma Collection"
' Supprimer un élément par clé
On Error Resume Next ' Au cas où la clé n'existe pas
mesObjets.Remove "Cle2"
On Error GoTo 0
MsgBox "Après suppression de 'Cle2', taille de la collection :
" & mesObjets.Count, vbInformation
' Tenter d'accéder à un élément supprimé (devrait générer une
erreur si On Error n'est pas utilisé)
' MsgBox mesObjets.Item("Cle2") ' Ceci causerait une erreur si
la gestion d'erreur n'est pas active
End Sub
2. Exécutez UtiliserCollection.
Événements d'Objets (Feuille de Calcul et Classeur)
Objectif : Exécuter du code automatiquement en réponse à des actions spécifiques de
l'utilisateur ou du système sur des objets Excel.
Exercice 25 : Répondre à un clic sur une cellule (Événement
Worksheet_SelectionChange)
1. Dans l'Éditeur VBA, double-cliquez sur Feuil1 (Feuil1) dans l'Explorateur de projets
(sous Microsoft Excel Objets). C'est ici que le code des événements de feuille doit être
placé.
2. Dans la liste déroulante de gauche (Objet), sélectionnez Worksheet.
3. Dans la liste déroulante de droite (Procédure), sélectionnez SelectionChange.
4. Le code suivant devrait apparaître :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Ce code s'exécute chaque fois que la sélection de cellule
change
' Vérifier si la cellule sélectionnée est A1
If Not Intersect(Target, Range("A1")) Is Nothing Then
MsgBox "Vous avez sélectionné la cellule A1 !",
vbInformation, "A1 sélectionné"
End If
' Afficher l'adresse de la cellule sélectionnée dans la barre
de statut
Application.StatusBar = "Cellule sélectionnée : " &
Target.Address(False, False)
' Changer la couleur de fond de la cellule sélectionnée
(temporaire)
' Prudence avec cette fonctionnalité, elle peut ralentir si
elle est trop complexe
' Static derniereCellule As Range
' If Not derniereCellule Is Nothing Then
' derniereCellule.Interior.Color = xlNone ' Réinitialiser
l'ancienne couleur
' End If
' Target.Interior.Color = RGB(200, 255, 200) ' Nouvelle
couleur (vert clair)
' Set derniereCellule = Target
End Sub
5. Retournez à Excel et cliquez sur différentes cellules, notamment A1. Observez le
comportement.
Exercice 26 : Répondre à une modification de cellule (Événement Worksheet_Change)
1. Restez dans le module de Feuil1.
2. Dans la liste déroulante de gauche (Objet), sélectionnez Worksheet.
3. Dans la liste déroulante de droite (Procédure), sélectionnez Change.
4. Ajoutez le code suivant (ajustez le code existant si la procédure est déjà là) :
Private Sub Worksheet_Change(ByVal Target As Range)
' Ce code s'exécute chaque fois que le contenu d'une cellule
change
' Vérifier si la cellule modifiée est B1
If Not Intersect(Target, Range("B1")) Is Nothing Then
If Target.Value = "VBA" Then
MsgBox "Vous avez écrit 'VBA' dans B1 ! Bravo !",
vbInformation
Else
MsgBox "Le contenu de B1 a été modifié en : " &
Target.Value, vbInformation
End If
End If
' Exemple : Valider une entrée numérique dans la colonne C
If Not Intersect(Target, Columns("C")) Is Nothing Then
If Not IsNumeric(Target.Value) And Target.Value <> "" Then
MsgBox "Veuillez n'entrer que des nombres dans la
colonne C.", vbExclamation
Application.EnableEvents = False ' Désactiver
temporairement les événements pour éviter une boucle infinie
Target.ClearContents ' Effacer le contenu non
numérique
Application.EnableEvents = True ' Réactiver les
événements
End If
End If
End Sub
5. Retournez à Excel.
○ Tapez "VBA" dans la cellule B1.
○ Tapez du texte dans une cellule de la colonne C (ex: C1). Observez la validation.
Exercice 27 : Événement à l'ouverture du classeur (Workbook_Open)
1. Dans l'Éditeur VBA, double-cliquez sur ThisWorkbook dans l'Explorateur de projets.
C'est ici que le code des événements du classeur doit être placé.
2. Dans la liste déroulante de gauche (Objet), sélectionnez Workbook.
3. Dans la liste déroulante de droite (Procédure), sélectionnez Open.
4. Le code suivant devrait apparaître :
Private Sub Workbook_Open()
' Ce code s'exécute automatiquement à l'ouverture du classeur
MsgBox "Bienvenue dans votre classeur VBA ! Heure d'ouverture
: " & Now, vbInformation, "Ouverture Classeur"
' Optionnel : Activer une feuille spécifique
' ThisWorkbook.Sheets("Feuil1").Activate
' Optionnel : Cacher toutes les alertes au démarrage (à
réactiver à la fin de vos macros)
' Application.DisplayAlerts = False
End Sub
5. Enregistrez votre classeur (par exemple, sous MonClasseurVBA.xlsm car il contient
des macros).
6. Fermez le classeur, puis rouvrez-le. Observez la boîte de message apparaître
automatiquement.
Projets Mini-Simulés (Intégration des Concepts)
Objectif : Mettre en pratique plusieurs concepts appris pour résoudre un petit problème.
Exercice 28 : Générateur de Mot de Passe Simple
1. Dans Module1, ajoutez :
Function GenererMotDePasse(longueur As Integer) As String
Dim caracteresPossibles As String
caracteresPossibles =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#
$%^&*()_+"
Dim mdp As String
Dim i As Integer
If longueur <= 0 Then
GenererMotDePasse = ""
Exit Function
End If
Randomize ' Initialise le générateur de nombres aléatoires
For i = 1 To longueur
' Sélectionne un caractère aléatoire
mdp = mdp & Mid(caracteresPossibles,
Int((Len(caracteresPossibles) - 1 + 1) * Rnd + 1), 1)
Next i
GenererMotDePasse = mdp
End Function
Sub TesterGenerateurMDP()
Dim longueurMDP As Integer
Dim nouveauMDP As String
longueurMDP = InputBox("Quelle longueur de mot de passe
souhaitez-vous ?", "Générateur de Mot de Passe", 10)
If IsNumeric(longueurMDP) And longueurMDP > 0 Then
nouveauMDP = GenererMotDePasse(longueurMDP)
MsgBox "Votre nouveau mot de passe est : " & nouveauMDP,
vbInformation, "Mot de Passe Généré"
' Optionnel : Écrire le mot de passe dans une cellule
(prudence pour la sécurité !)
' Range("A1").Value = nouveauMDP
Else
MsgBox "Veuillez entrer une longueur numérique valide et
positive.", vbExclamation
End If
End Sub
2. Exécutez TesterGenerateurMDP. Testez avec différentes longueurs.
Exercice 29 : Nettoyage de Données Basique
1. Dans Feuil1, entrez des données "sales" dans la colonne A et B. Exemples :
○ A1: " Article 1 "
○ B1: "1 234,56 €"
○ A2: "Article 2"
○ B2: " 54,00 $"
○ A3: " Article 3"
○ B3: "Texte non numérique"
2. Dans Module1, ajoutez :
Sub NettoyageDonnees()
Dim plageDonnees As Range
Dim cellule As Range
Dim derniereLigne As Long
' Définir la plage de données (par exemple, colonnes A et B)
With ThisWorkbook.Sheets("Feuil1")
derniereLigne = .Cells(Rows.Count, 1).End(xlUp).Row
Set plageDonnees = .Range("A1:B" & derniereLigne)
End With
If plageDonnees.Row = 1 And plageDonnees.Cells.Count = 1 And
IsEmpty(plageDonnees.Value) Then
MsgBox "La plage de données est vide.", vbInformation
Exit Sub
End If
Application.ScreenUpdating = False ' Désactiver la mise à jour
de l'écran
For Each cellule In plageDonnees
' Nettoyer les espaces superflus
If TypeName(cellule.Value) = "String" Then
cellule.Value = Trim(cellule.Value)
End If
' Convertir les valeurs numériques avec nettoyage de
symboles monétaires
If Not IsEmpty(cellule.Value) And InStr(cellule.Address,
"$B$") > 0 Then ' Si c'est dans la colonne B
Dim valeurNumerique As String
valeurNumerique = Replace(cellule.Value, "€", "")
valeurNumerique = Replace(valeurNumerique, "$", "")
valeurNumerique = Replace(valeurNumerique, " ", "") '
Supprimer les espaces dans les nombres (ex: "1 234,56")
valeurNumerique = Replace(valeurNumerique, ",",
Application.DecimalSeparator) ' S'assurer que le séparateur
décimal est correct
On Error Resume Next ' Gérer les erreurs de conversion
cellule.Value = CDbl(valeurNumerique)
If Err.Number <> 0 Then
MsgBox "Erreur de conversion pour la cellule " &
cellule.Address & ": " & cellule.Value, vbExclamation
cellule.Interior.Color = RGB(255, 200, 200) '
Mettre en rouge les cellules avec erreur
Err.Clear
End If
On Error GoTo 0
End If
Next cellule
Application.ScreenUpdating = True ' Réactiver la mise à jour
de l'écran
MsgBox "Nettoyage des données terminé. Vérifiez les cellules
mises en évidence en rouge.", vbInformation, "Nettoyage Terminé"
End Sub
3. Exécutez NettoyageDonnees. Observez les changements dans la feuille.
Exercice 30 : Sauvegarde Automatique avec Date/Heure
1. Dans Module1, ajoutez :
Sub SauvegardeAutomatique()
Dim cheminComplet As String
Dim nomFichier As String
Dim dossierCible As String
' Définir le dossier cible (le même dossier que le classeur
actuel par défaut)
dossierCible = ThisWorkbook.Path
' Si le classeur n'est pas encore enregistré, demander à
l'utilisateur où sauvegarder
If dossierCible = "" Then
MsgBox "Le classeur doit être enregistré au moins une fois
pour utiliser la sauvegarde automatique.", vbExclamation
Exit Sub
End If
' Construire le nom du fichier avec date et heure
nomFichier = "Sauvegarde_" & Format(Now, "yyyymmdd_hhmmss") &
".xlsm"
cheminComplet = dossierCible & "\" & nomFichier
' Sauvegarder une copie du classeur
On Error GoTo ErreurSauvegarde
ThisWorkbook.SaveCopyAs cheminComplet
MsgBox "Le classeur a été sauvegardé sous : " & cheminComplet,
vbInformation, "Sauvegarde Réussie"
Exit Sub
ErreurSauvegarde:
MsgBox "Une erreur est survenue lors de la sauvegarde : " &
Err.Description, vbCritical
End Sub
2. Enregistrez votre classeur au moins une fois (sous un nom comme
MonProjetVBA.xlsm).
3. Exécutez SauvegardeAutomatique. Vérifiez le dossier pour trouver le fichier de
sauvegarde.
Ces exercices vous plongent dans des aspects plus pratiques et essentiels du VBA. N'oubliez
pas l'importance de :
● Débogage : Utilisez F8 pour le pas à pas, Ctrl+G pour la fenêtre Exécution.
● Comprendre On Error : Maîtrisez son utilisation pour créer des macros robustes.
● Pratiquer les objets : Plus vous manipulerez des Range, Worksheet, Workbook,
Application, plus vous serez à l'aise.
Continuez à explorer et à expérimenter !