Cours VBA
Cours VBA
VBA
Dr Cedric YAO
Enseignant chercheur au
Département informatique de
l’IUA
Page 1 of 143
Table des matières
Chapitre 0 : Introduction ............................................................................................................ 7
Démarrage .............................................................................................................................. 7
With .................................................................................................................................. 25
Colorindex ........................................................................................................................ 26
Page 2 of 143
Color ................................................................................................................................. 27
Exemple pratique.............................................................................................................. 34
Tableaux ............................................................................................................................... 37
Instruction IF ........................................................................................................................ 43
ELSEIF ................................................................................................................................. 48
Le caractère * ................................................................................................................... 57
Le caractère # ................................................................................................................... 57
Le caractère ? ................................................................................................................... 57
boucle Do ............................................................................................................................. 59
Do loop ................................................................................................................................. 59
Page 3 of 143
For each next ........................................................................................................................ 61
Cas Pratique.......................................................................................................................... 63
MsgBox ................................................................................................................................ 77
Inputbox ............................................................................................................................... 81
Page 4 of 143
WORKBOOK_SHEETSELECTIONCHANGE (À CHAQUE CHANGEMENT DE
SÉLECTION) ................................................................................................................... 87
UserForm .............................................................................................................................. 91
TITRE DE L'USERFORM............................................................................................... 92
Page 5 of 143
INSERTION DES DONNÉES....................................................................................... 116
Page 6 of 143
Chapitre 0 : Introduction
Démarrage
Le VBA (Visual Basic for Applications) est un langage proche du Visual Basic qui nécessite
une application hôte pour s'exécuter (Excel dans notre cas). Grâce au VBA nous allons pouvoir
réaliser à peu près tout ce que l'on souhaite avec Excel. Mais avant de démarrer, commençons
par afficher les outils qui nous seront utiles.
Page 7 of 143
Pour travailler avec du code VBA, nous avons besoin d'un éditeur, celui-ci est déjà installé et
vous pouvez l'ouvrir avec le raccourci Alt + F11 (ou en cliquant sur Visual Basic depuis l'onglet
Développeur) :
Première macro
Il est possible d'automatiser certaines tâches en toute simplicité grâce à l'enregistreur de macros.
Pour prendre un exemple simple, nous allons automatiser les opérations suivantes :
Page 8 of 143
Pour ce faire, cliquez sur Enregistrer une macro puis sur Ok, exécutez les opérations décrites
ci-dessus sans interruption (car toutes les manipulations sont enregistrées) et pour terminer
cliquez sur Arrêter l'enregistrement.
Excel a enregistré vos manipulations et les a traduites en code VBA. Pour voir votre macro,
ouvrez l'éditeur (Alt + F11) et cliquez sur Module1 :
Ce code correspond aux manipulations enregistrées. Nous allons nous arrêter quelques instants
sur le code généré :
Sub Macro1()
'
Page 9 of 143
'
'
Columns("A:A").Select
[Link]
Columns("C:C").Select
[Link]
Columns("B:B").Select
[Link] Destination:=Columns("A:A")
Columns("D:D").Select
[Link] Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Sub et End Sub délimitent le début et la fin de la macro, Macro1 correspond au nom de cette
macro :
Sub Macro1()
End Sub
Nous allons maintenant modifier le nom de cette macro et lui attribuer un nom qui soit un peu
plus parlant. Pour cela, remplacez simplement Macro1 par manipulationsDesColonnes (le nom
ne doit pas contenir d'espaces) :
Sub manipulationsDesColonnes()
Le texte en vert (texte précédé d'une apostrophe) est un commentaire, il n'est pas pris en compte
à l'exécution du code :
'
'
Les commentaires sont très utiles pour s'y retrouver lorsque l'on dispose de beaucoup de code
ou pour ne pas exécuter certaines lignes de code sans pour autant les supprimer.
Sub manipulationsDesColonnes()
Columns("A:A").Select
[Link]
Columns("C:C").Select
[Link]
Columns("B:B").Select
[Link] Destination:=Columns("A:A")
Columns("D:D").Select
[Link] Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Nous souhaitons maintenant que cette macro s'exécute en cliquant sur un bouton. Insérez un
bouton en cliquant sur Insérer Bouton (Contrôles de formulaires) :
Page 11 of 143
Tracez votre bouton et sélectionnez ensuite simplement votre macro :
Page 12 of 143
Chapitre 1 : Feuilles et cellules
Les Sélections
Nous allons créer une macro qui sélectionnera une cellule de notre choix. Ouvrez l'éditeur et
ajoutez-y un module :
Sub exemple()
End Sub
Créez maintenant un bouton de formulaire auquel vous allez associer cette macro (vide pour le
moment) :
Page 13 of 143
Complétez votre macro avec ceci :
Sub exemple()
'Sélection de la cellule A8
Range("A8").Select
End Sub
Vous pouvez tester cette macro en cliquant sur votre bouton de formulaire, la cellule A8 est
alors sélectionnée. Nous allons maintenant modifier cette macro pour sélectionner la cellule A8
de la seconde feuille :
Sub exemple()
'Activation de la feuille 2
Sheets("Feuil2").Activate
'Sélection de la cellule A8
Range("A8").Select
End Sub
Page 14 of 143
Aidez-vous des commentaires (texte en vert) pour bien comprendre les macros de ce cours.
Sub exemple()
Range("A1:A8").Select
End Sub
Sub exemple()
Range("A8, C5").Select
End Sub
Sub exemple()
Range("ma_plage").Select
End Sub
Sub exemple()
Page 15 of 143
'Sélection des cellules de la plage "ma_plage"
Range("B3:B8").Select
End Sub
Sub exemple()
Cells(8, 1).Select
End Sub
Cette autre manière de sélectionner permet des sélections plus dynamiques et sera bien utile par
la suite.
Sub exemple()
'Traduction :
'Cells([nombre_aléatoire_entre_1_et_10], 1).Select
End Sub
Ici, le numéro de ligne est Int(Rnd * 10) + 1, autrement dit un nombre entre 1 et 10 (inutile de
retenir ce code pour le moment).
Sélection de lignes
Il est possible de sélectionner des lignes entières avec Range ou Rows (Rows étant spécifique
aux lignes) :
Sub exemple()
Page 16 of 143
Range("2:6").Select
End Sub
Sub exemple()
Rows("2:6").Select
End Sub
Sélection de colonnes
Tout comme pour les lignes, il est possible de sélectionner des colonnes entières avec Range
ou Columns (Columns étant spécifique aux colonnes) :
Sub exemple()
Range("B:G").Select
End Sub
Sub exemple()
Columns("B:G").Select
End Sub
Les propriétés
Commencez par ouvrir l'éditeur, ajoutez-y un module, copiez la macro ci-dessous et associez-
la à un bouton de formulaire.
Sub proprietes()
'Macro incomplète
Page 17 of 143
Range("A8")
End Sub
Nous voulons effectuer une action sur la cellule A8 avec ce début de macro.
Pour afficher la liste des possibilités que l'on peut associer à l'objet Range, ajoutez un
«. » après Range("A8") :
Pour ce premier exemple, cliquez sur Value puis appuyez sur la touche Tab pour valider ce
choix :
Sub proprietes()
'Macro incomplète
Range("A8").Value
End Sub
La propriété Value représente ici le contenu de la cellule. Nous voulons maintenant donner la
valeur 48 à la cellule A8 :
Sub proprietes()
'Cellule A8 = 48
Range("A8").Value = 48
Page 18 of 143
'Traduction :
End Sub
Puis, la valeur Exemple de texte à A8 (le texte doit être mis entre " ") :
Sub proprietes()
End Sub
Dans ce cas, c'est bien la cellule A8 de la feuille où est lancée la procédure (ici, celle où se
trouve le bouton formulaire) qui sera modifiée.
Si vous créez un second bouton sur la feuille 2, ce sera alors la cellule A8 de la feuille 2 qui
sera modifiée.
Pour modifier la cellule A8 de la feuille 2 en cliquant sur le bouton de la feuille 1, il faut préciser
le nom de la feuille en ajoutant Sheets("Nom_de_la_feuille") avant Range :
Sub proprietes()
End Sub
De même, si l'on souhaite modifier la cellule A8 de la feuille 2 d'un autre classeur ouvert, il faut
préciser le nom du classeur en début de ligne à l'aide de Workbooks("Nom_du_fichier") :
Sub proprietes2()
End Sub
Bien que Value ait été utilisé pour illustrer ces différents exemples, il n'est pas nécessaire de
l'indiquer, car c'est automatiquement la valeur de la cellule qui est modifiée si rien n'est précisé.
Page 19 of 143
Ces 2 lignes génèrent un résultat identique :
Range("A8").Value = 48
Range("A8") = 48
Après avoir sélectionné la propriété Font et ajouté un «. », la liste des propriétés que l'on peut
attribuer à la mise en forme du texte apparaît :
Sub proprietes3()
Range("A1:A8").[Link] = 12
Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22
End Sub
Sub proprietes3()
Page 20 of 143
'Modifier la taille du texte des cellules A1 à A8
Range("A1:A8").[Link] = 12
Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22
Range("A1:A8").[Link] = True
End Sub
Pour retirer la mise en forme Bold à un texte, il faut donc remplacer Oui par Non, autrement
dit, True par False :
Sub proprietes()
Range("A1:A8").[Link] = False
End Sub
Sub proprietes3()
Range("A1:A8").[Link] = 12
Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22
Range("A1:A8").[Link] = True
Page 21 of 143
Range("A1:A8").[Link] = True
End Sub
Sub proprietes3()
Range("A1:A8").[Link] = 12
Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22
Range("A1:A8").[Link] = True
Range("A1:A8").[Link] = True
Range("A1:A8").[Link] = True
End Sub
Sub proprietes()
Range("A1:A8").[Link] = "Arial"
End Sub
Page 22 of 143
Ajouter des bordures
Sub proprietes()
Range("A1:A8").[Link] = 1
End Sub
Sub proprietes()
[Link] = 1
End Sub
Sub proprietes4()
Sheets("Feuil3").Visible = 2
End Sub
Page 23 of 143
Modifier la valeur d'une cellule en fonction d'une autre
Sub proprietes()
'A7 = A1
Range("A7") = Range("A1")
'Ou :
'Range("A7").Value = Range("A1").Value
End Sub
Sub proprietes()
Range("A7").[Link] = Range("A1").[Link]
End Sub
Sub proprietes()
'Compteur de clics en A1
Range("A1") = Range("A1") + 1
End Sub
Page 24 of 143
Cette ligne ne doit pas être interprétée comme une opération mathématique (rappelez-vous que
ce qui est à gauche du = prend la valeur de ce qui est à droite du =).
Excel exécute le code ligne par ligne en respectant certaines priorités, ces commentaires
devraient vous aider à mieux comprendre ce même code :
Sub proprietes()
'Un clic a été fait sur le bouton, nous entrons dans la procédure
'- la valeur à droite du = est calculée en priorité (A1 vaut toujours 10, cela donne 10 + 1)
Range("A1") = Range("A1") + 1
End Sub
With
Sub proprietes()
Sheets("Feuil2").Range("A8").[Link] = 3
Sheets("Feuil2").Range("A8").[Link] = True
Sheets("Feuil2").Range("A8").[Link] = 18
Sheets("Feuil2").Range("A8").[Link] = True
Sheets("Feuil2").Range("A8").[Link] = "Arial"
End Sub
Page 25 of 143
Sub proprietes()
With Sheets("Feuil2").Range("A8")
.[Link] = 3
.[Link] = True
.[Link] = 18
.[Link] = True
.[Link] = "Arial"
End With
End Sub
les couleurs
Nous avons 2 possibilités pour définir la couleur : ColorIndex et ses 56 couleurs ou Color qui
nous permettra d'utiliser n'importe quelle couleur.
Colorindex
Page 26 of 143
Pour appliquer à notre texte l'une de ces 56 couleurs, nous écrirons :
Sub couleurs()
Range("A1").[Link] = 10
End Sub
Pour les versions d'Excel inférieures à 2007 : l'utilisation de ColorIndex est préférable à Color.
Color
Sub couleurs1()
Page 27 of 143
End Sub
RGB en français signifie RVB (Rouge Vert Bleu), les valeurs vont de 0 à 255 pour chaque
couleur.
✓ RGB(0, 0, 0) : noir
✓ RGB(255, 255, 255) : blanc
✓ RGB(255, 0, 0) : rouge
✓ RGB(0, 255, 0) : vert
✓ RGB(0, 0, 255) : bleu
Heureusement pour nous, il existe différentes solutions qui nous permettent de trouver
facilement les valeurs RGB de la couleur qui nous intéresse.
Vous trouverez par exemple une liste de valeurs RGB sur la page suivante : liste de valeurs
RGB.
Pour donner une couleur violette à notre texte, nous pouvons donc rechercher les valeurs RGB
de cette couleur sur la liste de couleurs et entrer :
Nous allons créer une macro qui va ajouter une bordure à la cellule active avec ActiveCell.
Sub couleurs3()
'Epaisseur de la bordure
[Link] = 4
Page 28 of 143
'Couleur de la bordure : rouge
[Link] = RGB(255, 0, 0)
End Sub
Sub couleurs4()
End Sub
Aperçu:
Sub couleurs5()
Sheets("Feuil").[Link] = RGB(255, 0, 0)
End Sub
Apercu:
Page 29 of 143
Chapitre 2 : les variables
Sub variables()
'Déclaration de la variable
maVariable = 12
MsgBox maVariable
End Sub
Cette première ligne de code est la déclaration de la variable (généralement placée en début de
procédure).
Déclarer ses variables n'est pas obligatoire mais recommandé. Cela permet de s'y retrouver plus
facilement, peut aider dans certains cas à résoudre plus facilement les problèmes, etc. Mieux
vaut donc prendre l'habitude de déclarer correctement ses variables.
Le type de la variable indique la nature de son contenu (texte, nombres, date, etc.).
maVariable = 12
Page 30 of 143
MsgBox maVariable
MsgBox affiche une valeur dans une boîte de dialogue (les boîtes de dialogue seront détaillées
dans quelques leçons).
Le résultat de ce code :
Allez dans l’onglet Développeur, puis dans le groupe code, actionner la rubrique macro
, une boîte de dialogue s’ouvre :
Page 31 of 143
Les types de variables
Sub typevar()
nbEntier = 12345
nbVirgule = 123.45
MsgBox nbVirgule
'Exemple : texte
Page 32 of 143
varTexte = "Cours VBA Excel"
MsgBox varTexte
'Exemple : date
varDate = "26/01/2024"
MsgBox varDate
'Exemple : vrai/faux
varBoolean = True
MsgBox varBoolean
Set varFeuille = Sheets("Feuil2") 'Set => attribution d'une valeur à une variable objet
[Link]
End Sub
Les symboles indiqués dans le tableau ci-dessus permettent de raccourcir les déclarations de
variables.
Par soucis de lisibilité, ils ne seront pas utilisés dans les leçons mais voici tout de même un
exemple :
Page 33 of 143
Dim exemple%
Il est possible de forcer les déclarations de variables en plaçant Option Explicit tout au début
du module (une erreur sera ainsi générée en cas d'oubli de déclaration).
Exemple pratique
Nous allons maintenant créer par étapes une macro qui va récupérer le nom dans la cellule A2,
le prénom dans la cellule B2, l'âge dans la cellule C2 et qui va les afficher dans une boîte de
dialogue.
Commençons par déclarer les variables (sur la même ligne, séparées par des virgules) :
Sub variables()
End Sub
Sub variables()
nom = Cells(2, 1)
prenom = Cells(2, 2)
age = Cells(2, 3)
End Sub
Et enfin, affichons le résultat dans la boîte de dialogue en concaténant les valeurs avec &
(comme dans les formules Excel) :
Sub variables()
Page 34 of 143
'Déclaration des variables
nom = Cells(2, 1)
prenom = Cells(2, 2)
age = Cells(2, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Nous allons maintenant chercher à afficher dans la boite de dialogue la ligne du tableau
correspondant au numéro indiqué dans la cellule F5.
Voici l'objectif :
Page 35 of 143
Solutions :
Sub variables()
'Déclaration des variables
Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer
'Valeurs des variables
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Une variable numeroLigne a été ajoutée :
La variable prend ensuite la valeur de la cellule F5 à laquelle nous ajoutons 1 (pour ne pas tenir
compte de la première ligne qui contient les titres du tableau). La variable numeroLigne aura
donc pour valeur le numéro de ligne des cellules qui nous intéressent :
numeroLigne = Range("F5") + 1
Page 36 of 143
Il ne reste plus qu'à remplacer les numéros de ligne dans Cells par notre variable :
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
Notez au passage que nous pouvons réduire cette procédure entière sur une ligne :
Sub variables()
MsgBox Cells(Range("F5")+1,1) & " " & Cells(Range("F5")+1,2) & ", " &
Cells(Range("F5")+1,3) & " ans"
End Sub
Le code fonctionne correctement, il est néanmoins beaucoup moins lisible que le précédent et
plus difficile à entretenir par la suite (les codes ne seront donc pas réduits dans les leçons afin
d'en faciliter la compréhension).
Tableaux
Les variables permettent de stocker une seule valeur par variable, les tableaux permettent de
stocker une multitude de valeurs par tableau (leur utilisation est proche de celle des variables).
Page 37 of 143
Voici quelques exemples de déclarations :
Le tableau à 1 dimension
Dans cette déclaration, il n'y a qu'un chiffre entre parenthèses, il s'agit donc d'un tableau à une
dimension. Ce chiffre indique également le nombre de cases du tableau. Dans le cas présent,
tab1(4) est un tableau dont les cases vont de 0 à 4, il s'agit donc d'un tableau de comportant 5
cases :
Page 38 of 143
Le tableau à 2 dimensions
Et voici comment attribuer des valeurs aux cases d'un tableau à 2 dimensions :
Les constantes
Les constantes permettent de stocker des valeurs comme les variables, à la différence près qu'on
ne peut pas les modifier (d'où leur nom) après les avoir déclarées.
Par exemple, ces quelques lignes calculent le montant de la TVA en fonction d'un taux de TVA
de 12.34% :
Sub exemple()
'TVA
Page 39 of 143
'Montant TTC
End Sub
Pour éviter les répétitions et faciliter la lecture de ce code, il est possible de déclarer le taux de
TVA sous forme de constante :
Sub exemple()
'TVA
'Montant TTC
End Sub
Page 40 of 143
En utilisant une constante, le jour où le taux de TVA changera, il vous suffira de modifier une
seule fois la valeur de la constante dans le code (au lieu de rechercher et remplacer toutes les
valeurs 0.1234 dans le code).
Par convention, une constante se nomme en majuscules en séparant les mots par un _ (par
exemple : EXEMPLE_DE_NOM).
Si la variable est déclarée au début d'une procédure (Sub), elle ne peut être utilisée que dans
cette même procédure. La valeur de la variable n'est pas conservée après l'exécution de la
procédure
Sub procedure1()
End Sub
Sub procedure2()
End Sub
Pour pouvoir utiliser une variable dans toutes les procédures d'un module, il suffit de la déclarer
en début de module. De plus, cela permet de conserver la valeur de la variable jusqu'à la
fermeture du classeur.
Sub procedure1()
End Sub
Sub procedure2()
End Sub
Page 41 of 143
Même principe pour utiliser une variable dans tous les modules, à la différence près que Dim
est remplacé par Public :
Pour conserver la valeur d'une variable à la fin d'une procédure, remplacez Dim par Static :
Sub procedure1()
End Sub
Pour conserver les valeurs de toutes les variables d'une procédure, ajoutez Static devant Sub :
End Sub
Nous n'allons pas nous attarder sur ce point, voici juste un exemple :
Type Utilisateur
Nom As String
Prenom As String
End Type
Sub exemple()
'Déclaration
[Link] = "Smith"
[Link] = "John"
'Exemple d'utilisation
Page 42 of 143
MsgBox [Link] & " " & [Link]
End Sub
Les conditions sont très utiles en programmation, elles nous serviront à effectuer des actions en
fonction de critères précis (même principe que la fonction SI).
Instruction IF
'Instructions si vrai
'Instructions si faux
End If
Passons directement à la pratique et reprenons l'exemple développé à la leçon sur les variables.
Il avait pour but d'afficher dans une boîte de dialogue la ligne du tableau correspondant au
numéro indiqué dans la cellule F5.
Si nous entrons une lettre en F5, cela génère un bug et nous voulons éviter cela.
Sub exemple()
Page 43 of 143
'Déclaration des variables
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Nous allons commencer par ajouter une condition pour vérifier si la valeur de la cellule F5 est
bien numérique avant d'exécuter le code.
Sub exemple()
'Si la valeur entre parenthèses (cellule F5) est numérique (donc si la condition est vraie) alors
on exécute les instructions placées entre "Then" et "End If"
If IsNumeric(Range("F5")) Then
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
Page 44 of 143
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End Sub
Ajoutons également des instructions pour le cas où la condition n'est pas remplie :
Sub exemple()
If IsNumeric(Range("F5")) Then
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
Else
MsgBox "L'entrée """ & Range("F5") & """ n'est pas valide !"
Range("F5") = ""
End If
End Sub
Page 45 of 143
Les valeurs non numériques ne sont désormais plus un problème.
Notre tableau contient 16 lignes de données (de la ligne 2 à la ligne 17), nous allons donc vérifier
maintenant si la variable numeroLigne est plus grande ou égale à 2 et plus petite ou égale à 17.
= Est égal à
Or Ou [CONDITION 1] Or [CONDITION 2]
Ajoutons maintenant les conditions indiquées un peu plus haut en utilisant And ainsi que les
opérateurs de comparaison détaillés ci-dessus :
Sub exemple()
If IsNumeric(Range("F5")) Then
Page 46 of 143
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
MsgBox nom & " " & prenom & ", " & age & " ans"
Else
MsgBox "L'entrée """ & Range("F5") & """ n'est pas un numéro valide !"
Range("F5") = ""
End If
Else
MsgBox "L'entrée """ & Range("F5") & """ n'est pas valide !"
Range("F5") = ""
End If
End Sub
Pour rendre notre macro plus pratique, nous pouvons encore remplacer 17 par une variable
contenant le nombre de lignes. Cela nous permettra d'ajouter/retirer des lignes à notre tableau
sans avoir à modifier à chaque fois cette limite dans le code.
Page 47 of 143
[Link] ne vous dit probablement rien mais il s'agit en fait de la fonction
NBVAL que vous connaissez probablement déjà (sinon, cliquez ici).
ELSEIF
'Instructions 1
'Instructions 2
'Instructions 3
End If
Si la condition 1 est vraie, les instructions 1 sont exécutées puis nous sortons de l'instruction If
(qui débute avec If et se termine à End If). Si la condition 1 est fausse, nous passons à la
condition 2. Si celle-ci est vraie les instructions 2 sont exécutées si ce n'est pas le cas les
instructions 3 sont alors exécutées.
Sub commentaires()
'Variables
Page 48 of 143
Dim note As Single, commentaire As String
note = Range("J1")
If note = 6 Then
Else
End If
'Commentaire en B1
Range("K1") = commentaire
End Sub
SELECT
Une alternative aux instructions If contenant beaucoup de ElseIf existe, il s'agit de Select (cette
instruction étant plus adaptée dans ce genre de cas).
Page 49 of 143
Sub commentaires2()
'Variables
note = Range("J9")
Case Is = 6
Case Is >= 5
Case Is >= 4
Case Is >= 3
Case Is >= 2
Case Is >= 1
Case Else
End Select
'Commentaire en k1
Range("K9") = commentaire
End Sub
Page 50 of 143
Notez que nous pouvons également entrer plusieurs valeurs :
Exemple :
Sub commentaires2()
'Variables
note = Range("J9")
Case Is <= 5
Case Is <= 4
Case Is <= 3
Case Is <= 2
Case Is <= 1
Case Else
Page 51 of 143
commentaire = "Aucun résultat"
End Select
'Commentaire en k1
Range("K9") = commentaire
End Sub
Exemple :
Sub commentaires2()
'Variables
note = Range("J9")
Case Is <= 5
Case Is <= 4
Case Is <= 3
Case Is <= 2
Page 52 of 143
Case Is <= 1
Case Else
End Select
'Commentaire en k1
Range("K9") = commentaire
End Sub
Fonction isnumeric
La fonction IsNumeric (vue à la page précédente) renvoie True (vrai) si la valeur est numérique
et False (faux) si ce n'est pas le cas :
Ou
If IsNumeric(Range("A1")) Then
Ces 2 lignes sont identiques (il n'est pas nécessaire d'entrer = True puisque que l'on cherche de
toute manière à savoir si l'expression est vraie).
Dans le cas où nous voulons vérifier si la valeur n'est pas numérique, nous avons également
deux possibilités :
Où
Il existe de nombreuses autres fonctions que vous pouvez utiliser dans vos conditions (ou plus
généralement dans vos codes VBA).
Exemple 1 :
Utilisation de la fonction IsNumeric pour vérifier si la valeur entrée par l'utilisateur peut être
considérée comme un nombre :
Page 53 of 143
Sub Valeur_Numérique()
If IsNumeric(nombre) Then
End If
End Sub
Exemple 2 :
Utilisation de la fonction IsNumeric pour déterminer si les différentes valeurs suivantes peuvent
être considérées comme des nombres :
Sub Valeur_Numéric2()
Page 54 of 143
MsgBox IsNumeric("3b") 'Renvoie : False
End Sub
Fonctions de dates
Il existe de nombreuses fonctions de dates et d'heures pouvant être utilisées dans des conditions,
en voici quelques exemples.
La fonction IsDate renvoie True si la valeur est une date ou False si ce n'est pas le cas :
Exemples d'utilisation
Exemple :
Sub dates1()
Sheets("Feuil2").Range("A3") = Date
Page 55 of 143
End Sub
Fonction isempty
La fonction IsEmpty renvoie False si la variable a été initialisée ou True si ce n'est pas le cas :
Exemple :
Sub Vide()
maVariable = 2
If IsEmpty(maVariable) Then
Else
End If
End Sub
Sub Vide()
Dim maVariable
If IsEmpty(maVariable) Then
Else
End If
End Sub
Page 56 of 143
Condition en fonction de la comparaison de 2 chaînes de caractères
Dans ce cas, les 2 chaînes de caractères sont identiques, l'expression est donc vraie.
Maintenant, pour vérifier si la variable contient la valeur 12345 sans tenir compte des autres
caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la valeur à rechercher.
Le caractère *
Le caractère #
Le caractère ?
Page 57 of 143
maVariable = "Exemple 12345"
Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit être ajouté
après [:
Les boucles permettent de répéter des instructions un certain nombre de fois pour vous éviter
de devoir écrire des macros d'une longueur interminable et vous faire gagner un temps
considérable. Le code suivant numérote les cellules de la colonne A (de la ligne 1 à 12) :
Sub exemple()
Cells(1, 1) = 1
Cells(2, 1) = 2
Cells(3, 1) = 3
Cells(4, 1) = 4
Cells(5, 1) = 5
Cells(6, 1) = 6
Cells(7, 1) = 7
Cells(8, 1) = 8
Cells(9, 1) = 9
Cells(10, 1) = 10
Cells(11, 1) = 11
Cells(12, 1) = 12
End Sub
Page 58 of 143
Maintenant, imaginez qu'il faille numéroter plusieurs milliers de lignes ... Vous comprenez
donc probablement l'intérêt de créer des boucles.
boucle Do
Voici la boucle Do :
Sub exemple()
Do While [CONDITION]
'Instructions
Loop
End Sub
Tant que la condition est vraie, les instructions sont exécutées en boucle (attention à ne pas
créer une boucle infinie). Voici la macro répétitive ci-dessus avec la boucle Do :
Sub exemple2()
Do While numero <= 12 'Tant que la variable numero est <= 12, la boucle est répétée
Loop
End Sub
Avec cette boucle, si nous voulons numéroter 500 lignes, il suffit alors de remplacer 12 par 500
...
Do loop
Dans le précédent exemple, vous avez pu voir la boucle Do sous la forme suivante :
Sub exemple()
Do While [CONDITION]
Page 59 of 143
'Instructions
Loop
End Sub
Avec Do, la condition peut également être placée en fin de boucle, ce qui implique que les
instructions seront dans tous les cas exécutés au moins une fois :
Sub exemple()
Do
'Instructions
End Sub
Plutôt que de répéter la boucle tant que la condition est vraie, il est possible de quitter la boucle
lorsque la condition est vraie en remplaçant While par Until :
Sub exemple()
Do Until [CONDITION]
'Instructions
Loop
End Sub
For next
Sub exemple()
Dim i As Integer
For i = 1 To 5
'Instructions
Next
End Sub
Page 60 of 143
La boucle For est répétée ici 5 fois. A chaque répétition de la boucle, la variable i est
automatiquement incrémentée de 1 :
Sub boucle_For()
Dim i As Integer
For i = 1 To 5
Next
End Sub
Si nécessaire, vous pouvez modifier l'incrément (par défaut à 1) de la boucle en ajoutant Step :
Sub exemple()
Dim i As Integer
For i = 10 To 0 Step -2
Next
End Sub
La boucle For Each permet de parcourir chaque élément d'un ensemble d'éléments, par exemple
parcourir chaque cellule d'une plage de cellules :
Sub exemple()
cellule = [Link]
Next
End Sub
Page 61 of 143
Sub exemple()
MsgBox [Link]
Next
End Sub
Sub exemple()
tableau(0) = "A"
tableau(1) = "B"
tableau(2) = "C"
MsgBox valeur
Next
End Sub
Il est possible de quitter une boucle For prématurément grâce à l'instruction suivante :
Dans cet exemple, l'objectif est de retourner le numéro de la première ligne contenant la valeur
1. Lorsque cet objectif est atteint, le numéro est affiché et la boucle est interrompue (car il est
dans ce cas inutile de parcourir les autres lignes) :
Sub QuitterBoucle()
Dim i As Integer
Page 62 of 143
For i = 1 To 100
MsgBox "La cellule a été trouvée à la ligne " & i & " !"
End If
Next
End Sub
Cas Pratique
Pour mettre en pratique ce qui a été vu jusque-là, nous allons créer étape par étape une macro
qui va numéroter de 1 à 100 une plage de cellules carrée de 10 par 10 et colorer une cellule sur
2, aperçu :
Page 63 of 143
Voici le point de départ de l'exercice :
Sub exerc
iceBoucles()
'...
End Sub
Pour commencer, ajoutez une boucle For qui va numéroter de 1 à 10 les cellules de la ligne 1,
aperçu :
Solutions :
Sub exerciceBoucles()
For colonne = 1 To 10
Next
End Sub
Créez maintenant une seconde boucle qui va répéter la première boucle sur 10 lignes, aperçu :
Page 64 of 143
Sub exerciceBoucles2()
For ligne = 1 To 10
For colonne = 1 To 10
Next
Next
End Sub
Trouvez maintenant une solution pour obtenir une numérotation de 1 à 100, aperçu :
Page 65 of 143
Une solution "simple" consiste à utiliser une variable qui sera incrémentée de 1 après chaque
entrée dans une cellule :
Sub exerciceBoucles3()
valeur = 1
For ligne = 1 To 10
For colonne = 1 To 10
Next
Next
End Sub
Page 66 of 143
Une autre solution consiste à calculer la valeur à insérer dans la cellule à l'aide des numéros de
colonne et de ligne :
Sub exerciceBoucles4()
For ligne = 1 To 10
For colonne = 1 To 10
Next
Next
End Sub
Pour terminer l'exercice, il reste encore à colorer le fond d'une cellule sur 2 à l'aide d'une
instruction If et de l'opérateur Mod (qui retourne le reste d'une division), aperçu :
Page 67 of 143
Sub exerciceBoucles5()
For ligne = 1 To 10
For colonne = 1 To 10
End If
Next
Next
End Sub
La condition (ligne + colonne) Mod 2 = 0 est vraie si le reste de la division de (ligne + colonne)
par 2 est égal à 0 (sachant que le reste de la division d'un nombre entier positif par 2 ne peut
être que 0 ou 1).
Pour prendre un exemple plus simple, si l'objectif de l'exercice était de colorer les lignes paires
(sans tenir compte des colonnes), la condition aurait été ligne Mod 2 = 0.
Public - Private
Pour le moment, toutes les procédures créées sont de type Public, elles sont accessibles depuis
tous les modules.
Sub exemple()
'Est identique à :
Page 68 of 143
Public Sub exemple()
Pour exécuter une procédure depuis une autre procédure, entrez simplement son nom.
Un exemple simple :
End Sub
Sub exemple()
End If
End Sub
Ici, lorsque la procédure exemple est lancée et que A1 vaut "", la procédure avertissement est
exécutée et affiche la boîte de dialogue.
Les arguments
Les arguments permettent de transmettre des valeurs d'une procédure à une autre (car rappelez-
vous que par défaut les variables ne sont pas accessibles depuis les autres procédures).
End Sub
Sub exemple2()
Page 69 of 143
avertissement2 "cellule vide"
End If
End Sub
Pour exécuter la procédure avertissement, il faudra donc entrer en argument une valeur de type
String :
En cas d'arguments multiples, ceux-ci doivent être séparés par des virgules.
Par défaut, si une procédure requiert des arguments, ceux-ci sont obligatoires pour exécuter la
procédure. Des arguments optionnels peuvent toutefois être ajoutés après les arguments
obligatoires avec Optional, par exemple :
Cette procédure peut alors être lancée avec ou sans arguments optionnels, comme ceci :
Page 70 of 143
boiteDialogue nom
Pour vérifier si un argument optionnel est présent ou non, nous utiliserons la fonction IsMissing.
Cette fonction n'étant compatible qu'avec certains types de variables (dont Variant), le type des
arguments optionnels n'a pas été déclaré (type non déclaré = Variant).
Sub exemple3()
nom = Range("A1")
prenom = Range("B1")
age = Range("C1")
boiteDialogue nom
Page 71 of 143
End Sub
If IsMissing(age) Then
MsgBox nom
End If
Else
MsgBox nom & ", " & age & " ans"
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End If
End Sub
Page 72 of 143
Il est également possible de renseigner des valeurs par défaut aux arguments optionnels et de
tester ensuite ces valeurs (au lieu d'utiliser la fonction IsMissing) :
Sub exemple4()
nom = Range("A1")
prenom = Range("B1")
age = Range("C1")
boiteDialogue nom
End Sub
Page 73 of 143
Private Sub boiteDialogue(nom As String, Optional prenom As String = "", Optional age As
Integer = 0)
If age = 0 Then
If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom
MsgBox nom
End If
Else
If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom
MsgBox nom & ", " & age & " ans"
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End If
End Sub
BYREF - BYVAL
Par défaut, les arguments sont de type ByRef ce qui signifie que, si une variable est passée en
argument, c'est sa référence qui est transmise. Autrement dit, si la variable est modifiée dans la
sous-procédure, elle le sera également dans la procédure d'appel.
Par exemple :
Sub exemple5()
Page 74 of 143
nombre = InputBox("Entrez un nombre :")
carre nombre
MsgBox nombre
End Sub
Private Sub carre(ByRef valeur As Integer) 'Il n'est pas nécessaire de préciser ByRef (type par
défaut)
valeur = valeur ^ 2
End Sub
Pour mieux comprendre, voici ce qui se passe lorsque la macro est lancée :
carre nombre
'La variable "valeur" fait référence à la variable "nombre" passée en argument, par conséquent
si la variable "valeur" est modifiée, la variable "nombre" le sera aussi
'La valeur de la variable "valeur" est modifiée (donc la variable "nombre" aussi)
valeur = valeur ^ 2
'Fin de la sous-procédure
End Sub
'La variable "nombre" a été modifiée, un nombre est alors affiché dans la boîte de dialogue
MsgBox nombre
La seconde possibilité consiste à utiliser ByVal. Contrairement à ByRef qui fait directement
référence à la variable, ByVal transmet uniquement sa valeur, ce qui signifie que la variable
passée en argument ne subit aucune modification. Voici ce qui se passe avec le code précédent
et ByVal :
Page 75 of 143
'La valeur initiale de la variable "nombre" est 30
carre nombre
'La variable "valeur" copie la valeur de la variable "nombre" (les 2 variables ne sont pas liées)
valeur = valeur ^ 2
End Sub
'La variable "nombre" n'a pas été modifiée, 30 est donc affiché dans la boîte de dialogue
MsgBox nombre
Les fonctions
La principale différence entre Sub et Function est qu'une fonction retourne une valeur.
End Function
Sub exemple6()
resultat = carre(nb) 'La variable resultat reçoit la valeur retournée par la fonction
End Sub
Page 76 of 143
Vous pouvez remarquer que les arguments d'une fonction sont ajoutés entre () contrairement
aux procédures où elles sont superflues.
MsgBox
Pour le moment, nous n'avons utilisé la boîte de dialogue MsgBox que pour afficher une
information :
Sub effacerB2()
Range("B2").ClearContents
End Sub
Nous allons maintenant créer une boîte de dialogue qui va nous demander de confirmer la
suppression avant d'exécuter les instructions.
Page 77 of 143
Aperçu :
Sub effacerB2_2()
Range("B2").ClearContents
End If
End Sub
Aperçu :
vbYesNo indique que les boutons de la boîte de dialogue sont les boutons "Oui" et "Non",
vbYes correspond au bouton "Oui" :
If MsgBox("Texte", vbYesNo, "Titre") = vbYes Then 'Si le bouton Oui est cliqué
MsgBox peut être utilisé à la fois comme une procédure ou une fonction. Si vous avez besoin
de connaître le choix de l'utilisateur et donc obtenir une valeur en retour, utilisez MsgBox en
tant que fonction en ajoutant des () aux arguments.
Page 78 of 143
Les différentes possibilités pour le second argument de msgbox
Par exemple, pour une boîte de dialogue avec "Oui, Non, Annuler" + icône exclamation +
bouton 2 par défaut :
Sub effacerB2_3()
Range("B2").ClearContents
End If
Page 79 of 143
End Sub
Les constantes peuvent être remplacées par leur valeur respective, ces 3 lignes affichent une
boîte de dialogue identique :
Voici l'exemple d'une MsgBox qui apparaît en boucle tant que le bouton "Oui" n'est pas cliqué
:
Sub humour()
Do
Page 80 of 143
If MsgBox("Aimez-vous le cours de Vba-Excel ?", 36, "Sondage") = vbYes Then
End If
MsgBox ";-)"
End Sub
Pour aller à la ligne, vous pouvez insérer le caractère correspondant au saut de ligne à l'aide de
la fonction Chr, exemple :
Sub saut_Ligne()
MsgBox "Exemple 1" & Chr(10) & "Exemple 2" & Chr(10) & Chr(10) & "Exemple 3"
End Sub
Aperçu :
Inputbox
La fonction InputBox demande à l'utilisateur d'entrer une valeur dans une boîte de dialogue,
exemple :
Sub exemple()
resultat = InputBox("Texte ?", "Titre") 'La variable reçoit la valeur entrée dans l'InputBox
Page 81 of 143
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
MsgBox resultat
End If
End Sub
Aperçu:
Il est également possible d'indiquer une valeur par défaut en troisième argument :
Sub exemple()
resultat = InputBox("Texte ?", "Titre", "Valeur par défaut") 'La variable reçoit la valeur
entrée dans l'InputBox
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat
MsgBox resultat
End If
End Sub
Page 82 of 143
Chapitre 7 : les événements
Jusque-là, nous avons lancé nos macros en cliquant sur un bouton. Il est également possible de
les exécuter automatiquement lors d'un événement particulier du classeur, tel que l'ouverture
du classeur, sa fermeture, son enregistrement, etc.
Workbook_open (à l'ouverture)
Pour exécuter des instructions à l'ouverture du classeur (après l'activation des macros par
l'utilisateur), rendez-vous dans ThisWorkbook et sélectionnez Workbook :
End Sub
Par exemple, en ajoutant l'instruction suivante, une boîte de dialogue sera affichée à l'ouverture
du classeur :
End Sub
Pour exécuter des instructions juste avant la fermeture du classeur, choisissez BeforeClose
Page 83 of 143
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
La fermeture du classeur peut être annulée en attribuant la valeur True à la variable Cancel.
'Si l'utilisateur répond Non, la variable Cancel vaudra True (ce qui annulera la fermeture)
Cancel = True
End If
End Sub
End Sub
Page 84 of 143
If SaveAsUI = False Then
If MsgBox("Do you really want to save this Workbook? ", vbYesNo) = vbNo Then
Cancel = True
Exit Sub
End If
End If
End Sub
End Sub
Exemple :
If Success Then
End If
End Sub
End Sub
Exemple :
Page 85 of 143
Private Sub Workbook_BeforePrint(Cancel As Boolean)
[Link] = "[Link]"
End Sub
End Sub
End Sub
End Sub
Else
Page 86 of 143
End If
End Sub
Cet événement se déclenche juste avant un clic droit sur une cellule :
End Sub
End Sub
SÉLECTION)
Cet événement se déclenche à chaque changement de sélection sur une feuille de calcul :
End Sub
End If
End Sub
Page 87 of 143
WORKBOOK_NEWSHEET (À L'INSERTION D'UNE FEUILLE)
End Sub
A la page précédente les événements concernaient le classeur entier. Sur celle-ci, nous allons
nous focaliser sur les événements liés à une feuille.
Pour exécuter des instructions en fonction d'un événement pour une feuille en particulier,
sélectionnez la feuille dans l'éditeur, puis Worksheet :
L'événement SelectionChange est ajouté par défaut, il agit lors d'un changement de sélection :
End Sub
Par exemple, voici un code qui colore la ou les cellules sélectionnées et qui supprime
automatiquement la coloration de la dernière sélection lors d'un changement de sélection :
Page 88 of 143
Private Sub Worksheet_Activate()
End Sub
Range("D5").Select
End Sub
End Sub
Par exemple, effacement du contenu des cellules B2 à B10 après avoir quitté la feuille :
Cet événement se déclenche lors d'un double-clic sur une cellule de la feuille :
End Sub
Par exemple, coloration de la cellule double-cliquée en vert (ou en blanc si elle est déjà colorée)
:
Else 'Sinon
Page 89 of 143
End If
End Sub
End Sub
Par exemple, ajout de la date du jour par clic droit si la cellule cliquée est dans la colonne C :
If [Link] = 3 Then
End If
End Sub
Le clic droit peut être annulé en attribuant la valeur True à la variable Cancel (dans ce cas, le
menu contextuel ne sera pas affiché).
End Sub
Pour exécuter du code sans déclencher d'événements, placez-le entre ces deux lignes :
Page 90 of 143
[Link] = False 'Désactive les événements
'Instructions ...
UserForm
Pour ajouter un UserForm, procédez de la même manière que pour un nouveau module :
Page 91 of 143
Si la fenêtre des propriétés n'est pas présente, affichez-la (F4) et commencez par modifier le
nom de l'UserForm (pour mieux s'y retrouver par la suite)
TITRE DE L'USERFORM
DIMENSIONS DE L'USERFORM
Pour modifier les dimensions de l'UserForm, modifiez ses propriétés Width et Height ou
redimensionnez l'UserForm à la main :
Page 92 of 143
Les propriétés d'un UserForm peuvent également être modifiées à partir d'un code VBA.
Page 93 of 143
Et sélectionnez l'événement UserForm_Initialize qui se déclenche au lancement de l'UserForm
:
End Sub
Pour prendre un exemple, nous allons créer deux événements. Le premier pour définir les
dimensions initiales de l'UserForm et le second pour augmenter ses dimensions de 50 par clic.
UserForm_Exemple.Height = 250
UserForm_Exemple.Width = 250
End Sub
Pour simplifier le code, nous pouvons remplacer le nom de l'UserForm par Me (puisque ce code
est placé dans l'UserForm sur lequel on souhaite agir) :
[Link] = 250
[Link] = 250
End Sub
Page 94 of 143
Le second événement est déclenché au clic sur l'UserForm :
[Link] = 250
[Link] = 250
End Sub
[Link] = [Link] + 50
[Link] = [Link] + 50
End Sub
LANCER UN USERFORM
Sub lancerUserform()
UserForm_Exemple.Show
End Sub
Page 95 of 143
Les contrôles
Les contrôles sont les éléments (boutons, intitulés, zone de texte, cases à cocher, etc.) qui
peuvent être insérés sur un UserForm (ou sur une feuille Excel). Les contrôles ont également
toute une panoplie de propriétés et d'événements qui diffèrent d'un contrôle à l'autre.
Pour commencer, ajoutez un UserForm et insérez les 3 contrôles suivants : un intitulé Label,
une zone de texte TextBox et un bouton CommandButton :
Modifiez les propriétés de l'UserForm et des contrôles (dont les propriétés (Name) pour le nom,
Caption pour le texte et Font pour la taille du texte) pour obtenir ceci :
Pour positionner les contrôles de manière plus précise qu'avec un déplacement manuel,
modifiez les propriétés Left et Top du contrôle. De même, pour redimensionner les contrôles
de manière plus précise qu'avec un redimensionnement manuel, modifiez les propriétés Width
et Height.
Page 96 of 143
Pour le moment, lorsque l'on entre un nombre et que l'on clique sur le bouton, il ne se passe
rien.
Pour y remédier, nous allons commencer par ajouter un événement pour entrer la valeur de la
zone de texte dans la cellule A1 et fermer l'UserForm.
En double-cliquant sur le bouton, un événement par défaut est ajouté dans le code de
l'UserForm. Dans ce cas, il s'agit de l'événement souhaité, mais en cas de besoin, vous pouvez
sélectionner un autre événement dans la liste :
'La cellule A1 (de la feuille active) obtient la valeur de la zone de texte nommée
"TextBox_nombre"
Range("A1") = TextBox_nombre.Value
Unload Me
End Sub
Nous allons maintenant ajouter un événement qui s'active au changement de valeur de la zone
de texte et qui va modifier la couleur de fond si la valeur n'est pas numérique :
Page 97 of 143
TextBox_nombre.BackColor = RGB(255, 255, 255) 'Blanc
Else 'Sinon
End If
End Sub
L'événement est déclenché à chaque entrée ou suppression de caractère dans la zone de texte.
Aperçu :
Il nous reste encore à empêcher la validation du formulaire si la valeur n'est pas numérique en
ajoutant une instruction If :
If IsNumeric(TextBox_nombre.Value) Then
Range("A1") = TextBox_nombre.Value
Unload Me
End If
End Sub
Voici un exemple d'utilisation de cases à cocher dont l'objectif est de modifier les valeurs en
colonne B en fonction des cases cochées dans l'UserForm :
Page 98 of 143
L'événement Click du bouton enregistre ici les choix de l'utilisateur et ferme ensuite l'UserForm
:
'Numéro 1
Range("B2") = "Oui"
Range("B2") = "Non"
End If
'Numéro 2
Range("B3") = "Oui"
Range("B3") = "Non"
End If
'Numéro 3
Page 99 of 143
Range("B4") = "Oui"
Range("B4") = "Non"
End If
'Fermeture
Unload Me
End Sub
Rappelez-vous qu'une condition cherche toujours à savoir si le résultat du test est True :
Pour simplifier encore davantage l'écriture, la propriété Value est la propriété par défaut de la
plupart des contrôles, il n'est donc pas nécessaire de l'ajouter (comme nous l'avions vu
précédemment avec la propriété Value des cellules) :
'Numéro 1
Range("B2") = "Oui"
Range("B2") = "Non"
End If
Range("B3") = "Oui"
Range("B3") = "Non"
End If
'Numéro 3
Range("B4") = "Oui"
Range("B4") = "Non"
End If
'Fermeture
Unload Me
End Sub
Maintenant, imaginez que vous n'ayez pas 3 mais 30 cases à cocher ...
Dim i As Integer
For i = 1 To 3
End If
Next
'Fermeture
Unload Me
End Sub
Dans cet exemple, les cases sont toutes décochées à l'ouverture de l'UserForm.
Pour cocher les cases dont la valeur de la cellule correspondante est Oui au lancement de
l'UserForm, ajoutez l'événement UserForm_Initialize et les tests suivants :
CheckBox1 = True
End If
CheckBox2 = True
End If
CheckBox3 = True
End If
End Sub
Pour simplifier ce code, vous avez la possibilité d'écrire l'instruction If sur une seule ligne et
sans End If lorsqu'il n'y a qu'une seule action à effectuer :
End Sub
Dim i As Integer
For i = 1 To 3
Next
End Sub
Contrairement aux cases à cocher, l'utilisateur ne peut choisir qu'un seul bouton d'option par
groupe.
La première étape consiste à créer les groupes de boutons (car pour le moment vous ne pouvez
sélectionner qu'une seule réponse parmi les 8 réponses).
Pour faire cela, sélectionnez les 4 premiers contrôles et entrez une valeur dans la propriété
GroupName :
Il faut ensuite ajouter une boucle pour chaque groupe de boutons d'option et enregistrer
l'information lorsque la valeur du contrôle est True :
Dim i As Integer
'Question 1
For i = 1 To 4
Next
'Question 2
For i = 1 To 4
Next
'Fermeture
Unload Me
End Sub
Mais plutôt que d'enregistrer le choix au format texte, nous allons plutôt enregistrer son numéro
(de 1 à 4) :
Dim i As Integer
'Question 1
For i = 1 To 4
Next
'Question 2
For i = 1 To 4
Next
'Fermeture
Unload Me
End Sub
Si l'on souhaite que le formulaire ne puisse être validé que lorsque l'utilisateur a répondu aux 2
questions, une solution consiste à enregistrer le choix de chaque groupe dans une variable,
vérifier ensuite s'il y a un choix pour chacune des 2 variables et enregistrer les choix dans les
cellules :
'Question 1
For i = 1 To 4
Next
'Question 2
For i = 1 To 4
Next
'Si 2 réponses
'Enregistrement
Range("A2") = choix1
Range("B2") = choix2
'Fermeture
Unload Me
Else
'Message d'erreur
MsgBox "Vous devez répondre à toutes les questions avant de valider le formulaire.", 48,
"Erreur"
End If
End Sub
Dim i As Integer
For i = 1 To 4
ComboBox_pays.AddItem Cells(1, i)
Next
End Sub
Pour faire cela, nous avons besoin de connaître le numéro de colonne ainsi que le nombre de
villes de cette colonne.
Sachant que ListIndex commence à 0 (comme les tableaux), le numéro de colonne est donc
colonne = ComboBox_Pays.ListIndex + 1
Pour obtenir le nombre de lignes de la colonne du pays choisi, nous pouvons rechercher le
numéro de ligne de la dernière cellule d'un bloc de cellules non vides, comme ceci :
Grâce à ces informations, il est désormais possible de créer l'événement Change de la liste
déroulante :
ListBox_villes.Clear
'Numéro de la sélection
colonne = ComboBox_pays.ListIndex + 1
'Si le numéro de colonne = 0 (donc si aucun pays sélectionné) la procédure est quittée
For i = 2 To nbLignes
End Sub
Il ne reste ensuite plus qu'à ajouter un événement au clic sur le bouton Valider pour traiter cette
information. Dans ce cas, un simple affichage de la sélection dans une boîte de dialogue :
End Sub
Les contrôles peuvent être utilisés également sur une feuille Excel. Pour cet exemple, nous
ajouterons donc le contrôle directement sur la feuille.
Insérez pour commencer un bouton bascule (contrôle ActiveX) à partir de l'onglet Développeur
:
L'objectif ici est de masquer la feuille 2 lorsque le bouton est pressé ou de l'afficher dans le cas
contraire.
Il ne reste plus qu'à entrer les instructions à exécuter au clic sur le bouton :
If ToggleButton1 Then
Sheets("Feuil2").Visible = 2
'Sinon
Else
Sheets("Feuil2").Visible = -1
End If
End Sub
Il est temps de mettre en pratique l'utilisation des contrôles avec un petit exercice. Le fichier :
controles_exercice.xlsm
Vous l'aurez compris, l'objectif est de remplir le tableau de la feuille à l'aide du formulaire.
LE BOUTON "FERMER"
End Sub
Dim i As Integer
For i = 1 To 231
ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub
Une solution simple pour s'assurer qu'un bouton d'option soit sélectionné est d'ajouter un choix
par défaut (propriété Value à True à l'un des boutons). Mais pour l'exercice, ces contrôles seront
testés comme les autres. Une solution possible consiste à afficher une boîte de dialogue si
n'importe lequel des champs a été oublié :
Else
End If
Mais pour compliquer un peu les choses, chaque champ sera testé individuellement, et si l'un
d'entre eux n'a pas été renseigné, son intitulé sera coloré en rouge :
Label_civilite.ForeColor = &H80000012
Label_nom.ForeColor = &H80000012
Label_prenom.ForeColor = &H80000012
Label_adresse.ForeColor = &H80000012
Label_lieu.ForeColor = &H80000012
Label_pays.ForeColor = &H80000012
Label_civilite.ForeColor = RGB(255, 0, 0)
Label_nom.ForeColor = RGB(255, 0, 0)
Label_prenom.ForeColor = RGB(255, 0, 0)
Label_adresse.ForeColor = RGB(255, 0, 0)
Label_lieu.ForeColor = RGB(255, 0, 0)
Label_pays.ForeColor = RGB(255, 0, 0)
End If
End Sub
Le code suivant a été inséré à l'emplacement indiqué sur le code précédent (sous forme de
commentaire) :
'Choix de civilité
If OptionButton_1 Then
Cells(ligne, 1) = OptionButton_1.Caption
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
Cells(ligne, 2) = TextBox_nom
Cells(ligne, 3) = TextBox_prenom
Cells(ligne, 4) = TextBox_adresse
Cells(ligne, 5) = TextBox_lieu
Cells(ligne, 6) = ComboBox_pays
OptionButton_1 = False
OptionButton_2 = False
OptionButton_3 = False
TextBox_nom = ""
TextBox_prenom = ""
TextBox_adresse = ""
TextBox_lieu = ""
ComboBox_pays.ListIndex = -1
En partant de cette dernière cellule et en recherchant vers le haut (xlUp), Excel va retourner le
numéro de ligne de la première cellule non vide de cette colonne (qui sera ici la dernière ligne
complétée du tableau). Et puisque l'on ne recherche pas la dernière ligne complétée du tableau
mais celle juste au-dessous, il faut encore ajouter + 1 à ce numéro.
Même si vous avez un peu de mal avec cette dernière ligne de code, retenez-la bien car elle
pourra vous servir à chaque fois que vous aurez besoin d'insérer une ligne à la suite d'un tableau
VUE D'ENSEMBLE
'Ouverture de l'UserForm
Dim i As Integer
For i = 1 To 231
ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)
Next
End Sub
'Bouton Ajouter
Label_civilite.ForeColor = &H80000012
Label_nom.ForeColor = &H80000012
Label_prenom.ForeColor = &H80000012
Label_adresse.ForeColor = &H80000012
Label_lieu.ForeColor = &H80000012
Label_pays.ForeColor = &H80000012
Label_civilite.ForeColor = RGB(255, 0, 0)
Label_nom.ForeColor = RGB(255, 0, 0)
Label_prenom.ForeColor = RGB(255, 0, 0)
Label_adresse.ForeColor = RGB(255, 0, 0)
Label_lieu.ForeColor = RGB(255, 0, 0)
Label_pays.ForeColor = RGB(255, 0, 0)
Else
'Choix de civilité
If OptionButton_1 Then
Cells(ligne, 1) = OptionButton_1.Caption
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
End If
Cells(ligne, 2) = TextBox_nom
Cells(ligne, 4) = TextBox_adresse
Cells(ligne, 5) = TextBox_lieu
Cells(ligne, 6) = ComboBox_pays
OptionButton_1 = False
OptionButton_2 = False
OptionButton_3 = False
TextBox_nom = ""
TextBox_prenom = ""
TextBox_adresse = ""
TextBox_lieu = ""
ComboBox_pays.ListIndex = -1
End If
End Sub
'Bouton Fermer
Unload Me
End Sub
Chapitre 9 : Tableaux
Les tableaux permettent de stocker un grand nombre de valeurs contrairement aux variables qui
ne peuvent stocker qu'une seule valeur à la fois. Nous avons effleuré le sujet à la leçon sur les
variables, nous allons maintenant l'approfondir.
Imaginez que dans une procédure vous ayez besoin de stocker 500 valeurs. S'il fallait créer 500
variables pour stocker toutes ces valeurs, cela deviendrait vite très compliqué, tandis qu'avec
un tableau, le stockage et l'utilisation de ces valeurs seront grandement simplifiés. Le second
intérêt est la vitesse d'exécution (parcourir un tableau de données est infiniment plus rapide que
de parcourir une plage de cellules équivalente). Rien de tel qu'un exemple pour mieux
comprendre ...
La première feuille contient ici une base de données de 5000 lignes sur 3 colonnes :
La seconde feuille contient une grille où seront comptabilisés les OUI en fonction des années
et des clients :
En enregistrant tout d'abord la base de données dans un tableau et en effectuant ensuite les
mêmes calculs (en parcourant le tableau au lieu des cellules), il ne faudra que 1.67 secondes
pour exécuter la procédure :
Dans cet exemple, l'utilisation d'un tableau a permis d'exécuter la procédure environ 295x plus
rapidement.
Dim tab2(6, 1)
Dim tab3()
Si vous ne pouvez pas entrer de valeurs fixes (parce que cela dépend de la taille de la base de
données par exemple), laissez les parenthèses vides.
Vous n'avez pas besoin de déclarer un type (String, Integer, etc.) car dans bien des cas cela
ralentirait votre procédure.
Nous voulons enregistrer ici 11 x 1 valeurs, il faudra donc déclarer un tableau à une dimension
:
Dim tableau(10)
Le tableau tableau(10) peut contenir 11 valeurs, car rappelez-vous que la numérotation d'un
tableau commence à 0. Chaque élément du tableau reçoit ensuite sa valeur :
Sub exemple()
tableau(0) = Range("A2")
tableau(1) = Range("A3")
tableau(2) = Range("A4")
tableau(3) = Range("A5")
tableau(4) = Range("A6")
tableau(5) = Range("A7")
tableau(6) = Range("A8")
tableau(7) = Range("A9")
tableau(8) = Range("A10")
tableau(9) = Range("A11")
tableau(10) = Range("A12")
End Sub
Mais pour éviter toutes ces répétitions, l'utilisation d'une boucle For est plus que recommandée
:
Sub exemple()
For i = 0 To 10
Next
End Sub
Notez que vous pouvez utiliser, modifier chaque élément du tableau individuellement comme
une variable. En voici un exemple avec tableau(3), la 4e valeur du tableau :
For i = 0 To 10
Next
'Affichage 1
tableau(3) = Year(tableau(3))
'Affichage 2
End Sub
Dans cet exemple, la fonction Year (qui renvoie l'année d'une date) a été utilisée pour modifier
tableau(3).
LE TABLEAU À 2 DIMENSIONS
Pour enregistrer plusieurs colonnes de données, une dimension supplémentaire est nécessaire.
En voici un exemple :
'Déclarations
Dim i As Integer
For i = 0 To 10
Next
LE TABLEAU DYNAMIQUE
Imaginons que cette même base de données soit régulièrement mise à jour et que l'on ne puisse
donc pas entrer de valeurs fixes à la déclaration ... Dans ce cas, le tableau dynamique sera bien
utile.
Pour connaître le numéro de la dernière ligne de notre base de données, utilisez la formule
suivante :
Si vous entrez une variable lors de la déclaration, Excel ne l'acceptera pas. Déclarez un tableau
dynamique (parenthèses vides), puis définissez ses dimensions avec Redim :
Dim tableau()
ReDim tableau(derniereLigne - 2, 2)
De cette manière vous enregistrerez automatiquement toutes les lignes de la base de données
dans le tableau :
Sub exemple()
'Déclarations
'Redimensionnement
ReDim tableau(derniereLigne - 2, 2)
For i = 0 To derniereLigne - 2
Next
End Sub
UBOUND
Dans l'exemple ci-dessus, le dernier numéro de notre tableau était égal à derniereLigne - 2 :
For i = 0 To derniereLigne - 2
Cette fonction renvoie le plus grand numéro pour une dimension choisie (par défaut la
première). Quelques exemples pour mieux comprendre :
Sub exemple()
Dim tableau(10, 2)
End Sub
Il est possible d'enregistrer une plage de cellules dans un tableau sans passer par une boucle.
'Déclarations
For i = 0 To 10
Next
'Déclaration
Dim tableau()
tableau = Range("A2:C12")
Même si au premier abord cette seconde méthode semble séduisante, elle peut dans bien des
cas vous faire perdre plus de temps que la première méthode ...
En enregistrant vos données dans le tableau de cette manière, le premier numéro n'est pas 0
mais 1, cela peut être source de confusion. De plus, si au cours du développement vous
choisissez de n'enregistrer dans le tableau que les données répondant à certains critères (ou
effectuer toute autre opération), vous devrez de toute façon passer par une boucle.
ARRAY
Vous aurez peut-être parfois besoin de créer un tableau contenant une liste fixe de valeurs. Une
solution consiste à déclarer le tableau et à entrer les valeurs l'une après l'autre :
Dim tableau(5)
tableau(0) = "SI"
tableau(1) = "RECHERCHEV"
tableau(2) = "SOMME"
tableau(3) = "NB"
tableau(5) = "STXT"
Une solution bien plus pratique consiste à utiliser la fonction Array qui retourne un tableau de
valeurs :
SPLIT
La fonction Split permet de diviser une chaîne de caractères en un tableau en fonction d'un
délimiteur défini.
Pour convertir cette chaîne de caractères en tableau, utilisez la fonction Split et définissez le
séparateur :
Cette fonction permet d'assembler les valeurs d'un tableau en une chaîne de caractères :
EXERCICE PRATIQUE
Pour mettre en pratique l'utilisation des tableaux, vous allez réaliser par étapes la macro qui a
servi d'exemple pour démontrer la rapidité des tableaux.
Sub exercice()
'...
'...
Dim tableau()
'...
'...
'...
End Sub
Sub exercice()
If Sheets("RES").OptionButton_oui Then
valeurRecherchee = "OUI"
Else
valeurRecherchee = "NON"
End If
Dim tableau()
ReDim tableau(derniereLigne - 2, 1)
numero = 0
numero = numero + 1
End If
compteur = 0
For i = 0 To numero - 1
Next
Next
Next
End Sub
DERNIÈRE LIGNE
VALEUR RECHERCHÉE
Si le contrôle OptionButton_oui (de la feuille RES) est sélectionné, il faudra rechercher les
OUI, sinon il faudra rechercher les NON :
If Sheets("RES").OptionButton_oui Then
valeurRecherchee = "OUI"
Else
End If
DÉCLARATION DU TABLEAU
Dans le cas présent, il aurait été possible de calculer le nombre de OUI ou de NON de la feuille
BD pour redimensionner le tableau dynamique au nombre exact de données qu'il s'apprête à
recevoir.
Mais pour éviter ce calcul supplémentaire, le tableau est simplement redimensionné ici à la
taille de la base de données :
Dim tableau()
ReDim tableau(derniereLigne - 2, 1)
NUMÉRO
numero = 0
La boucle For parcourt chaque ligne de la base de données et enregistre les informations dans
le tableau si la colonne C contient la valeur recherchée :
numero = numero + 1
End If
Pour éviter de recalculer de nombreuses fois l'année de chaque date du tableau dans les
prochaines boucles, seule l'année de la date est enregistrée dans le tableau.
Après chaque entrée dans le tableau, la variable numéro est incrémenté de 1 pour la prochaine
entrée.
DÉCOMPTES
La boucle For parcourt ici chaque ligne de données du tableau (de 0 à numero - 1 qui correspond
au numéro de la dernière entrée) et recherche les correspondances pour l'année définie et le
numéro de client défini :
compteur = 0
For i = 0 To numero - 1
Next
Le résultat est ensuite inséré dans la cellule correspondant à l'année définie et au numéro de
client défini :
Il ne reste ensuite plus qu'à répéter ces opérations pour chaque année et chaque numéro de client
en les ajoutant entre 2 boucles For :
compteur = 0
For i = 0 To numero - 1
Next
Next
Next
SCREENUPDATING
Nous ne l'avons pas encore vu jusque-là mais vous pouvez encore ajouter la ligne suivante en
début de procédure pour accélérer l'exécution de la macro :
[Link] = False
En ajoutant cette ligne, vous demandez à Excel de ne pas actualiser l'affichage tant que la
procédure n'est pas terminée.
Dans ce cas, au lieu de voir chaque nombre être ajouté l'un après l'autre dans les cellules, tous
les nombres seront affichés en une fois.
Il existe de nombreuses fonctions VBA que vous pouvez utiliser dans vos développements.
Nous en avons utilisé quelques-unes à travers les exemples cours, telles que les fonctions
IsNumeric, Year, Split, Join, Array, Date, Chr, etc. Vous pouvez retrouver la liste de toutes les
principales fonctions VBA (avec un exemple d'utilisation pour chaque fonction) dans Fonctions
VBA.
FONCTIONS EXCEL
Il est également possible d'utiliser les fonctions Excel dans le code VBA. Après avoir entré
WorksheetFunction suivi d'un «.», la liste des fonctions apparaît :
Pour s'y retrouver, une liste des fonctions traduites en anglais est disponible sur ce site, en voici
un extrait :
L'exemple suivant affiche le nombre de cellules vides de la plage A1:D8 dans la boîte de
dialogue :
Sub exemple()
MsgBox [Link](Range("A1:D8"))
Pour cet exemple, nous allons créer une fonction SI personnalisée utilisable sur une feuille de
calcul comme n'importe quelle autre fonction d'Excel.
Pour afficher la valeur de la colonne B si la cellule de la colonne C contient OUI, nous pouvons
utiliser la formule =SI(C2="OUI";B2;0) :
L'objectif ici est de créer une fonction capable de faire cela =SI(C2 a un fond vert;B2;0) que
nous écrirons comme ceci : =SI_VERT(C2;B2) :
End Function
Les arguments :
Dans le cas présent, si le test est FAUX, la valeur sera 0 à chaque fois, c'est pour cela qu'un 3e
argument n'a pas été ajouté.
Pour vérifier si la couleur est correcte, vous pouvez utiliser une cellule contenant la bonne
couleur comme point de comparaison :
couleur = Sheets("Feuil1").Range("K1").[Link]
End Function
Mais pour éviter de dépendre d'une cellule, nous allons utiliser ici directement le numéro de la
couleur qui nous intéresse :
End Function
Pour connaître le numéro de couleur de fond d'une cellule, sélectionnez la cellule et exécutez
cette macro :
Sub test()
MsgBox [Link]
End Sub
[Link]
SI_VERT = celluleValeur
SI_VERT = 0
End If
End Function
[Link] indique que la fonction est volatile (comme c'est le cas pour la fonction
SI), ce qui signifie qu'elle doit être recalculée à chaque changement de valeur. Par exemple, si
vous modifiez l'un des montants (ou n'importe quelle autre cellule), la fonction est recalculée
est affichera le bon montant.
Sub actualiser()
[Link]
End Sub