Cours VBA Gratuit
Cours VBA Gratuit
Grâce aux différentes leçons proposées, vous allez apprendre le VBA (macros
Excel) gratuitement.
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.
En cas de difficultés, posez vos questions sur le forum qui est là pour vous
aider.
LEÇON 1
Introduction
Première macro
LEÇON 2
Les sélections
Les propriétés
Les couleurs
LEÇON 3
Les variables
Les variables (partie 2)
LEÇON 4
Les conditions
Les conditions (partie 2)
LEÇON 5
Les boucles
Les boucles (exercice)
LEÇON 6
Les procédures et fonctions
LEÇON 7
Les boîtes de dialogue
LEÇON 8
Les événements Workbook
Les événements Worksheet
LEÇON 9
Les formulaires et contrôles
Les formulaires et contrôles (partie 2)
Les formulaires et contrôles (partie 3)
Les formulaires et contrôles (partie 4)
Les formulaires et contrôles (exercice)
LEÇON 10
Les tableaux
Les tableaux (partie 2)
Les tableaux (exercice)
LEÇON 11
Utilisations des fonctions
Création d'une fonction personnalisée
RESSOURCES VBA
Fonctions VBA
Astuces VBA
les sélections
Ouvrez l'éditeur et ajoutez-y un module :
Dans le module, tapez sub exemple et appuyez sur Entrée.
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.
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
Aidez-vous des commentaires (texte en vert) pour bien comprendre les macros de ce cours.
End Sub
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()
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()
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
« Visualisez facilement vos projets et leurs tâches grâce à cette application
Excel »
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 (relisez la page des Sélections en cas de besoin) :
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.
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 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
End Sub
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()
End Sub
End Sub
End Sub
End Sub
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).
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
'Pendant l'exécution de la ligne ci-dessous :
'- la valeur à droite du = est calculée en priorité (A1 vaut toujours 10, cela
donne 10 + 1)
'- après calcul, la valeur à droite du = vaut donc 11
'- A1 prend ensuite la valeur à droite du = (soit la valeur 11)
Range("A1") = Range("A1") + 1
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
« Visualisez facilement vos projets et leurs tâches grâce à cette application
Excel »
les couleurs
COURS AU FORMAT PDF
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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
Voici les 56 couleurs disponibles avec ColorIndex :
Pour appliquer à notre texte l'une de ces 56 couleurs, nous écrirons :
Sub couleurs()
End Sub
Pour les versions d'Excel inférieures à 2007 : l'utilisation de ColorIndex est préférable à Color.
COLOR
Voici un exemple similaire avec Color :
Sub couleurs()
End Sub
La couleur ici est RGB(50, 200, 100).
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 :
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 :
'Déclaration de la variable
Dim maVariable As Integer
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
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 :
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 = "09/04/2024"
'Exemple : vrai/faux
Dim varBoolean As Boolean
varBoolean = True
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 :
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()
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()
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Ce qui nous donne :
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 :
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
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
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)
Notre macro affiche maintenant la ligne du tableau qui nous intéresse.
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).
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.
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 :
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.
Sub exemple()
End Sub
Sub exemple()
'Déclaration de la constante + attribution de sa valeur
Const TAUX_TVA As Double = 0.1234
End Sub
Par convention, une constante se nomme en majuscules en séparant les mots par
un _ (par exemple : EXEMPLE_DE_NOM).
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
Même principe pour utiliser une variable dans tous les modules, à la différence
près que Dim est remplacé par Public :
Public var1 As Integer
Sub procedure1()
End Sub
End Sub
Sub exemple()
'Déclaration
Dim user1 As Utilisateur
'Exemple d'utilisation
MsgBox user1.Nom & " " & user1.Prenom
End Sub
les conditions
ACCES PREMIUM
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()
'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.
La fonction IsNumeric sera utilisée dans cette condition :
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
'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.
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()
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.
Nous demandons à cette fonction de comptabiliser le nombre de cellules non vides de la première colonne et
nous remplaçons ensuite 17 par nbLignes :
Sub exemple()
numeroLigne = Range("F5") + 1
nbLignes = WorksheetFunction.CountA(Range("A:A")) 'Fonction NBVAL
ELSEIF
ElseIf permet d'ajouter plusieurs conditions à la suite :
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")
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.
La fonction IsDate renvoie True si la valeur est une date ou False si ce n'est pas le cas :
FONCTION ISEMPTY
La fonction IsEmpty renvoie False si la variable a été initialisée ou True 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.
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.
Nous pouvons également remplacer un caractère en fonction d'une plage de caractères ou de caractères
précis :
Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit être ajouté après [ :
les boucles
ACCES PREMIUM
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
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
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
MsgBox i 'Renvoie les valeurs : 10 / 8 / 6 / 4 / 2 / 0
Next
End Sub
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
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
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
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
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
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 exemple()
End Sub
Pour exécuter la procédure avertissement, il faudra donc entrer en argument une valeur de type String :
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 :
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 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) :
Private Sub boiteDialogue(nom As String, Optional prenom As String = "", Optional age
As Integer = 0)
If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom
MsgBox nom
Else 'Sinon, on affiche le nom et le prénom
MsgBox nom & " " & prenom
End If
If prenom = "" Then 'Si le prénom est manquant, on n'affiche que le nom
MsgBox nom & ", " & age & " ans"
Else 'Sinon on affiche le nom, le prénom et l'âge
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 exemple()
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 :
'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
Private Sub carre(ByRef valeur As Integer)
'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, 900 est alors affiché dans la boîte de dialogue
MsgBox nombre
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.
'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.
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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 :
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.
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 :
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()
resultat = InputBox("Texte ?", "Titre") '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
Aperçu :
Il est également possible d'indiquer une valeur par défaut en troisième
argument :
Aperçu :
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 :
L'événement Workbook_Open est ajouté par défaut, il agit à l'ouverture du classeur :
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
La fermeture du classeur peut être annulée en attribuant la valeur True à la variable Cancel.
End Sub
End Sub
End Sub
End Sub
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
End Sub
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
« Gérez facilement la comptabilité d'une petite structure grâce à cette
application Excel »
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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.
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 :
End Sub
End Sub
Range("D5").Select
End Sub
End Sub
Par exemple, effacement du contenu des cellules B2 à B10 après avoir quitté la feuille :
Range("B2:B10").ClearContents
End Sub
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
Le clic droit peut être annulé en attribuant la valeur True à la variable Cancel (dans ce cas, le menu
contextuel ne sera pas affiché).
WORKSHEET_CHANGE (À CHAQUE MODIFICATION DE
CELLULE)
Cet événement se déclenche lors de modifications du contenu des cellules de la feuille :
End Sub
'Instructions ...
UserForm
ACCES PREMIUM
Pour ajouter un UserForm, procédez de la même manière que pour un nouveau module :
La fenêtre de l'UserForm ainsi que celle de la Boîte à outils apparaissent :
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
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) :
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
LANCER UN USERFORM
Pour lancer un UserForm à partir d'une procédure, utilisez Show :
Sub lancerUserform()
UserForm_Exemple.Show
End Sub
« Gérez facilement votre stock (articles, entrées, sorties, clients, fournisseurs,
etc) grâce à cette application Excel »
les contrôles
COURS AU FORMAT PDF
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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).
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
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.
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 :
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
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
'Si une ou plusieurs réponses manquantes
Else
'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
Le fichier : userform4.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
Au changement de sélection dans la liste déroulante, la liste des villes correspondant au pays choisi doit
ensuite être affichée dans la zone de liste.
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 :
'Numéro de la sélection
colonne = ComboBox_pays.ListIndex + 1
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
Le fichier : userform4b.xlsm
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
Notez que pour manipuler un contrôle ActiveX sur une feuille, le Mode Création doit être activé :
Le précédent double-clic a également ajouté l'événement Click du bouton dans la feuille où se trouve le
bouton :
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
EXERCICE PRATIQUE
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.
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
VÉRIFICATION DES CONTRÔLES
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é :
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
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 (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
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 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.
INTÉRÊT DES TABLEAUX
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).
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.
Sans utiliser de tableau, il faudra 171.11 secondes à Excel pour exécuter la procédure :
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 :
Et si l'on décide d'optimiser la procédure en n'enregistrant que les données avec les OUI dans le tableau (ce
qui représente environ le 3/4 des données) et uniquement les années des dates, 0.58 secondes suffisent :
Dans cet exemple, l'utilisation d'un tableau a permis d'exécuter la procédure environ 295x plus rapidement.
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)
Le tableau tableau(10) peut contenir 11 valeurs, car rappelez-vous que la numérotation d'un tableau
commence à 0.
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.
En voici un exemple avec tableau(3), la 4e valeur du tableau :
Sub exemple()
'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).
LE TABLEAU À 2 DIMENSIONS
Pour enregistrer plusieurs colonnes de données, une dimension supplémentaire est nécessaire.
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) :
derniereLigne = Cells(Rows.Count, 1).End(xlUp).Row
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
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é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 ...
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(4) = "ESTNUM"
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 :
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 :
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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.
Le fichier : tableaux_exercice.xlsm
Sub exercice()
End Sub
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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.
Mais pour éviter ce calcul supplémentaire, le tableau est simplement
redimensionné ici à la taille de la base de données :
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
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
« Gérez facilement votre stock (articles, entrées, sorties, clients, fournisseurs,
etc) grâce à cette application Excel »
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 WorksheetFunction.CountBlank(Range("A1:D8"))
End Sub
« Gérez facilement votre stock (articles, entrées, sorties, clients, fournisseurs,
etc) grâce à cette application Excel »
Ce cours est également disponible au format PDF, téléchargeable en un seul fichier Zip de :
26 fichiers PDF
14 fichiers Excel
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").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
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 ActiveCell.Interior.color
End Sub
Application.Volatile
End Function
Application.Volatile 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.
En revanche, la seule modification de la couleur de fond ne déclenche pas cette mise à jour. Pour recalculer
les valeurs sans attendre, vous pouvez par exemple appuyer sur Delete en sélectionnant une cellule vide ou
ajouter un bouton Actualiser pour tout recalculer d'un clic :
Sub actualiser()
Application.Calculate
End Sub
Vous pouvez télécharger le fichier qui a servi d'exemple : fonction_si_vert.xlsm
FIN
Le cours VBA se termine ici, en espérant qu'il vous aidera dans vos futurs développements.
Si vous avez apprécié ce cours, vous avez la possibilité de télécharger les PDF de la totalité de ce cours. Il
s'agit d'une option payante complètement facultative qui contribue à soutenir le site et le développement de
nouveaux contenus.
Pour aller plus loin, vous trouverez d'autres exemples de codes VBA dans Astuces VBA et des exemples
d'utilisations des fonctions VBA dans Fonctions VBA.
Une formation pratique en vidéo pour apprendre à créer une application de gestion en VBA est également
disponible.
Pour toute question, n'hésitez pas à utiliser le forum qui est là pour vous aider en cas de problème.
Astuces VBA
DATES ET HEURES
Calculer le nombre de jours dans un mois (ou le dernier jour du mois)
Calculer le numéro de jour de la semaine (1 à 7) ou l'afficher au format texte (Lundi-Dimanche, LU-
DI)
Formats d'affichage des dates et heures
Programmer l'exécution d'une macro dans X secondes ou à une heure déterminée avec OnTime
DIVERS
Accélérer l'exécution d'une macro
Activer les macros (pour toutes les versions d'Excel)
Créer une animation
Débloquer les macros Excel
Désactiver temporairement les événements
Effectuer une action différente selon la version d'Excel utilisée
Extraire des données d’un site Web
Importer des données d’un site Web
Opérateur ternaire en VBA
Protéger le code VBA grâce à l'obfuscation
Simplifier les conditions en VBA
Stopper une macro en cours d'exécution
FEUILLES ET CLASSEURS
Afficher ou masquer une feuille
Déterminer le numéro de la dernière ligne d'un tableau
Empêcher la modification du nom d'une feuille
Empêcher l'enregistrement d'un fichier Excel
Exécuter une action une seule fois
Interdire la sélection de plusieurs cellules
Forcer l'activation des macros pour utiliser le classeur Excel
Masquer les onglets d'un classeur
Protéger l'accès au code VBA par mot de passe
Récupérer la couleur d'une MFC avec une fonction Excel
GÉNÉRATEURS ET CALCULS
Convertir une couleur hexadécimale en valeur Color
Générer des nombres aléatoires
Générer des codes aléatoires
Racine carrée (et carré)
Vérifier si une valeur est un nombre entier
VARIABLES ET TABLEAUX
Rechercher la position d'une valeur dans un tableau
Rechercher la présence d'une valeur dans un tableau
Réinitialiser un tableau
Trier un tableau