Vba Excel
Vba Excel
Vba Excel
Cours VBA
1. Introduction
3. Les variables
4. Les conditions
5. Les boucles
8. Les événements
11. Compléments
Si vous pensez que créer des macros est trop compliqué et que ce n'est pas à votre
portée, soyez rassuré(e), ce cours est adapté aux personnes débutantes en
programmation et démarre de zéro.
Tout comme le cours Excel, les leçons sont riches en exemples et simplifiées autant
que possible afin de faciliter l'apprentissage du VBA.
Il est recommandé de suivre les leçons en respectant l'ordre donné car, à chaque
nouvelle leçon, vous aurez besoin des connaissances acquises au cours des leçons
précédentes.
1. Introduction
o Propriétés
o Couleurs
3. Les variables
4. Les conditions
5. Les boucles
8. Les événements
11. Compléments
Sub exemple()
End Sub
Créez maintenant un bouton de formulaire auquel vous allez associer cette macro
(vide pour le moment) :
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.
Sub exemple()
'Activation de la feuille 2
Sheets("Feuil2").Activate
'Sélection de la cellule A8
Range("A8").Select
End Sub
Aidez-vous des commentaires (texte en vert) pour bien comprendre les macros de ce cours.
End Sub
SÉLECTION DE CELLULES DISTINCTES
Sub exemple()
End Sub
End Sub
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
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()
End Sub
Sub exemple()
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()
End Sub
Sub exemple()
End Sub
« Gérez facilement les horaires de travail de vos collaborateurs grâce à cette application
Excel »
EXCEL-PRATIQUE
Formation Excel
Formation Macros Excel
Formation VBA Avancée
Formation Google Sheets
Blog Excel
Blog Dev
ForumContactFR
Cours VBA : les propriétés
Nous allons maintenant agir sur le contenu et l'apparence des cellules et des feuilles.
Sub proprietes()
'Macro incomplète
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
Sub proprietes()
'Cellule A8 = 48
Range("A8").Value = 48
'Traduction :
'La valeur de la cellule A8 est désormais : 48
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.
Sub proprietes()
End Sub
Sub proprietes()
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é.
Range("A8").Value = 48
Range("A8") = 48
MISE EN FORME DU TEXTE
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 :
End Sub
End Sub
Sub proprietes()
End Sub
End Sub
End Sub
End Sub
Sub proprietes()
End Sub
End Sub
End Sub
N'oubliez pas que seule une toute petite partie des possibilités de personnalisation sont
indiquées ici. Si la propriété dont vous avez besoin n'est pas détaillée sur cette page, n'ayez
pas peur d'utiliser l'enregistreur de macro pour vous éviter de longues recherches (en
enregistrant la manipulation dont vous avez besoin, vous pourrez retrouver plus facilement la
propriété recherchée pour pouvoir ensuite l'utiliser dans votre macro).
L'objectif ici est que A7 prenne la valeur de A1, ce qui nous donne :
Sub proprietes()
'A7 = A1
Range("A7") = Range("A1")
'Ou :
'Range("A7").Value = Range("A1").Value
End Sub
Sub proprietes()
Range("A7").Font.Size = Range("A1").Font.Size
End Sub
Ce qui est à gauche du = prend la valeur de ce qui est à droite du =.
Sub proprietes()
'Compteur de clics en A1
Range("A1") = Range("A1") + 1
End Sub
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
'Pour le moment A1 vaut encore 10
End Sub
WITH
Ce code permet de définir différentes propriétés à la cellule A8 de la feuille 2 :
Sub proprietes()
Sheets("Feuil2").Range("A8").Borders.Weight = 3
Sheets("Feuil2").Range("A8").Font.Bold = True
Sheets("Feuil2").Range("A8").Font.Size = 18
Sheets("Feuil2").Range("A8").Font.Italic = True
Sheets("Feuil2").Range("A8").Font.Name = "Arial"
End Sub
Sub proprietes()
End Sub
Bien que ce ne soit pas indispensable dans ce cas, il est également possible de faire
de même pour .Font, ce qui nous donnerait :
Sub proprietes()
With Sheets("Feuil2").Range("A8")
.Borders.Weight = 3
With .Font
.Bold = True
.Size = 18
.Italic = True
.Name = "Arial"
End With
End With
End Sub
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
COLORINDEX
Voici les 56 couleurs disponibles avec ColorIndex :
Sub couleurs()
End Sub
Ce qui nous donne :
COLOR
Voici un exemple similaire avec Color :
Sub couleurs()
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
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 :
Sub couleurs()
End Sub
Pour les versions d'Excel inférieures à 2007 : le nombre de couleurs est limité (la
couleur disponible la plus proche de la valeur RGB sera utilisée).
Sub couleurs()
'Epaisseur de la bordure
ActiveCell.Borders.Weight = 4
End Sub
Aperçu :
End Sub
Aperçu :
End Sub
Aperçu :
End Sub
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
MsgBox maVariable
Le résultat de ce code :
Si pour le moment vous ne comprenez pas bien l'intérêt d'utiliser des variables,
soyez rassuré, les exemples abordés au cours des prochaines leçons vous en
démontreront l'utilité.
'Exemple : texte
Dim varTexte As String
varTexte = "Excel-Pratique.com"
'Exemple : date
Dim varDate As Date
varDate = "06/06/2021"
'Exemple : vrai/faux
Dim varBoolean As Boolean
varBoolean = True
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()
End Sub
Sub variables()
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Voici l'objectif :
Prenez un moment pour effectuer cette modification vous-même avant de passer à la
solution un peu plus bas ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
La solution :
Sub variables()
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Une variable numeroLigne a été ajoutée :
numeroLigne = Range("F5") + 1
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
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
LES 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).
Dans cette déclaration, il n'y a qu'un chiffre entre parenthèses, il s'agit donc d'un
tableau à une dimension.
0
1
2
3
4
Et voici comment attribuer des valeurs aux 5 cases de ce tableau :
LE TABLEAU À 2 DIMENSIONS
'Exemple de déclaration de tableau à 2 dimensions
Dim tab2(4, 3) As String
0, 0
0, 1
0, 2
0, 3
1, 0
1, 1
1, 2
1, 3
2, 0
2, 1
2, 2
2, 3
3, 0
3, 1
3, 2
3, 3
4, 0
4, 1
4, 2
4, 3
Et voici comment attribuer des valeurs aux cases d'un tableau à 2 dimensions :
Par exemple, ces quelques lignes calculent le montant de la TVA en fonction d'un
taux de TVA de 12.34% :
Sub exemple()
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()
End Sub
Par convention, une constante se nomme en majuscules en séparant les mots par un _ (par
exemple : EXEMPLE_DE_NOM).
Sub procedure1()
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
Même principe pour utiliser une variable dans tous les modules, à la différence près
que Dim est remplacé par Public :
Sub procedure1()
End Sub
End Sub
Sub exemple()
'Déclaration
Dim user1 As Utilisateur
'Exemple d'utilisation
MsgBox user1.Nom & " " & user1.Prenom
End Sub
Sub exemple()
'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()
'Boîte de dialogue
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()
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End Sub
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 à
<>Est différent de
< Est plus petit que
<=Est plus petit ou égal à
> Est plus grand que
>=Est plus grand ou égal à
[CONDITION 1] And [CONDITION 2]
And Et
Les 2 conditions doivent être vraies
[CONDITION 1] Or [CONDITION 2]
Or Ou
Au moins 1 des 2 conditions doit être vraie
Not [CONDITION]
Not Faux
La condition doit être fausse
[NOMBRE] Mod [DIVISEUR]
ModModulo
Cet opérateur retourne le reste d'une division
Sub exemple()
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.
Sub exemple()
numeroLigne = Range("F5") + 1
nbLignes = WorksheetFunction.CountA(Range("A:A")) 'Fonction NBVAL
ELSEIF
ElseIf permet d'ajouter plusieurs conditions à la suite :
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
Dim note As Single, commentaire As String
note = Range("A1")
'Commentaire en B1
Range("B1") = 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).
Sub commentaires()
'Variables
Dim note As Single, commentaire As String
note = Range("A1")
'Commentaire en B1
Range("B1") = commentaire
End Sub
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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 :
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 :
Il existe de nombreuses autres fonctions que vous pouvez utiliser dans vos
conditions (ou plus généralement dans vos codes VBA).
Vous pourrez retrouver la liste des principales fonctions VBA sur la page Fonctions VBA du
site.
FONCTIONS DE DATES
Il existe de nombreuses fonctions de dates et d'heures pouvant être utilisées dans
des conditions, en voici quelques exemples.
FONCTION ISEMPTY
La fonction IsEmpty renvoie True si la variable a été initialisée ou False si ce n'est
pas le cas :
Dans cet exemple, la condition est vraie car aucun type ni valeur n'ont été attribués
à maVariable :
Sub exemple()
Dim maVariable
If IsEmpty(maVariable) Then
MsgBox "Ma variable n'a pas été initialisée !"
Else
MsgBox "Ma variable contient : " & maVariable
End If
End Sub
Dans ce cas, les 2 chaînes de caractères sont identiques, l'expression est donc
vraie.
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.
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
Ce code est très répétitif ...
Maintenant, imaginez qu'il faille numéroter plusieurs milliers de lignes ... Vous
comprenez donc probablement l'intérêt de créer des boucles.
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).
Sub exemple()
Do While numero <= 12 'Tant que la variable numero est <= 12, la boucle
est répétée
Cells(numero, 1) = numero 'Numérotation
numero = numero + 1 'Le numéro est augmenté de 1 à chaque boucle
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]
'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ées au moins une fois :
Sub exemple()
Do
'Instructions
Loop While [CONDITION]
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
Sub exemple()
Dim i As Integer
For i = 1 To 5
MsgBox i 'Renvoie les valeurs : 1 / 2 / 3 / 4 / 5
Next
End Sub
Sub exemple()
Dim i As Integer
For i = 10 To 0 Step -2
MsgBox i 'Renvoie les valeurs : 10 / 8 / 6 / 4 / 2 / 0
Next
End Sub
FOR EACH NEXT
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()
End Sub
Sub exemple()
End Sub
Sub exemple()
tableau(0) = "A"
tableau(1) = "B"
tableau(2) = "C"
End Sub
Sub exemple()
Dim i As Integer
Next
End Sub
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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 :
Voici le point de départ de l'exercice :
Sub exerciceBoucles()
'...
End Sub
Prenez quelques instants pour créer cette boucle avant de passer à la solution ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
La solution :
Sub exerciceBoucles()
End Sub
Créez maintenant une seconde boucle qui va répéter la première boucle sur 10
lignes, aperçu :
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
La solution :
Sub exerciceBoucles()
Next
End Sub
Trouvez maintenant une solution pour obtenir une numérotation de 1 à 100, aperçu :
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Une solution "simple" consiste à utiliser une variable qui sera incrémentée de 1 après
chaque entrée dans une cellule :
Sub exerciceBoucles()
Next
End Sub
Une autre solution consiste à calculer la valeur à insérer dans la cellule à l'aide des
numéros de colonne et de ligne :
Sub exerciceBoucles()
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
:
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
La solution :
Sub exerciceBoucles()
Next
Next
End Sub
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.
Navigation sans publicités
Option "No Tracking"
Option "Mode Incognito" (sur le forum)
Option "Dark Mode"
Plus d'informations ...
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 à :
Un exemple simple :
End Sub
Sub exemple()
End Sub
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 exemple()
End Sub
En cas d'arguments multiples, ceux-ci doivent être séparés par des virgules.
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 :
Sub exemple()
nom = Range("A1")
prenom = Range("B1")
age = Range("C1")
End Sub
End If
End Sub
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) :
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 exemple()
carre nombre
MsgBox nombre
End Sub
valeur = valeur ^ 2
End Sub
Pour mieux comprendre, voici ce qui se passe lorsque la macro est lancée :
'Fin de la sous-procédure
End Sub
'La variable "nombre" a été modifiée, 900 est alors affiché dans la boîte
de dialogue
MsgBox nombre
'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 exemple()
End Sub
Vous pouvez remarquer que les arguments d'une fonction sont ajoutés
entre () contrairement aux procédures où elles sont superflues.
Sub effacerB2()
Range("B2").ClearContents
MsgBox "Le contenu de B2 a été effacé !"
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.
Sub effacerB2()
End Sub
Aperçu :
vbOKOnly 0
vbOKCancel 1
vbAbortRetryIgnore 2
vbYesNoCancel 3
vbYesNo 4
vbRetryCancel 5
vbCritical 16
vbQuestion 32
vbExclamation 48
vbInformation 64
Par exemple, pour une boîte de dialogue avec "Oui, Non, Annuler" + icône
exclamation + bouton 2 par défaut :
Aperçu :
Les constantes peuvent être remplacées par leur valeur respective, ces 3 lignes
affichent une boîte de dialogue identique :
vbOK 1
vbCancel 2
vbAbort 3
vbRetry 4
vbIgnore 5
vbYes 6
vbNo 7
Voici l'exemple d'une MsgBox qui apparaît en boucle tant que le bouton "Oui" n'est
pas cliqué :
Sub humour()
Do
If MsgBox("Aimez-vous le site Excel-Pratique ?", 36, "Sondage") =
vbYes Then
Exit Do 'Si réponse = Oui on sort de la boucle
End If
Loop While True 'Boucle infinie
MsgBox ";-)"
End Sub
MsgBox "Exemple 1" & Chr(10) & "Exemple 2" & Chr(10) & Chr(10) & "Exemple
3"
Aperçu :
INPUTBOX
La fonction InputBox demande à l'utilisateur d'entrer une valeur dans une boîte de
dialogue, exemple :
Sub exemple()
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 :
Aperçu :
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
End Sub
'Si l'utilisateur répond Non, la variable Cancel vaudra True (ce qui
annulera la fermeture)
If MsgBox("Etes-vous certain de vouloir fermer ce classeur ?", 36,
"Confirmation") = vbNo Then
Cancel = True
End If
End Sub
WORKBOOK_BEFORESAVE (AVANT
ENREGISTREMENT)
Cet événement se déclenche juste avant l'enregistrement :
End Sub
WORKBOOK_AFTERSAVE (APRÈS
ENREGISTREMENT)
Cet événement se déclenche juste après l'enregistrement :
End Sub
End Sub
WORKBOOK_SHEETACTIVATE (À L'ACTIVATION
D'UNE FEUILLE)
Cet événement se déclenche à chaque changement de feuille :
End Sub
End Sub
WORKBOOK_SHEETBEFOREDOUBLECLICK (AVANT
DOUBLE-CLIC)
Cet événement se déclenche juste avant un double-clic sur une cellule :
End Sub
End Sub
WORKBOOK_SHEETBEFORERIGHTCLICK (AVANT
CLIC DROIT)
Cet événement se déclenche juste avant un clic droit sur une cellule :
End Sub
WORKBOOK_SHEETCHANGE (À CHAQUE
MODIFICATION DE CELLULE)
Cet événement se déclenche à chaque modification du contenu d'une cellule :
End Sub
WORKBOOK_SHEETSELECTIONCHANGE (À
CHAQUE CHANGEMENT DE SÉLECTION)
Cet événement se déclenche à chaque changement de sélection sur une feuille de
calcul :
End Sub
End Sub
End Sub
WORKSHEET_SELECTIONCHANGE (AU
CHANGEMENT DE SÉLECTION)
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 :
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 :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End Sub
WORKSHEET_ACTIVATE (À L'ACTIVATION DE LA
FEUILLE)
Cet événement se déclenche lorsque la feuille est activée :
End Sub
Range("D5").Select
End Sub
WORKSHEET_DEACTIVATE (À LA SORTIE DE LA
FEUILLE)
Cet événement se déclenche lorsqu'une autre feuille du classeur est activée :
End Sub
Par exemple, effacement du contenu des cellules B2 à B10 après avoir quitté la
feuille :
Range("B2:B10").ClearContents
End Sub
WORKSHEET_BEFOREDOUBLECLICK (AU DOUBLE-
CLIC)
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) :
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 :
End Sub
End Sub
'Instructions ...
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
Pour modifier le titre de l'UserForm, modifiez sa propriété Caption :
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 :
Les propriétés d'un UserForm peuvent également être modifiées à partir d'un code VBA.
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
Me.Height = 250
Me.Width = 250
End Sub
Me.Height = 250
Me.Width = 250
End Sub
Me.Height = Me.Height + 50
Me.Width = Me.Width + 50
End Sub
Sub lancerUserform()
UserForm_Exemple.Show
End Sub
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 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.
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 :
L'événement Click est déclenché au clic sur le bouton :
End Sub
End Sub
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 :
End Sub
Le fichier : userform1.xlsm
'Numéro 1
If CheckBox1.Value = True Then 'Si coché
Range("B2") = "Oui"
Else 'Si décoché
Range("B2") = "Non"
End If
'Numéro 2
If CheckBox2.Value = True Then 'Si coché
Range("B3") = "Oui"
Else 'Si décoché
Range("B3") = "Non"
End If
'Numéro 3
If CheckBox3.Value = True Then 'Si coché
Range("B4") = "Oui"
Else 'Si décoché
Range("B4") = "Non"
End If
'Fermeture
Unload Me
End Sub
'Numéro 1
If CheckBox1 Then 'Si coché
Range("B2") = "Oui"
Else 'Si décoché
Range("B2") = "Non"
End If
'Numéro 2
If CheckBox2 Then 'Si coché
Range("B3") = "Oui"
Else 'Si décoché
Range("B3") = "Non"
End If
'Numéro 3
If CheckBox3 Then 'Si coché
Range("B4") = "Oui"
Else 'Si décoché
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
'Fermeture
Unload Me
End Sub
Controls("CheckBox1") est l'équivalent du contrôle CheckBox1 et permet d'accéder à un
contrôle en fonction de son nom, ce qui peut être très pratique notamment dans une boucle.
Dans cet exemple, les cases sont toutes décochées à l'ouverture de l'UserForm.
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
If Range("B" & i + 1) = "Oui" Then Controls("CheckBox" & i) = True
Next
End Sub
Le fichier : userform2.xlsm
Cours VBA : les contrôles (partie
2)
LES BOUTONS D'OPTION (OPTIONBUTTON)
Contrairement aux cases à cocher, l'utilisateur ne peut choisir qu'un seul bouton
d'option par groupe.
Il faudra séparer ici les boutons d'option en 2 groupes puis enregistrer les résultats
dans 2 cellules :
Le fichier : userform3.xlsm
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 :
Répétez ensuite l'opération pour les 4 autres contrôles (en entrant une valeur
différente).
Pour enregistrer les réponses dans les cellules de la feuille, nous allons tout d'abord
ajouter l'événement Click du bouton Enregistrer.
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
If Controls("OptionButton_a_" & i) Then Range("A2") =
Controls("OptionButton_a_" & i).Caption
Next
'Question 2
For i = 1 To 4
If Controls("OptionButton_b_" & i) Then Range("B2") =
Controls("OptionButton_b_" & i).Caption
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
If Controls("OptionButton_a_" & i) Then Range("A2") = i
Next
'Question 2
For i = 1 To 4
If Controls("OptionButton_b_" & i) Then Range("B2") = i
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
If Controls("OptionButton_a_" & i) Then choix1 = i
Next
'Question 2
For i = 1 To 4
If Controls("OptionButton_b_" & i) Then choix2 = i
Next
'Si 2 réponses
If choix1 > 0 And choix2 > 0 Then
'Enregistrement
Range("A2") = choix1
Range("B2") = choix2
'Fermeture
Unload Me
'Message d'erreur
MsgBox "Vous devez répondre à toutes les questions avant de valider
le formulaire.", 48, "Erreur"
End If
End Sub
Le fichier : userform3b.xlsm
Au lancement de l'UserForm, nous voulons que les 4 pays soient chargés dans la
liste déroulante (à l'aide de la méthode AddItem) :
Dim i As Integer
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.
colonne = ComboBox_Pays.ListIndex + 1
'Numéro de la sélection
colonne = ComboBox_pays.ListIndex + 1
End Sub
End Sub
Le fichier : userform4b.xlsm
Notez que pour manipuler un contrôle ActiveX sur une feuille, le Mode Création doit
être activé :
Double-cliquez maintenant sur le bouton et modifiez ses propriétés pour obtenir :
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 :
'Sinon
Else
End If
End Sub
Le fichier : togglebutton.xlsm
Le fichier : controles_exercice.xlsm
Prenez un moment pour réaliser cet exercice avant de passer à la solution ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
LE BOUTON "FERMER"
Evénement Click du bouton Fermer :
Unload Me
End Sub
Dim i As Integer
End Sub
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é :
Private Sub CommandButton_ajouter_Click()
End Sub
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 :
End If
End Sub
INSERTION DES DONNÉES
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
ElseIf OptionButton_2 Then
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
End If
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 (ou de connaître le numéro de la dernière ligne d'un tableau, et dans ce cas, il ne
faudra pas ajouter + 1).
VUE D'ENSEMBLE
Pour terminer, voici le code complet ainsi que le fichier :
'Ouverture de l'UserForm
Private Sub UserForm_Initialize()
Dim i As Integer
End Sub
'Bouton Ajouter
Private Sub CommandButton_ajouter_Click()
'Choix de civilité
If OptionButton_1 Then
Cells(ligne, 1) = OptionButton_1.Caption
ElseIf OptionButton_2 Then
Cells(ligne, 1) = OptionButton_2.Caption
Else
Cells(ligne, 1) = OptionButton_3.Caption
End If
End If
End Sub
'Bouton Fermer
Private Sub CommandButton_fermer_Click()
Unload Me
End Sub
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 :
Dans cet exemple, la procédure va parcourir la base de données en boucle et
comptabilisera pour chaque année et chaque numéro de client le nombre
de OUI avant de l'entrer dans la cellule correspondante.
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.
Dim tableau(10)
Sub exemple()
Dim tableau(10)
End Sub
Mais pour éviter toutes ces répétitions, l'utilisation d'une boucle For est plus que
recommandée :
Sub exemple()
End Sub
Notez que vous pouvez utiliser, modifier chaque élément du tableau individuellement
comme une variable.
'Affichage 1
MsgBox tableau(3) 'Renvoie : 08.03.2023
'Affichage 2
MsgBox tableau(3) 'Renvoie : 2023
End Sub
Dans cet exemple, la fonction Year (qui renvoie l'année d'une date) a été utilisée
pour modifier tableau(3).
En voici un exemple :
Enregistrement des données dans un tableau à 2 dimensions :
'Déclarations
Dim tableau(10, 2) 'Tableau de 11 x 3 "cases"
Dim i As Integer
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 (que nous avions vu lors du précédent exercice) :
Dim tableau()
ReDim tableau(derniereLigne - 2, 2)
Sub exemple()
'Déclarations
Dim tableau(), derniereLigne As Integer, i As Integer
'Redimensionnement
ReDim tableau(derniereLigne - 2, 2)
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
Une solution pour connaître ce numéro (si cette information n'est pas déjà
disponible) consiste à utiliser la fonction Ubound :
For i = 0 To UBound(tableau)
Cette fonction renvoie le plus grand numéro pour une dimension choisie (par défaut
la première).
Sub exemple()
Dim tableau(10, 2)
End Sub
'Déclarations
Dim tableau(10, 2) 'Tableau de 11 x 3 "cases"
Dim i As Integer
'Déclaration
Dim tableau()
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 ...
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(4) = "ESTNUM"
tableau(5) = "STXT"
SPLIT
La fonction Split permet de diviser une chaîne de caractères en un tableau en
fonction d'un délimiteur défini.
JOIN
La fonction à l'opposé de Split est Join.
Cette fonction permet d'assembler les valeurs d'un tableau en une chaîne de
caractères :
Le fichier : tableaux_exercice.xlsm
Sub exercice()
End Sub
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Voici une solution pour réaliser cet exercice (des informations complémentaires sont
disponibles un peu plus bas) :
Sub exercice()
Next
Next
End Sub
DERNIÈRE LIGNE
Calcul de la dernière ligne de données de la feuille BD (détaillé dans le précédent
exercice) :
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 :
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.
NUMÉRO
La variable numero va permettre de déterminer la position des enregistrements dans
le tableau (et commence à 0) :
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 :
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 :
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 :
Application.ScreenUpdating = 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.
FICHIER
Le fichier complété : tableaux_exercice_complete.xlsm
Cours VBA : utilisations des
fonctions
FONCTIONS VBA
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.
Pour s'y retrouver, une liste des fonctions traduites en anglais est disponible sur ce
site, en voici un extrait :
Sub exemple()
MsgBox WorksheetFunction.CountBlank(Range("A1:D8"))
End Sub
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").Interior.color
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
Sub test()
MsgBox ActiveCell.Interior.color
End Sub
Application.Volatile
End Function
Sub actualiser()
Application.Calculate
End Sub
Mais vous vous demandez probablement : « Comment utiliser toutes ces connaissances
que je viens d'apprendre pour créer l'application dont j'ai besoin ? ».
La formation VBA avancée est l'étape suivante qui vous enseignera tout ce que vous
devez savoir pour pouvoir créer l'application dont vous avez besoin, même si à
l'heure actuelle cela vous paraît être encore un défi insurmontable.
Que votre objectif soit de créer une application de gestion de plannings, de comptes,
de clients, un outil de facturation, de devis, etc, vous acquerrez au cours de cette
formation des connaissances pratiques que vous pourrez ensuite utiliser pour créer
vos propres applications de gestion.
Et la bonne nouvelle est que cette formation pratique en vidéo peut maintenant être suivie
gratuitement jusqu'à la fin (comme ce cours VBA que vous venez de terminer) alors
qu'auparavant cette formation était payante !