Cours Vba Bio
Cours Vba Bio
SPECIALITE: GESTION
NIVEAU: V
INTRODUCTION
Le VBA (Visual Basic for Applications) est un langage proche du Visual Basic qui nécessite
une application hôte pour s'exécuter (Excel dans notre cas). Grâce au VBA nous allons
pouvoir réaliser à peu près tout ce que l'on souhaite avec Excel ...
Mais avant de démarrer, commençons par afficher les outils qui nous seront utiles.
1
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) :
PREMIER MACRO
TP : Pour prendre un exemple simple, nous allons automatiser les opérations suivantes :
2
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.
3
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
[Link]
Columns("C:C").Select
[Link]
Columns("B:B").Select
[Link] Destination:=Columns("A:A")
Columns("D:D").Select
[Link] Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
4
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
[Link]
Columns("C:C").Select
[Link]
Columns("B:B").Select
[Link] Destination:=Columns("A:A")
Columns("D:D").Select
[Link] Destination:=Columns("C:C")
Columns("C:C").Select
End Sub
Nous souhaitons maintenant que cette macro s'exécute en cliquant sur un bouton.
5
Insérez un bouton en cliquant sur Insérer Bouton (Contrôles de formulaires) :
6
LES SELECTIONS
Nous allons créer une macro qui sélectionnera une cellule de notre choix. Ouvrez l'éditeur et
ajoutez-y un module :
Sub exemple()
7
End Sub
Créez maintenant un bouton de formulaire auquel vous allez associer cette macro (vide pour
le moment) :
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
8
Range("A8").Select
End Sub
Sub exemple()
End Sub
Sub exemple()
End Sub
Sub exemple()
End Sub
9
SÉLECTION D'UNE CELLULE EN FONCTION D'UN NUMÉRO DE LIGNE ET
DE COLONNE
Sub exemple()
End Sub
Cette autre manière de sélectionner permet des sélections plus dynamiques et sera bien utile
par la suite.
Sub exemple()
'Traduction :
'Cells([nombre_aléatoire_entre_1_et_10], 1).Select
End Sub
SÉLECTION DE LIGNES
10
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
LES PROPRIETES
Nous allons maintenant agir sur le contenu et l'apparence des cellules et des feuilles.
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) :
11
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") :
L'éditeur affiche alors les différentes possibilités ... 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
12
'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
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
13
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
Après avoir sélectionné la propriété Font et ajouté un ., la liste des propriétés que l'on peut
attribuer à la mise en forme du texte apparaît :
Sub proprietes()
End Sub
Sub proprietes()
14
'Mettre en gras les cellules A1 à A8
Range("A1:A8").[Link] = True
End Sub
Pour retirer la mise en forme Bold à un texte, il faut donc remplacer Oui par Non, autrement
dit, True par False :
Sub proprietes()
End Sub
Sub proprietes()
End Sub
Sub proprietes()
End Sub
15
MISE EN FORME : POLICE
Sub proprietes()
End Sub
Sub proprietes()
End Sub
Sub proprietes()
16
'Ajouter une bordure aux cellules sélectionnées
[Link] = 1
End Sub
Sub proprietes()
End Sub
L'objectif ici est que A7 prenne la valeur de A1, ce qui nous donne :
Sub proprietes()
'A7 = A1
Range("A7") = Range("A1")
'Ou :
17
'Range("A7").Value = Range("A1").Value
End Sub
Sub proprietes()
Range("A7").[Link] = Range("A1").[Link]
End Sub
Nous allons maintenant créer ici un compteur de clics. A chaque clic, la valeur de A1 sera
augmentée de 1 :
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").[Link] = 3
Sheets("Feuil2").Range("A8").[Link] = True
Sheets("Feuil2").Range("A8").[Link] = 18
Sheets("Feuil2").Range("A8").[Link] = True
Sheets("Feuil2").Range("A8").[Link] = "Arial"
End Sub
Sub proprietes()
End Sub
Sheets("Feuil2").Range("A8") n'est donc plus répété. 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()
19
With Sheets("Feuil2").Range("A8")
.[Link] = 3
With .Font
.Bold = True
.Size = 18
.Italic = True
.Name = "Arial"
End With
End With
End Sub
LES COULEURS
Nous allons commencer par attribuer une couleur au texte en A1. Après avoir ajouté Font.,
nous obtenons :
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
Sub couleurs()
End Sub
20
Ce qui nous donne :
COLOR
Sub couleurs()
End Sub
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
21
CRÉER UNE BORDURE COLORÉE
Nous allons créer une macro qui va ajouter une bordure à la cellule active avec ActiveCell. La
bordure sera rouge et épaisse :
Sub couleurs()
'Epaisseur de la bordure
[Link] = 4
End Sub
Aperçu :
Sub couleurs()
End Sub
Aperçu :
22
COLORER L'ONGLET D'UNE FEUILLE
Sub couleurs()
End Sub
Aperçu :
LES VARIABLES
'Déclaration de la variable
Dim maVariable As Integer
23
maVariable = 12
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
24
Quelques exemples avec différents types :
'Exemple : texte
Dim varTexte As String
varTexte = "[Link]"
'Exemple : date
Dim varDate As Date
varDate = "09/01/2023"
'Exemple : vrai/faux
Dim varBoolean As Boolean
25
varBoolean = True
EXEMPLE PRATIQUE : 1
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
26
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
TAF : 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 :
27
LES CONSTANTES
Les constantes permettent de stocker des valeurs comme les variables, à la différence près
qu'on ne peut pas les modifier (d'où leur nom) après les avoir déclarées.
Par exemple, ces quelques lignes calculent le montant de la TVA en fonction d'un taux de
TVA de 12.34% :
Sub exemple()
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()
28
Cells(1, 1) = Cells(1, 2) * TAUX_TVA
Cells(2, 1) = Cells(2, 2) * TAUX_TVA
Cells(3, 1) = Cells(3, 2) * TAUX_TVA
Cells(4, 1) = Cells(4, 2) * TAUX_TVA
Cells(5, 1) = Cells(5, 2) * TAUX_TVA
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).
Remarque : 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()
29
'=> Utilisation de var1 possible
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 :
Pour conserver la valeur d'une variable à la fin d'une procédure, remplacez Dim par Static :
Sub procedure1()
End Sub
Pour conserver les valeurs de toutes les variables d'une procédure, ajoutez Static devant Sub :
End Sub
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).
30
'Exemple de déclaration de tableau à 1 dimension
Dim tab1(4) As String
LE TABLEAU À 1 DIMENSION
'Exemple de déclaration de tableau à 1 dimension
Dim tab1(4) As String
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
Et voici comment attribuer des valeurs aux cases d'un tableau à 2 dimensions :
Nous n'allons pas nous attarder sur ce point, voici juste un exemple :
31
Nom As String
Prenom As String
End Type
Sub exemple()
'Déclaration
Dim user1 As Utilisateur
'Exemple d'utilisation
MsgBox [Link] & " " & [Link]
End Sub
MSGBOX
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
Sub effacerB2()
End Sub
33
Par exemple, pour une boîte de dialogue avec "Oui, Non, Annuler" + icône exclamation +
bouton 2 par défaut :
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
34
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
Il est également possible d'indiquer une valeur par défaut en troisième argument :
LES CONDITIONS
Les conditions sont très utiles en programmation, elles nous serviront à effectuer des actions
en fonction de critères précis (même principe que la fonction SI).
35
Else '=> SINON (facultatif)
'Instructions si faux
End If
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"
36
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()
37
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End Sub
LES OPERATEURS
38
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
ELSEIF
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()
40
'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")
41
'Commentaire en fonction de la note
Select Case note '<= la valeur à tester (ici, la note)
Case Is = 6
commentaire = "Excellent résultat !"
Case Is >= 5
commentaire = "Bon résultat"
Case Is >= 4
commentaire = "Résultat satisfaisant"
Case Is >= 3
commentaire = "Résultat insatisfaisant"
Case Is >= 2
commentaire = "Mauvais résultat"
Case Is >= 1
commentaire = "Résultat exécrable"
Case Else
commentaire = "Aucun résultat"
End Select
'Commentaire en B1
Range("B1") = commentaire
End Sub
FONCTION ISNUMERIC
La fonction IsNumeric (vue à la page précédente) renvoie True (vrai) si la valeur est
numérique et False (faux) si ce n'est pas le cas :
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 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 :
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
43
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.
LES BOUCLES
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.
44
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
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()
45
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
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és 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
46
FOR NEXT
Sub exemple()
Dim i As Integer
For i = 1 To 5
'Instructions
Next
End Sub
La boucle For Each permet de parcourir chaque élément d'un ensemble d'éléments, par
exemple parcourir chaque cellule d'une plage de cellules :
Sub exemple()
End Sub
Sub exemple()
End Sub
47
Parcourir chaque élément d'un tableau :
Sub exemple()
tableau(0) = "A"
tableau(1) = "B"
tableau(2) = "C"
End Sub
Il est possible de quitter une boucle For prématurément grâce à l'instruction suivante :
Dans cet exemple, l'objectif est de retourner le numéro de la première ligne contenant la
valeur 1. Lorsque cet objectif est atteint, le numéro est affiché et la boucle est interrompue
(car il est dans ce cas inutile de parcourir les autres lignes) :
Sub exemple()
Dim i As Integer
48
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 à :
Pour exécuter une procédure depuis une autre procédure, entrez simplement son nom.
Un exemple simple :
End Sub
Sub exemple()
End Sub
49
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
50
L'argument ajouté à la procédure avertissement est de type String :
Pour exécuter la procédure avertissement, il faudra donc entrer en argument une valeur de
type String :
En cas d'arguments multiples, ceux-ci doivent être séparés par des virgules.
Par défaut, si une procédure requiert des arguments, ceux-ci sont obligatoires pour exécuter la
procédure.
Des arguments optionnels peuvent toutefois être ajoutés après les arguments obligatoires
avec Optional, par exemple :
Cette procédure peut alors être lancée avec ou sans arguments optionnels, comme ceci :
Sub exemple()
51
Dim nom As String, prenom As String, age As Integer
nom = Range("A1")
prenom = Range("B1")
age = Range("C1")
End Sub
52
MsgBox nom & " " & prenom & ", " & age & " ans"
End If
End If
End Sub
LES FONCTIONS
La principale différence entre Sub et Function est qu'une fonction retourne une valeur.
End Function
Sub exemple()
resultat = carre(9.876) 'La variable resultat reçoit la valeur retournée par la fonction
End Sub
Vous pouvez remarquer que les arguments d'une fonction sont ajoutés entre () contrairement
aux procédures où elles sont superflues.
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.
53
INTERET 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).
Exemple : La feuille contient ici une base de données de 5000 lignes sur 3 colonnes :
54
Nous voulons enregistrer ici 11 x 1 valeurs, il faudra donc déclarer un tableau à une
dimension :
Dim tableau(10)
Le tableau tableau(10) peut contenir 11 valeurs, car rappelez-vous que la numérotation d'un
tableau commence à 0.
Sub exemple()
Dim tableau(10)
55
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
Pour enregistrer plusieurs colonnes de données, une dimension supplémentaire est nécessaire.
En voici un exemple :
56
• Enregistrement des données dans un tableau à 2 dimensions :
'Déclarations
For i = 0 To 10
NextTABLEAUX DYNAMIQUES
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)
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
57
'Dernière ligne de la base de données
derniereLigne = Cells([Link], 1).End(xlUp).Row
'Redimensionnement
ReDim tableau(derniereLigne - 2, 2)
End Sub
UBOUND
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.
58
'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 ...
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"
59
Une solution bien plus pratique consiste à utiliser la fonction Array qui retourne un tableau de
valeurs :
La fonction Split permet de diviser une chaîne de caractères en un tableau en fonction d'un
délimiteur défini.
Pour convertir cette chaîne de caractères en tableau, utilisez la fonction Split et définissez le
séparateur :
Cette fonction permet d'assembler les valeurs d'un tableau en une chaîne de caractères :
60
LES FORMULAIRES : USERFORM
Pour ajouter un UserForm, procédez de la même manière que pour un nouveau module :
TITRE DE L'USERFORM
61
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 CONTROLES
Les contrôles sont les éléments (boutons, intitulés, zone de texte, cases à cocher, etc.) qui
peuvent être insérés sur un UserForm (ou sur une feuille Excel). Les contrôles ont également
toute une panoplie de propriétés et d'événements qui diffèrent d'un contrôle à l'autre.
Pour commencer, ajoutez un UserForm et insérez les 3 contrôles suivants : un intitulé Label,
une zone de texte TextBox et un bouton CommandButton :
62
Modifiez les propriétés de l'UserForm et des contrôles (dont les propriétés (Name) pour le
nom, Caption pour le texte et Font pour la taille du texte) pour obtenir ceci :
Pour 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
63
End Sub
Nous allons maintenant ajouter un événement qui s'active au changement de valeur de la zone
de texte et qui va modifier la couleur de fond si la valeur n'est pas numérique :
End Sub
L'événement est déclenché à chaque entrée ou suppression de caractère dans la zone de texte.
Aperçu :
Il nous reste encore à empêcher la validation du formulaire si la valeur n'est pas numérique en
ajoutant une instruction If :
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 [Link] = True Then 'Si coché
Range("B2") = "Oui"
Else 'Si décoché
Range("B2") = "Non"
End If
'Numéro 2
If [Link] = True Then 'Si coché
Range("B3") = "Oui"
Else 'Si décoché
Range("B3") = "Non"
End If
65
'Numéro 3
If [Link] = True 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 ... Dans ce cas,
l'utilisation d'une boucle est plus que bienvenue :
Dim i As Integer
'Fermeture
Unload Me
End Sub
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 :
66
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 :
67
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
68
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
69
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
'Si le numéro de colonne = 0 (donc si aucun pays sélectionné) la procédure est quittée
If colonne = 0 Then Exit Sub
End Sub
70
Il ne reste ensuite plus qu'à ajouter un événement au clic sur le bouton Valider pour traiter
cette information. Dans ce cas, un simple affichage de la sélection dans une boîte de dialogue
:
End Sub
LES EVENEMENTS
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 :
71
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
WORKBOOK_BEFORECLOSE (AVANT FERMETURE)
Pour exécuter des instructions juste avant la fermeture du classeur, choisissez BeforeClose
72
End Sub
La fermeture du classeur peut être annulée en attribuant la valeur True à la variable Cancel.
'Si l'utilisateur répond Non, la variable Cancel vaudra True (ce qui annulera la fermeture)
If MsgBox("Etes-vous certain de vouloir fermer ce classeur ?", 36, "Confirmation") = vbNo
Then
Cancel = True
End If
End Sub
End Sub
End Sub
WORKBOOK_BEFOREPRINT (AVANT IMPRESSION)
End Sub
73
L'impression peut être annulée en attribuant la valeur True à la variable Cancel.
A la page précédente les événements concernaient le classeur entier. Sur celle-ci, nous allons
nous focaliser sur les événements liés à une feuille.
Pour exécuter des instructions en fonction d'un événement pour une feuille en particulier,
sélectionnez la feuille dans l'éditeur, puis Worksheet :
L'événement SelectionChange est ajouté par défaut, il agit lors d'un changement de sélection
:
End Sub
Par exemple, voici un code qui colore la ou les cellules sélectionnées et qui supprime
automatiquement la coloration de la dernière sélection lors d'un changement de sélection :
74
End If
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
75
End Sub
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 :
76
Cancel = True 'Annulation du clic droit
End If
End Sub
Le clic droit peut être annulé en attribuant la valeur True à la variable Cancel (dans ce cas, le
menu contextuel ne sera pas affiché).
End Sub
Pour exécuter du code sans déclencher d'événements, placez-le entre ces deux lignes :
'Instructions ...
Vous trouverez sur cette page les fonctions VBA les plus utilisées, expliquées à l'aide d'un exemple
simple.
BOÎTES DE DIALOGUE
77
MsgBox Affiche une boîte de dialogue invitant l'utilisateur à cliquer sur un bouton.
DATES ET HEURES
DateSerial Renvoie une date en fonction d'une année, d'un mois et d'un jour.
Format Renvoie une chaîne de caractères en fonction d'une date ou d'un nombre dans le format spécifié.
Hour Renvoie un nombre entier correspondant à l'heure d'une date ou d'une heure.
Renvoie True si la valeur est une date (ou peut être convertie en date) ou False si ce n'est pas le
IsDate
cas.
Minute Renvoie un nombre entier correspondant aux minutes d'une date ou d'une heure.
Second Renvoie un nombre entier correspondant aux secondes d'une date ou d'une heure.
78
Weekday Renvoie le numéro du jour de la semaine en fonction d'une date.
NOMBRES ET MATH
CInt / CLng Convertit une valeur numérique en nombre entier en arrondissant à l'entier le plus proche.
TABLEAUX
Join Regroupe les valeurs d'un tableau en une chaîne de caractères, en définissant ou non un délimiteur.
Split Divise une chaîne de caractères en fonction d'un délimiteur pour obtenir un tableau de valeurs.
UBound Renvoie le plus grand indice disponible pour la dimension spécifiée d'un tableau.
TESTS ET CONDITIONS
IIf Renvoie l'une des 2 valeurs passées en argument en fonction d'une condition.
IsArray Renvoie True si la variable pointe vers un tableau ou False si ce n'est pas le cas.
79
IsDate Renvoie True si la valeur est une date (ou peut être convertie en date) ou False si ce n'est pas le cas.
IsEmpty Renvoie False si la variable a été initialisée ou True si ce n'est pas le cas.
IsMissing Renvoie False si l'argument optionnel a été renseigné ou True si ce n'est pas le cas.
IsNumeric Renvoie True si la valeur peut être considérée comme un nombre ou False si ce n'est pas le cas.
TEXTE
Format Renvoie une chaîne de caractères en fonction d'une date ou d'un nombre dans le format spécifié.
InStr Renvoie un nombre entier correspondant à la position d'une valeur dans une chaîne de caractères.
Renvoie un nombre entier correspondant à la position d'une valeur dans une chaîne de caractères en
InStrRev
commençant par la droite.
Left Renvoie le nombre de caractères spécifié d'une chaîne de caractères depuis la gauche.
Renvoie le nombre de caractères spécifié d'une chaîne de caractères en commençant par le numéro
Mid
de caractère défini.
Renvoie une chaîne de caractères après avoir remplacé la ou les sous-chaînes correspondant à la
Replace
valeur recherchée.
Right Renvoie le nombre de caractères spécifié d'une chaîne de caractères depuis la droite.
StrReverse Renvoie une chaîne de caractères après avoir inversé l'ordre des caractères.
Renvoie une chaîne de caractères après avoir supprimé les espaces à gauche et à droite de la chaîne
Trim
de caractères.
80