Académique Documents
Professionnel Documents
Culture Documents
Grâce au VBA nous allons pouvoir réaliser à peu près tout ce que l'on souhaite avec
Excel ...
Mais avant de démarrer, commençons par afficher les outils qui nous seront utiles.
Pour travailler avec du code VBA, nous avons besoin d'un éditeur, celui-ci est déjà
installé et vous pouvez l'ouvrir avec le raccourci Alt + F11 (ou en cliquant sur Visual
Basic depuis l'onglet Développeur) :
Pour prendre un exemple simple, nous allons automatiser les opérations suivantes :
Pour ce faire, cliquez sur Enregistrer une macro puis sur Ok, exécutez les opérations
décrites ci-dessus sans interruption (car toutes les manipulations sont enregistrées)
et pour terminer cliquez sur Arrêter l'enregistrement.
Pour les versions d'Excel inférieures à 2007 : Outils > Macros > Nouvelle macro.
Excel a enregistré vos manipulations et les a traduites en code VBA.
Pour voir votre macro, ouvrez l'éditeur (Alt + F11) et cliquez sur Module1 :
Sub Macro1()
'
' Macro1 Macro
'
'
Columns("A:A").Select
Selection.ClearContents
Columns("C:C").Select
Selection.ClearContents
Columns("B:B").Select
Selection.Cut Destination:=Columns("A:A")
Columns("D:D").Select
Selection.Cut Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Sub et End Sub délimitent le début et la fin de la macro, Macro1 correspond au nom
de cette macro :
Sub Macro1()
End Sub
Nous allons maintenant modifier le nom de cette macro et lui attribuer un nom qui
soit un peu plus parlant. Pour cela, remplacez
simplement Macro1 par manipulationsDesColonnes (le nom ne doit pas contenir
d'espaces) :
Sub manipulationsDesColonnes()
Le texte en vert (texte précédé d'une apostrophe) est un commentaire, il n'est pas
pris en compte à l'exécution du code :
'
' Macro1 Macro
'
'
Les commentaires sont très utiles pour s'y retrouver lorsque l'on dispose de
beaucoup de code ou pour ne pas exécuter certaines lignes de code sans pour
autant les supprimer.
Sub manipulationsDesColonnes()
Columns("A:A").Select
Selection.ClearContents
Columns("C:C").Select
Selection.ClearContents
Columns("B:B").Select
Selection.Cut Destination:=Columns("A:A")
Columns("D:D").Select
Selection.Cut Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Nous souhaitons maintenant que cette macro s'exécute en cliquant sur un bouton.
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
Excel active alors la feuille 2 avant de sélectionner la cellule A8.
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
SÉLECTION D'UNE PLAGE DE CELLULES NOMMÉE
Sub exemple()
End Sub
End Sub
Cette autre manière de sélectionner permet des sélections plus dynamiques et sera
bien utile par la suite.
'Traduction :
'Cells([nombre_aléatoire_entre_1_et_10], 1).Select
End Sub
Ici, le numéro de ligne est Int(Rnd * 10) + 1, autrement dit un nombre entre 1 et
10 (inutile de retenir ce code pour le moment).
SÉLECTION DE LIGNES
Il est possible de sélectionner des lignes entières avec Range ou Rows (Rows étant
spécifique aux lignes) :
Sub exemple()
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
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
'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.
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
MISE EN FORME : TEXTE EN GRAS
Sub proprietes()
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
MISE EN FORME : TEXTE EN ITALIQUE
Sub proprietes()
End Sub
MISE EN FORME : POLICE
Sub proprietes()
End Sub
AJOUTER DES BORDURES
Sub proprietes()
End Sub
MODIFIER LA MISE EN FORME DE LA SÉLECTION ACTUELLE
Sub proprietes()
End Sub
MODIFIER LES PROPRIÉTÉS D'UNE FEUILLE
Sub proprietes()
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
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
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
COLORINDEX
Sub couleurs()
End Sub
Pour les versions d'Excel inférieures à 2007 : l'utilisation de ColorIndex est préférable
à Color.
COLOR
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).
CRÉER UNE BORDURE COLORÉE
Nous allons créer une macro qui va ajouter une bordure à la cellule active
avec ActiveCell.
Sub couleurs()
'Epaisseur de la bordure
ActiveCell.Borders.Weight = 4
End Sub
Aperçu :
End Sub
Aperçu :
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.).
Une valeur est ensuite donnée à cette variable :
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 = "25/07/2023"
'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
Sub variables()
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Nous allons maintenant chercher à afficher dans la boite de dialogue la ligne du tableau
correspondant au numéro indiqué dans la cellule F5.
Voici l'objectif :
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)
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).
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).
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
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
En utilisant une constante, le jour où le taux de TVA changera, il vous suffira de
modifier une seule fois la valeur de la constante dans le code (au lieu de rechercher
et remplacer toutes les valeurs 0.1234 dans le code).
Par convention, une constante se nomme en majuscules en séparant les mots par un _ (par
exemple : EXEMPLE_DE_NOM).
Si la variable est déclarée au début d'une procédure (Sub), elle ne peut être utilisée
que dans cette même procédure. La valeur de la variable n'est pas conservée après
l'exécution de la procédure.
Sub procedure1()
End Sub
Sub procedure2()
End Sub
Pour pouvoir utiliser une variable dans toutes les procédures d'un module, il suffit de
la déclarer en début de module. De plus, cela permet de conserver la valeur de la
variable jusqu'à la fermeture du classeur.
Sub procedure1()
End Sub
Sub procedure2()
End Sub
Même principe pour utiliser une variable dans tous les modules, à la différence près
que Dim est remplacé par Public :
Sub procedure1()
Static var1 As Integer
End Sub
End Sub
CRÉER SON PROPRE TYPE DE VARIABLE
Nous n'allons pas nous attarder sur ce point, voici juste un exemple :
Sub exemple()
'Déclaration
Dim user1 As Utilisateur
'Exemple d'utilisation
MsgBox user1.Nom & " " & user1.Prenom
End Sub
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.
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
= Est égal à
[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
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.
Sub exemple()
numeroLigne = Range("F5") + 1
nbLignes = WorksheetFunction.CountA(Range("A:A")) 'Fonction NBVAL
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
Sub commentaires()
'Variables
Dim note As Single, commentaire As String
note = Range("A1")
'Commentaire en B1
Range("B1") = commentaire
End Sub
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
La fonction IsDate renvoie True si la valeur est une date 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
CONDITION EN FONCTION DE LA COMPARAISON DE 2 CHAÎNES DE
CARACTÈRES
Dans ce cas, les 2 chaînes de caractères sont identiques, l'expression est donc vraie.
Maintenant, pour vérifier si la variable contient la valeur 12345 sans tenir compte des
autres caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la
valeur à rechercher.
Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit
être ajouté après [ :
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
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
End Sub
Sub exemple()
tableau(0) = "A"
tableau(1) = "B"
tableau(2) = "C"
End Sub
QUITTER UNE BOUCLE PRÉMATURÉMENT
Il est possible de quitter une boucle For prématurément grâce à l'instruction suivante
:
Dans cet exemple, l'objectif est de retourner le numéro de la première ligne contenant
la valeur 1. Lorsque cet objectif est atteint, le numéro est affiché et la boucle est
interrompue (car il est dans ce cas inutile de parcourir les autres lignes) :
Sub exemple()
Dim i As Integer
Next
End Sub
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 :
Sub exerciceBoucles()
'...
End Sub
Pour commencer, ajoutez une boucle For qui va numéroter de 1 à 10 les cellules de la
ligne 1, aperçu :
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.
Pour le moment, toutes les procédures créées sont de type Public, elles sont
accessibles depuis tous les modules.
Sub exemple()
'Est identique à :
Public Sub exemple()
Pour exécuter une procédure depuis une autre procédure, entrez simplement son
nom.
Un exemple simple :
End Sub
Sub exemple()
End 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()
En cas d'arguments multiples, ceux-ci doivent être séparés par des virgules.
Par défaut, si une procédure requiert des arguments, ceux-ci sont obligatoires pour
exécuter la procédure.
Des arguments optionnels peuvent toutefois être ajoutés après les arguments
obligatoires avec Optional, par exemple :
Cette procédure peut alors être lancée avec ou sans arguments optionnels, comme
ceci :
Sub exemple()
nom = Range("A1")
prenom = Range("B1")
age = Range("C1")
End Sub
End If
End Sub
Aperçu (avec nom prénom et âge) :
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.
Pour le moment, nous n'avons utilisé la boîte de dialogue MsgBox que pour afficher
une information :
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" :
vbOKOnly 0
vbOKCancel 1
vbAbortRetryIgnor
2
e
vbYesNoCancel 3
vbYesNo 4
vbRetryCancel 5
vbCritical 16
vbQuestion 32
vbExclamation 48
vbInformation 64
vbDefaultButto
0 Bouton par défaut : Bouton 1
n1
vbDefaultButto 25
Bouton par défaut : Bouton 2
n2 6
vbDefaultButto 51
Bouton par défaut : Bouton 3
n3 2
vbApplicationM
0 Force l'utilisateur à répondre avant de poursuivre avec Excel
odal
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
SAUT DE LIGNE DANS UNE MSGBOX
Pour aller à la ligne, vous pouvez insérer le caractère correspondant au saut de ligne
à l'aide de la fonction Chr, exemple :
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)
End Sub
Par exemple, en ajoutant l'instruction suivante, une boîte de dialogue sera affichée à
l'ouverture du classeur :
End Sub
WORKBOOK_BEFORECLOSE (AVANT FERMETURE)
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)
End Sub
End Sub
WORKBOOK_BEFOREPRINT (AVANT IMPRESSION)
End Sub
End Sub
End Sub
WORKBOOK_SHEETBEFOREDOUBLECLICK (AVANT DOUBLE-CLIC)
End Sub
End Sub
Cet événement se déclenche juste avant un clic droit sur une cellule :
End Sub
WORKBOOK_SHEETCHANGE (À CHAQUE MODIFICATION DE CELLULE)
End Sub
WORKBOOK_SHEETSELECTIONCHANGE (À CHAQUE CHANGEMENT DE
SÉLECTION)
End Sub
End Sub
WORKBOOK_NEWSHEET (À L'INSERTION D'UNE FEUILLE)
End Sub
Pour exécuter des instructions en fonction d'un événement pour une feuille en
particulier, sélectionnez la feuille dans l'éditeur, puis Worksheet :
L'événement SelectionChange est ajouté par défaut, il agit lors d'un changement de
sélection :
End Sub
Par exemple, voici un code qui colore la ou les cellules sélectionnées et qui supprime
automatiquement la coloration de la dernière sélection lors d'un changement de
sélection :
End Sub
WORKSHEET_ACTIVATE (À L'ACTIVATION DE LA FEUILLE)
End Sub
Range("D5").Select
End Sub
WORKSHEET_DEACTIVATE (À LA SORTIE DE LA FEUILLE)
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 :
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
End Sub
Le clic droit peut être annulé en attribuant la valeur True à la variable Cancel (dans ce
cas, le menu contextuel ne sera pas affiché).
End Sub
DÉSACTIVER TEMPORAIREMENT TOUS LES ÉVÉNEMENTS
Pour exécuter du code sans déclencher d'événements, placez-le entre ces deux
lignes :
'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
DIMENSIONS DE L'USERFORM
End Sub
Pour prendre un exemple, nous allons créer deux événements. Le premier pour
définir les dimensions initiales de l'UserForm et le second pour augmenter ses
dimensions de 50 par clic.
UserForm_Exemple.Height = 250
UserForm_Exemple.Width = 250
End Sub
Me.Height = 250
Me.Width = 250
End Sub
Le second événement est déclenché au clic sur l'UserForm :
Me.Height = 250
Me.Width = 250
End Sub
Me.Height = Me.Height + 50
Me.Width = Me.Width + 50
End Sub
LANCER UN USERFORM
Sub lancerUserform()
UserForm_Exemple.Show
End Sub
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 :
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
Voici un exemple d'utilisation de cases à cocher dont l'objectif est de modifier les
valeurs en colonne B en fonction des cases cochées dans l'UserForm :
L'événement Click du bouton enregistre ici les choix de l'utilisateur et ferme ensuite
l'UserForm :
'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
Pour simplifier encore davantage l'écriture, la propriété Value est la propriété par
défaut de la plupart des contrôles, il n'est donc pas nécessaire de l'ajouter (comme
nous l'avions vu précédemment avec la propriété Value des cellules) :
'Numéro 1
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.
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 :
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
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
'Boucle pour ajouter les 4 pays à la liste déroulante
For i = 1 To 4
ComboBox_pays.AddItem Cells(1, i)
Next
End Sub
Pour faire cela, nous avons besoin de connaître le numéro de colonne ainsi que le
nombre de villes de cette colonne.
colonne = ComboBox_Pays.ListIndex + 1
'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
Les contrôles peuvent être utilisés également sur une feuille Excel. Pour cet exemple,
nous ajouterons donc le contrôle directement sur la feuille.
Notez que pour manipuler un contrôle ActiveX sur une feuille, le Mode Création doit
être activé :
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
Il est temps de mettre en pratique l'utilisation des contrôles avec un petit exercice.
Le fichier : controles_exercice.xlsm
Prenez un moment pour réaliser cet exercice avant de passer à la solution ...
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
LE BOUTON "FERMER"
Unload Me
End Sub
LE CONTENU DE LA LISTE DÉROULANTE
Dim i As Integer
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
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
'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
Nous avons effleuré le sujet à la leçon sur les variables, nous allons maintenant
l'approfondir.
Imaginez que dans une procédure vous ayez besoin de stocker 500 valeurs. S'il fallait
créer 500 variables pour stocker toutes ces valeurs, cela deviendrait vite très
compliqué, tandis qu'avec un tableau, le stockage et l'utilisation de ces valeurs seront
grandement simplifiés.
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 :
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 :
Voici quelques exemples de déclarations (si les 2 premières déclarations ne sont pas
claires pour vous, relisez ceci) :
Si vous ne pouvez pas entrer de valeurs fixes (parce que cela dépend de la taille de la
base de données par exemple), laissez les parenthèses vides.
Vous n'avez pas besoin de déclarer un type (String, Integer, etc.) car dans bien des
cas cela ralentirait votre procédure.
Nous voulons enregistrer ici 11 x 1 valeurs, il faudra donc déclarer un tableau à une
dimension :
Dim tableau(10)
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.
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
En voici un exemple :
'Déclarations
Dim tableau(10, 2) 'Tableau de 11 x 3 "cases"
Dim i As Integer
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.
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
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
ENREGISTRER UNE PLAGE DE CELLULES
Il est possible d'enregistrer une plage de cellules dans un tableau sans passer par
une boucle.
'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 ...
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 :
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
Pour cet exercice la base de données a été réduite à 1000 lignes.
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
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 :
La boucle For parcourt chaque ligne de la base de données et enregistre les informations dans
le tableau si la colonne C contient la valeur recherchée :
Pour éviter de recalculer de nombreuses fois l'année de chaque date du tableau dans les
prochaines boucles, seule l'année de la date est enregistrée dans le tableau.
Après chaque entrée dans le tableau, la variable numero est incrémentée de 1 pour la
prochaine entrée.
DÉCOMPTES
La boucle For parcourt ici chaque ligne de données du tableau (de 0 à numero - 1 qui
correspond au numéro de la dernière entrée) et recherche les correspondances pour l'année
définie et le numéro de client défini :
Le résultat est ensuite inséré dans la cellule correspondant à l'année définie et au numéro de
client défini :
Il ne reste ensuite plus qu'à répéter ces opérations pour chaque année et chaque numéro de
client en les ajoutant entre 2 boucles For :
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
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.
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 :
NB.SI COUNTIF Compte le nombre de cellules qui répondent à un critère donné dan
NB.SI.ENS COUNTIFS Compte le nombre de cellules à l’intérieur d’une plage qui réponden
NBVAL COUNTA Détermine le nombre de valeurs comprises dans la liste des argume
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
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.
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
Il ne reste plus qu'à tester la couleur avec un If :
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.
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.