0% ont trouvé ce document utile (0 vote)
6 vues143 pages

Cours VBA

Ce document est un manuel sur l'utilisation avancée d'Excel avec VBA, écrit par Dr Cedric YAO. Il couvre divers aspects du langage VBA, y compris la création de macros, la gestion des feuilles et des cellules, les variables, les conditions, les boucles, et les événements. Le document contient également des exercices pratiques pour renforcer l'apprentissage des concepts abordés.

Transféré par

dometanhan1
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
6 vues143 pages

Cours VBA

Ce document est un manuel sur l'utilisation avancée d'Excel avec VBA, écrit par Dr Cedric YAO. Il couvre divers aspects du langage VBA, y compris la création de macros, la gestion des feuilles et des cellules, les variables, les conditions, les boucles, et les événements. Le document contient également des exercices pratiques pour renforcer l'apprentissage des concepts abordés.

Transféré par

dometanhan1
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

EXCEL AVANCE

VBA

Dr Cedric YAO

Ph.D. in Computer Science

Enseignant chercheur au
Département informatique de
l’IUA
Page 1 of 143
Table des matières
Chapitre 0 : Introduction ............................................................................................................ 7

Démarrage .............................................................................................................................. 7

Première macro ...................................................................................................................... 8

Chapitre 1 : Feuilles et cellules ................................................................................................ 13

Les Sélections ....................................................................................................................... 13

Sélection d'une plage de cellules ...................................................................................... 15

Sélection de cellules distinctes ......................................................................................... 15

Sélection d'une plage de cellules nommée ....................................................................... 15

Sélection d'une cellule en fonction d'un numéro de ligne et de colonne .......................... 16

Sélection de lignes ............................................................................................................ 16

Sélection de colonnes ....................................................................................................... 17

Les propriétés ....................................................................................................................... 17

Mise en forme du texte ..................................................................................................... 20

Mise en forme : taille du texte .......................................................................................... 20

Mise en forme : texte en gras ........................................................................................... 20

Mise en forme : texte en italique ...................................................................................... 21

Mise en forme : texte souligné ......................................................................................... 22

Mise en forme : police ...................................................................................................... 22

Ajouter des bordures ........................................................................................................ 23

Modifier la mise en forme de la sélection actuelle ........................................................... 23

Modifier les propriétés d'une feuille................................................................................. 23

Modifier la valeur d'une cellule en fonction d'une autre .................................................. 24

Modifier la valeur d'une cellule en fonction de sa propre valeur ..................................... 24

With .................................................................................................................................. 25

les couleurs ........................................................................................................................... 26

Colorindex ........................................................................................................................ 26

Page 2 of 143
Color ................................................................................................................................. 27

Créer une bordure colorée ................................................................................................ 28

Colorer le fond des cellules sélectionnées ........................................................................ 29

Colorer l'onglet d'une feuille ............................................................................................ 29

Chapitre 2 : les variables .......................................................................................................... 30

Les types de variables .......................................................................................................... 32

Exemple pratique.............................................................................................................. 34

Tableaux ............................................................................................................................... 37

Le tableau à 1 dimension .................................................................................................. 38

Le tableau à 2 dimensions ................................................................................................ 39

Les constantes ...................................................................................................................... 39

La portée des variables ......................................................................................................... 41

Créer son propre type de variable ........................................................................................ 42

Chapitre 3 : les conditions ........................................................................................................ 43

Instruction IF ........................................................................................................................ 43

ELSEIF ................................................................................................................................. 48

Fonction isnumeric ............................................................................................................... 53

Fonctions de dates ................................................................................................................ 55

Fonction isempty .................................................................................................................. 56

Condition en fonction de la comparaison de 2 chaînes de caractères .................................. 57

Le caractère * ................................................................................................................... 57

Le caractère # ................................................................................................................... 57

Le caractère ? ................................................................................................................... 57

Chapitre 4: Les Boucles ........................................................................................................... 58

boucle Do ............................................................................................................................. 59

Do loop ................................................................................................................................. 59

For next ................................................................................................................................ 60

Page 3 of 143
For each next ........................................................................................................................ 61

Quitter une boucle prématurément ....................................................................................... 62

Cas Pratique.......................................................................................................................... 63

Chapitre 5 : Les procédures et fonctions .................................................................................. 68

Public - Private ..................................................................................................................... 68

Lancer une procédure depuis une procédure ........................................................................ 69

Les arguments ...................................................................................................................... 69

Les arguments optionnels ..................................................................................................... 70

Les fonctions ........................................................................................................................ 76

Chapitre 6 : Les boîtes de dialogue .......................................................................................... 77

MsgBox ................................................................................................................................ 77

Les différentes possibilités pour le second argument de msgbox ........................................ 79

Les valeurs renvoyées par msgbox....................................................................................... 80

Saut de ligne dans une msgbox ............................................................................................ 81

Inputbox ............................................................................................................................... 81

Chapitre 7 : les événements ...................................................................................................... 83

Les événements Workbook .................................................................................................. 83

Workbook_open (à l'ouverture) ....................................................................................... 83

WORKBOOK_BEFORECLOSE (AVANT FERMETURE) .......................................... 83

WORKBOOK_BEFORESAVE (AVANT ENREGISTREMENT) ................................ 84

WORKBOOK_AFTERSAVE (APRÈS ENREGISTREMENT) .................................... 85

WORKBOOK_BEFOREPRINT (AVANT IMPRESSION) ........................................... 85

WORKBOOK_SHEETACTIVATE (À L'ACTIVATION D'UNE FEUILLE)............... 86

WORKBOOK_SHEETBEFOREDOUBLECLICK (AVANT DOUBLE-CLIC) ........... 86

WORKBOOK_SHEETBEFORERIGHTCLICK (AVANT CLIC DROIT) ................... 87

WORKBOOK_SHEETCHANGE (À CHAQUE MODIFICATION DE CELLULE) .... 87

Page 4 of 143
WORKBOOK_SHEETSELECTIONCHANGE (À CHAQUE CHANGEMENT DE
SÉLECTION) ................................................................................................................... 87

WORKBOOK_NEWSHEET (À L'INSERTION D'UNE FEUILLE) ............................. 88

Les événements Worksheet .................................................................................................. 88

WORKSHEET_SELECTIONCHANGE (AU CHANGEMENT DE SÉLECTION) ..... 88

WORKSHEET_ACTIVATE (À L'ACTIVATION DE LA FEUILLE) .......................... 88

WORKSHEET_DEACTIVATE (À LA SORTIE DE LA FEUILLE) ............................ 89

WORKSHEET_BEFOREDOUBLECLICK (AU DOUBLE-CLIC) ............................... 89

WORKSHEET_BEFORERIGHTCLICK (AU CLIC DROIT) ....................................... 90

WORKSHEET_CHANGE (À CHAQUE MODIFICATION DE CELLULE) ............... 90

DÉSACTIVER TEMPORAIREMENT TOUS LES ÉVÉNEMENTS ............................ 90

Chapitre 8 : Les Formulaire et contrôle.................................................................................... 91

UserForm .............................................................................................................................. 91

TITRE DE L'USERFORM............................................................................................... 92

DIMENSIONS DE L'USERFORM ................................................................................. 92

LES ÉVÉNEMENTS DE L'USERFORM ....................................................................... 93

Les contrôles ........................................................................................................................ 96

Boutons, Label et TextBox............................................................................................... 96

LES CASES À COCHER (CHECKBOX)....................................................................... 98

LES BOUTONS D'OPTION (OPTIONBUTTON) ....................................................... 103

LA LISTE DÉROULANTE (COMBOBOX) ET LA ZONE DE LISTE (LISTBOX) . 107

INSERTION SUR UNE FEUILLE................................................................................ 110

LE BOUTON BASCULE (TOGGLEBUTTON) .......................................................... 110

EXERCICE PRATIQUE .................................................................................................... 113

LE BOUTON "FERMER" ............................................................................................. 113

LE CONTENU DE LA LISTE DÉROULANTE .......................................................... 114

VÉRIFICATION DES CONTRÔLES ........................................................................... 114

Page 5 of 143
INSERTION DES DONNÉES....................................................................................... 116

Chapitre 9 : Tableaux ............................................................................................................. 120

INTÉRÊT DES TABLEAUX ............................................................................................ 121

DÉCLARATION D'UN TABLEAU ............................................................................. 123

ENREGISTRER DES DONNÉES DANS UN TABLEAU .......................................... 124

LE TABLEAU À 2 DIMENSIONS ............................................................................... 126

LE TABLEAU DYNAMIQUE ...................................................................................... 128

UBOUND ....................................................................................................................... 129

ARRAY .......................................................................................................................... 130

SPLIT ............................................................................................................................. 131

JOIN ............................................................................................................................... 132

EXERCICE PRATIQUE .................................................................................................... 132

Chapitre : Fonctions VBA ...................................................................................................... 138

FONCTIONS EXCEL........................................................................................................ 138

Créer une fonction personnalisée ....................................................................................... 140

DÉVELOPPER LA FONCTION PERSONNALISÉE ...................................................... 141

Page 6 of 143
Chapitre 0 : Introduction

Démarrage

Le VBA (Visual Basic for Applications) est un langage proche du Visual Basic qui nécessite
une application hôte pour s'exécuter (Excel dans notre cas). Grâce au VBA nous allons pouvoir
réaliser à peu près tout ce que l'on souhaite avec Excel. Mais avant de démarrer, commençons
par afficher les outils qui nous seront utiles.

Cliquez sur Fichier Options Personnaliser le Ruban puis cochez Développeur :

Un nouvel onglet sera ajouté :

Page 7 of 143
Pour travailler avec du code VBA, nous avons besoin d'un éditeur, celui-ci est déjà installé et
vous pouvez l'ouvrir avec le raccourci Alt + F11 (ou en cliquant sur Visual Basic depuis l'onglet
Développeur) :

Première macro

Il est possible d'automatiser certaines tâches en toute simplicité grâce à l'enregistreur de macros.
Pour prendre un exemple simple, nous allons automatiser les opérations suivantes :

✓ Effacer le contenu des colonnes A et C


✓ Déplacer le contenu de la colonne B dans la colonne A
✓ Déplacer le contenu de la colonne D dans la colonne C

Page 8 of 143
Pour ce faire, cliquez sur Enregistrer une macro puis sur Ok, exécutez les opérations décrites
ci-dessus sans interruption (car toutes les manipulations sont enregistrées) et pour terminer
cliquez sur Arrêter l'enregistrement.

Excel a enregistré vos manipulations et les a traduites en code VBA. Pour voir votre macro,
ouvrez l'éditeur (Alt + F11) et cliquez sur Module1 :

Ce code correspond aux manipulations enregistrées. Nous allons nous arrêter quelques instants
sur le code généré :

Sub Macro1()

'

' Macro1 Macro

Page 9 of 143
'

'

Columns("A:A").Select

[Link]

Columns("C:C").Select

[Link]

Columns("B:B").Select

[Link] Destination:=Columns("A:A")

Columns("D:D").Select

[Link] Destination:=Columns("C:C")

Columns("C:C").Select

End Sub

Sub et End Sub délimitent le début et la fin de la macro, Macro1 correspond au nom de cette
macro :

Sub Macro1()

End Sub

Nous allons maintenant modifier le nom de cette macro et lui attribuer un nom qui soit un peu
plus parlant. Pour cela, remplacez simplement Macro1 par manipulationsDesColonnes (le nom
ne doit pas contenir d'espaces) :

Sub manipulationsDesColonnes()

Le texte en vert (texte précédé d'une apostrophe) est un commentaire, il n'est pas pris en compte
à l'exécution du code :

'

' Macro1 Macro


Page 10 of 143
'

'

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()

'Mon premier commentaire !

Columns("A:A").Select

[Link]

Columns("C:C").Select

[Link]

Columns("B:B").Select

[Link] Destination:=Columns("A:A")

Columns("D:D").Select

[Link] Destination:=Columns("C:C")

Columns("C:C").Select

End Sub

Nous souhaitons maintenant que cette macro s'exécute en cliquant sur un bouton. Insérez un
bouton en cliquant sur Insérer Bouton (Contrôles de formulaires) :

Page 11 of 143
Tracez votre bouton et sélectionnez ensuite simplement votre macro :

Lorsque vous cliquerez sur le bouton, la macro sera exécutée :

Page 12 of 143
Chapitre 1 : Feuilles et cellules

Les Sélections

Nous allons créer une macro qui sélectionnera une cellule de notre choix. Ouvrez l'éditeur et
ajoutez-y un module :

Dans le module, tapez sub exemple et appuyez sur Entrée.

Vous remarquerez qu'Excel a automatiquement ajouté la fin de cette nouvelle procédure :

Sub exemple()

End Sub

Créez maintenant un bouton de formulaire auquel vous allez associer cette macro (vide pour le
moment) :

Page 13 of 143
Complétez votre macro avec ceci :

Sub exemple()

'Sélection de la cellule A8

Range("A8").Select

End Sub

Vous pouvez tester cette macro en cliquant sur votre bouton de formulaire, la cellule A8 est
alors sélectionnée. Nous allons maintenant modifier cette macro pour sélectionner la cellule A8
de la seconde feuille :

Sub exemple()

'Activation de la feuille 2

Sheets("Feuil2").Activate

'Sélection de la cellule A8

Range("A8").Select

End Sub

Excel active alors la feuille 2 avant de sélectionner la cellule A8.

Page 14 of 143
Aidez-vous des commentaires (texte en vert) pour bien comprendre les macros de ce cours.

Sélection d'une plage de cellules

Sub exemple()

'Sélection des cellules A1 à A8

Range("A1:A8").Select

End Sub

Sélection de cellules distinctes

Sub exemple()

'Sélection des cellule A8 et C5

Range("A8, C5").Select

End Sub

Sélection d'une plage de cellules nommée

Sub exemple()

'Sélection des cellules de la plage "ma_plage"

Range("ma_plage").Select

End Sub

Code correspondant à ma plage :

Sub exemple()
Page 15 of 143
'Sélection des cellules de la plage "ma_plage"

Range("B3:B8").Select

End Sub

Sélection d'une cellule en fonction d'un numéro de ligne et de colonne

Sub exemple()

'Sélection de la cellule de la ligne 8 et de la colonne 1

Cells(8, 1).Select

End Sub

Cette autre manière de sélectionner permet des sélections plus dynamiques et sera bien utile par
la suite.

En voici un petit exemple :

Sub exemple()

'Sélection aléatoire d'une cellule de la ligne 1 à 10 et de la colonne 1

Cells(Int(Rnd * 10) + 1, 1).Select

'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) :

Cas avec Range

Sub exemple()

'Sélection des lignes 2 à 6

Page 16 of 143
Range("2:6").Select

End Sub

Cas avec Rows

Sub exemple()

'Sélection des lignes 2 à 6

Rows("2:6").Select

End Sub

Sélection de colonnes

Tout comme pour les lignes, il est possible de sélectionner des colonnes entières avec Range
ou Columns (Columns étant spécifique aux colonnes) :

Cas avec Range

Sub exemple()

'Sélection des colonnes B à G

Range("B:G").Select

End Sub

Cas avec Columns

Sub exemple()

'Sélection des colonnes B à G

Columns("B:G").Select

End Sub

Les propriétés

Commencez par ouvrir l'éditeur, ajoutez-y un module, copiez la macro ci-dessous et associez-
la à un bouton de formulaire.

Sub proprietes()

'Macro incomplète

Page 17 of 143
Range("A8")

End Sub

Nous voulons effectuer une action sur la cellule A8 avec ce début de macro.

Pour afficher la liste des possibilités que l'on peut associer à l'objet Range, ajoutez un
«. » après Range("A8") :

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

La propriété Value représente ici le contenu de la cellule. Nous voulons maintenant donner la
valeur 48 à la cellule A8 :

Sub proprietes()

'Cellule A8 = 48

Range("A8").Value = 48

Page 18 of 143
'Traduction :

'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()

'Cellule A8 = Exemple de texte

Range("A8").Value = "Exemple de texte"

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()

'Cellule A8 de la feuille 2 = Exemple de texte

Sheets("Feuil2").Range("A8").Value = "Exemple de texte"

End Sub

De même, si l'on souhaite modifier la cellule A8 de la feuille 2 d'un autre classeur ouvert, il faut
préciser le nom du classeur en début de ligne à l'aide de Workbooks("Nom_du_fichier") :

Sub proprietes2()

'Cellule A8 de la feuille 2 du classeur 2 = Exemple de texte3

Workbooks("chap [Link]").Sheets("Feuil3").Range("A8").Value = "Exemple de texte"

End Sub

Bien que Value ait été utilisé pour illustrer ces différents exemples, il n'est pas nécessaire de
l'indiquer, car c'est automatiquement la valeur de la cellule qui est modifiée si rien n'est précisé.

Page 19 of 143
Ces 2 lignes génèrent un résultat identique :

Range("A8").Value = 48

Range("A8") = 48

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 :

Mise en forme : taille du texte

Sub proprietes3()

'Cellule A8 de la feuille 2 du classeur 2 = Exemple de texte3

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").Value = "FontSize"

'Modifier la taille du texte des cellules A1 à A8

Range("A1:A8").[Link] = 12

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22

End Sub

Mise en forme : texte en gras

Sub proprietes3()

'Cellule A8 de la feuille 2 du classeur 2 = Exemple de texte3

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").Value = "FontSize"

Page 20 of 143
'Modifier la taille du texte des cellules A1 à A8

Range("A1:A8").[Link] = 12

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22

'mettre un texte en gras

Range("A1:A8").[Link] = True

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = True

End Sub

Bold = True signifie Caractères en gras = Oui.

Pour retirer la mise en forme Bold à un texte, il faut donc remplacer Oui par Non, autrement
dit, True par False :

Sub proprietes()

'Enlever la mise en forme "gras" des cellules A1 à A8

Range("A1:A8").[Link] = False

End Sub

Mise en forme : texte en italique

Sub proprietes3()

'Cellule A8 de la feuille 2 du classeur 2 = Exemple de texte3

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").Value = "FontSize"

'Modifier la taille du texte des cellules A1 à A8

Range("A1:A8").[Link] = 12

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22

'mettre un texte en gras

Range("A1:A8").[Link] = True

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = True

'Mettre en italique les cellules A1 à A8

Page 21 of 143
Range("A1:A8").[Link] = True

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = True

End Sub

Mise en forme : texte souligné

Sub proprietes3()

'Cellule A8 de la feuille 2 du classeur 2 = Exemple de texte3

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").Value = "FontSize"

'Modifier la taille du texte des cellules A1 à A8

Range("A1:A8").[Link] = 12

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = 22

'mettre un texte en gras

Range("A1:A8").[Link] = True

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = True

'Mettre en italique les cellules A1 à A8

Range("A1:A8").[Link] = True

Workbooks("chap [Link]").Sheets("Feuil4").Range("A1:A8").[Link] = True

'Souligner les cellules A1 à A8

Range("A1:A8").[Link] = True

End Sub

Mise en forme : police

Sub proprietes()

'Modifier la police de caractères des cellules A1 à A8

Range("A1:A8").[Link] = "Arial"

End Sub

Page 22 of 143
Ajouter des bordures

Sub proprietes()

'Ajouter une bordure aux cellules A1 à A8

Range("A1:A8").[Link] = 1

'Value = 0 : pas de bordure

End Sub

Modifier la mise en forme de la sélection actuelle

Sub proprietes()

'Ajouter une bordure aux cellules sélectionnées

[Link] = 1

End Sub

Modifier les propriétés d'une feuille

Sub proprietes4()

'Masquer une feuille

Sheets("Feuil3").Visible = 2

'Visible = -1 : afficher la feuille

End Sub

Page 23 of 143
Modifier la valeur d'une cellule en fonction d'une autre

Sub proprietes()

'A7 = A1

Range("A7") = Range("A1")

'Ou :

'Range("A7").Value = Range("A1").Value

End Sub

Ou pour copier par exemple la taille du texte :

Sub proprietes()

Range("A7").[Link] = Range("A1").[Link]

End Sub

Ce qui est à gauche du « = » prend la valeur de ce qui est à droite du « = ».

Modifier la valeur d'une cellule en fonction de sa propre valeur

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

Page 24 of 143
Cette ligne ne doit pas être interprétée comme une opération mathématique (rappelez-vous que
ce qui est à gauche du = prend la valeur de ce qui est à droite du =).

Excel exécute le code ligne par ligne en respectant certaines priorités, ces commentaires
devraient vous aider à mieux comprendre ce même code :

'Pour cet exemple : A1 vaut 10 avant l'exécution du 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

'A1 vaut alors 11 seulement après l'exécution de la ligne de code

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").[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

Nous pouvons utiliser With pour éviter les répétitions de Sheets("Feuil2").Range("A8") :

Page 25 of 143
Sub proprietes()

'Début de l'instruction avec : With

With Sheets("Feuil2").Range("A8")

.[Link] = 3

.[Link] = True

.[Link] = 18

.[Link] = True

.[Link] = "Arial"

'Fin de l'instruction avec : 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

Voici les 56 couleurs disponibles avec ColorIndex :

Page 26 of 143
Pour appliquer à notre texte l'une de ces 56 couleurs, nous écrirons :

Sub couleurs()

'Couleur du texte en A1 : vert (couleur 10)

Range("A1").[Link] = 10

End Sub

Ce qui nous donne:

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 couleurs1()

'Couleur du texte en A1 : rgb(0,0,255)

Range("A1").[Link] = RGB(0, 0, 255)

Page 27 of 143
End Sub

La couleur ici est RGB(0, 0, 255).

RGB en français signifie RVB (Rouge Vert Bleu), les valeurs vont de 0 à 255 pour chaque
couleur.

Quelques exemples de couleurs pour mieux comprendre :

✓ 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 :

Ce qui nous donne :

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 couleurs3()

'Epaisseur de la bordure

[Link] = 4

Page 28 of 143
'Couleur de la bordure : rouge

[Link] = RGB(255, 0, 0)

End Sub

Colorer le fond des cellules sélectionnées

Sub couleurs4()

'Colorer le fond des cellules sélectionnées

[Link] = RGB(174, 240, 194)

End Sub

Aperçu:

Colorer l'onglet d'une feuille

Sub couleurs5()

'Colorer l'onglet de la feuille "Feuil1"

Sheets("Feuil").[Link] = RGB(255, 0, 0)

End Sub

Apercu:

Page 29 of 143
Chapitre 2 : les variables

Les variables permettent de stocker toutes sortes de données.

Voici un premier exemple :

'Affichage de la valeur de la variable dans une boîte de dialogue

Sub variables()

'Déclaration de la variable

Dim maVariable As Integer

'Attribution d'une valeur à la variable

maVariable = 12

'Affichage de la valeur de maVariable dans une MsgBox

MsgBox maVariable

End Sub

Cette première ligne de code est la déclaration de la variable (généralement placée en début de
procédure).

Dim maVariable As Integer

✓ Dim : déclaration de la variable


✓ maVariable : nom choisi pour cette variable (sans espaces)
✓ As : déclaration du type de la variable
✓ Integer : type de la variable

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

Et enfin, la valeur de la variable est affichée dans une boîte de dialogue :

Page 30 of 143
MsgBox maVariable

MsgBox affiche une valeur dans une boîte de dialogue (les boîtes de dialogue seront détaillées
dans quelques leçons).

Le résultat de ce code :

Point de méthode : comment exécuter une macro sans l’affecter à un bouton

Allez dans l’onglet Développeur, puis dans le groupe code, actionner la rubrique macro
, une boîte de dialogue s’ouvre :

Sélectionner la macro à exécuter en appuyant sur le bouton exécuter.

Page 31 of 143
Les types de variables

Quelques exemples avec différents types :

Sub typevar()

'Exemple : nombre entier

Dim nbEntier As Integer

nbEntier = 12345

'Exemple : nombre à virgule

Dim nbVirgule As Single

nbVirgule = 123.45

MsgBox nbVirgule

'Exemple : texte

Dim varTexte As String

Page 32 of 143
varTexte = "Cours VBA Excel"

MsgBox varTexte

'Exemple : date

Dim varDate As Date

varDate = "26/01/2024"

MsgBox varDate

'Exemple : vrai/faux

Dim varBoolean As Boolean

varBoolean = True

MsgBox varBoolean

'Exemple : objet (objet Worksheet pour cet exemple)

Dim varFeuille As Worksheet

Set varFeuille = Sheets("Feuil2") 'Set => attribution d'une valeur à une variable objet

'Exemple d'utilisation de la variable objet : activation de la feuille

[Link]

End Sub

Les symboles indiqués dans le tableau ci-dessus permettent de raccourcir les déclarations de
variables.

Par soucis de lisibilité, ils ne seront pas utilisés dans les leçons mais voici tout de même un
exemple :

Dim exemple As Integer

Page 33 of 143
Dim exemple%

Ces deux lignes sont identiques.

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.

Fichier source : exercice_variables.xlsm

Commençons par déclarer les variables (sur la même ligne, séparées par des virgules) :

Sub variables()

'Déclaration des variables

Dim nom As String, prenom As String, age As Integer

End Sub

Attribuons ensuite les valeurs des cellules aux variables :

Sub variables()

'Déclaration des variables

Dim nom As String, prenom As String, age As Integer

'Valeurs des variables

nom = Cells(2, 1)

prenom = Cells(2, 2)

age = Cells(2, 3)

End Sub

Et enfin, affichons le résultat dans la boîte de dialogue en concaténant les valeurs avec &
(comme dans les formules Excel) :

Sub variables()
Page 34 of 143
'Déclaration des variables

Dim nom As String, prenom As String, age As Integer

'Valeurs des variables

nom = Cells(2, 1)

prenom = Cells(2, 2)

age = Cells(2, 3)

'Boîte de dialogue

MsgBox nom & " " & prenom & ", " & age & " ans"

End Sub

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 :

Page 35 of 143
Solutions :
Sub variables()
'Déclaration des variables
Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer
'Valeurs des variables
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)
'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"
End Sub
Une variable numeroLigne a été ajoutée :

'Déclaration des variables

Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer

La variable prend ensuite la valeur de la cellule F5 à laquelle nous ajoutons 1 (pour ne pas tenir
compte de la première ligne qui contient les titres du tableau). La variable numeroLigne aura
donc pour valeur le numéro de ligne des cellules qui nous intéressent :

numeroLigne = Range("F5") + 1

Page 36 of 143
Il ne reste plus qu'à remplacer les numéros de ligne dans Cells par notre variable :

nom = Cells(numeroLigne, 1)

prenom = Cells(numeroLigne, 2)

age = Cells(numeroLigne, 3)

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).

Tableaux

Les variables permettent de stocker une seule valeur par variable, les tableaux permettent de
stocker une multitude de valeurs par tableau (leur utilisation est proche de celle des variables).

Page 37 of 143
Voici quelques exemples de déclarations :

'Exemple de déclaration de variable

Dim var1 As String

'Exemple de déclaration de tableau à 1 dimension

Dim tab1(4) As String

'Exemple de déclaration de tableau à 2 dimensions

Dim tab2(4, 3) 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. Ce chiffre indique également le nombre de cases du tableau. Dans le cas présent,
tab1(4) est un tableau dont les cases vont de 0 à 4, il s'agit donc d'un tableau de comportant 5
cases :

tab1(0) = "Valeur de la case 0"

tab1(1) = "Valeur de la case 1"

tab1(2) = "Valeur de la case 2"

tab1(3) = "Valeur de la case 3"

tab1(4) = "Valeur de la case 4"

Page 38 of 143
Le tableau à 2 dimensions

'Exemple de déclaration de tableau à 2 dimensions

Dim tab2(4, 3) As String

Et voici comment attribuer des valeurs aux cases d'un tableau à 2 dimensions :

tab2(0, 0) = "Valeur de la case rouge"

tab2(4, 1) = "Valeur de la case verte"

tab2(2, 3) = "Valeur de la case bleue"

Nous reviendrons sur les tableaux plus tard dans ce cours.

Les constantes

Les constantes permettent de stocker des valeurs comme les variables, à la différence près qu'on
ne peut pas les modifier (d'où leur nom) après les avoir déclarées.

Par exemple, ces quelques lignes calculent le montant de la TVA en fonction d'un taux de TVA
de 12.34% :

Sub exemple()

'TVA

Cells(2, 2) = Cells(2, 1) * 0.1234

Cells(3, 2) = Cells(3, 1) * 0.1234

Cells(4, 2) = Cells(4, 1) * 0.1234

Cells(5, 2) = Cells(5, 1) * 0.1234

Cells(6, 2) = Cells(6, 1) * 0.1234

Page 39 of 143
'Montant TTC

Cells(2, 3) = Cells(2, 1) + Cells(2, 2)

Cells(3, 3) = Cells(3, 1) + Cells(3, 2)

Cells(4, 3) = Cells(4, 1) + Cells(4, 2)

Cells(5, 3) = Cells(5, 1) + Cells(5, 2)

Cells(6, 3) = Cells(6, 1) + Cells(6, 2)

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()

'Déclaration de la constante + attribution de sa valeur

Const TAUX_TVA As Double = 0.1234

'TVA

Cells(2, 2) = Cells(2, 1) * TAUX_TVA

Cells(3, 2) = Cells(3, 1) * TAUX_TVA

Cells(4, 2) = Cells(4, 1) * TAUX_TVA

Cells(5, 2) = Cells(5, 1) * TAUX_TVA

Cells(6, 2) = Cells(6, 1) * TAUX_TVA

'Montant TTC

Cells(2, 3) = Cells(2, 1) + Cells(2, 2)

Cells(3, 3) = Cells(3, 1) + Cells(3, 2)

Cells(4, 3) = Cells(4, 1) + Cells(4, 2)

Cells(5, 3) = Cells(5, 1) + Cells(5, 2)

Cells(6, 3) = Cells(6, 1) + Cells(6, 2)

End Sub

Page 40 of 143
En utilisant une constante, le jour où le taux de TVA changera, il vous suffira de modifier une
seule fois la valeur de la constante dans le code (au lieu de rechercher et remplacer toutes les
valeurs 0.1234 dans le code).

Par convention, une constante se nomme en majuscules en séparant les mots par un _ (par
exemple : EXEMPLE_DE_NOM).

La portée des variables

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()

Dim var1 As Integer

'=> Utilisation de la variable dans la procédure uniquement

End Sub

Sub procedure2()

'=> Impossible d'utiliser var1 ici

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.

Dim var1 As Integer

Sub procedure1()

'=> Utilisation de var1 possible

End Sub

Sub procedure2()

'=> Utilisation de var1 possible

End Sub

Page 41 of 143
Même principe pour utiliser une variable dans tous les modules, à la différence près que Dim
est remplacé par Public :

Public var1 As Integer

Pour conserver la valeur d'une variable à la fin d'une procédure, remplacez Dim par Static :

Sub procedure1()

Static var1 As Integer

End Sub

Pour conserver les valeurs de toutes les variables d'une procédure, ajoutez Static devant Sub :

Static Sub procedure1()

Dim var1 As Integer

End Sub

Créer son propre type de variable

Nous n'allons pas nous attarder sur ce point, voici juste un exemple :

'Création d'un type de variable

Type Utilisateur

Nom As String

Prenom As String

End Type

Sub exemple()

'Déclaration

Dim user1 As Utilisateur

'Attributions des valeurs à user1

[Link] = "Smith"

[Link] = "John"

'Exemple d'utilisation
Page 42 of 143
MsgBox [Link] & " " & [Link]

End Sub

Chapitre 3 : 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).

Instruction IF

La principale instruction est If, voici comment elle fonctionne :

If [CONDITION] Then '=> SI condition vraie ALORS

'Instructions si vrai

Else '=> SINON (facultatif)

'Instructions si faux

End If

Passons directement à la pratique et reprenons l'exemple développé à la leçon sur les variables.
Il avait pour but d'afficher dans une boîte de dialogue la ligne du tableau correspondant au
numéro indiqué dans la cellule F5.

Si nous entrons une lettre en F5, cela génère un bug et nous voulons éviter cela.

Sub exemple()

Page 43 of 143
'Déclaration des variables

Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer

'Valeurs des variables

numeroLigne = Range("F5") + 1

nom = Cells(numeroLigne, 1)

prenom = Cells(numeroLigne, 2)

age = Cells(numeroLigne, 3)

'Boîte de dialogue

MsgBox nom & " " & prenom & ", " & age & " ans"

End Sub

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

'Déclaration des variables

Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer

'Valeurs des variables

numeroLigne = Range("F5") + 1

nom = Cells(numeroLigne, 1)

prenom = Cells(numeroLigne, 2)

age = Cells(numeroLigne, 3)

'Boîte de dialogue

Page 44 of 143
MsgBox nom & " " & prenom & ", " & age & " ans"

End If

End Sub

Ajoutons également des instructions pour le cas où la condition n'est pas remplie :

Sub exemple()

'Si F5 est numérique

If IsNumeric(Range("F5")) Then

'Déclaration des variables

Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer

'Valeurs des variables

numeroLigne = Range("F5") + 1

nom = Cells(numeroLigne, 1)

prenom = Cells(numeroLigne, 2)

age = Cells(numeroLigne, 3)

'Boîte de dialogue

MsgBox nom & " " & prenom & ", " & age & " ans"

'Si F5 n'est pas numérique

Else

'Boîte de dialogue : avertissement

MsgBox "L'entrée """ & Range("F5") & """ n'est pas valide !"

'Suppression du contenu de la cellule F5

Range("F5") = ""

End If

End Sub

Page 45 of 143
Les valeurs non numériques ne sont désormais plus un problème.

Notre tableau contient 16 lignes de données (de la ligne 2 à la ligne 17), nous allons donc vérifier
maintenant si la variable numeroLigne est plus grande ou égale à 2 et plus petite ou égale à 17.

Mais avant, voici les opérateurs de comparaison :

= Est égal à

<> Est différent de

< Est plus petit que

<= Est plus petit ou égal à

> Est plus grand que

>= Est plus grand ou égal à

Ainsi que d'autres opérateurs utiles :

And Et [CONDITION 1] And [CONDITION 2]

Les 2 conditions doivent être vraies

Or Ou [CONDITION 1] Or [CONDITION 2]

Au moins 1 des 2 conditions doit être vraie

Not Faux Not [CONDITION]

La condition doit être fausse

Mod Modulo [NOMBRE] Mod [DIVISEUR]

Cet opérateur retourne le reste d'une division

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()

'Si F5 est numérique

If IsNumeric(Range("F5")) Then

Dim nom As String, prenom As String, age As Integer, numeroLigne As Integer

Page 46 of 143
numeroLigne = Range("F5") + 1

'Si le numéro est dans la bonne plage

If numeroLigne >= 2 And numeroLigne <= 17 Then

nom = Cells(numeroLigne, 1)

prenom = Cells(numeroLigne, 2)

age = Cells(numeroLigne, 3)

MsgBox nom & " " & prenom & ", " & age & " ans"

'Si le numéro est en dehors de la plage

Else

MsgBox "L'entrée """ & Range("F5") & """ n'est pas un numéro valide !"

Range("F5") = ""

End If

'Si F5 n'est pas numérique

Else

MsgBox "L'entrée """ & Range("F5") & """ n'est pas valide !"

Range("F5") = ""

End If

End Sub

Pour rendre notre macro plus pratique, nous pouvons encore remplacer 17 par une variable
contenant le nombre de lignes. Cela nous permettra d'ajouter/retirer des lignes à notre tableau
sans avoir à modifier à chaque fois cette limite dans le code.

Pour cela, créons une variable nbLignes et ajoutons cette fonction :

Page 47 of 143
[Link] ne vous dit probablement rien mais il s'agit en fait de la fonction
NBVAL que vous connaissez probablement déjà (sinon, cliquez ici).

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 :

ELSEIF

ElseIf permet d'ajouter plusieurs conditions à la suite :

If [CONDITION 1] Then '=> SI la condition 1 est vraie ALORS

'Instructions 1

ElseIf [CONDITION 2] Then '=> SINON, SI la condition 2 est vraie ALORS

'Instructions 2

Else '=> SINON

'Instructions 3

End If

Si la condition 1 est vraie, les instructions 1 sont exécutées puis nous sortons de l'instruction If
(qui débute avec If et se termine à End If). Si la condition 1 est fausse, nous passons à la
condition 2. Si celle-ci est vraie les instructions 2 sont exécutées si ce n'est pas le cas les
instructions 3 sont alors exécutées.

Voici un exemple, avec en K1 une note de 1 à 6 et en J1 un commentaire en fonction de la note


:

Sub commentaires()

'Variables

Page 48 of 143
Dim note As Single, commentaire As String

note = Range("J1")

'Commentaire en fonction de la note

If note = 6 Then

commentaire = "Excellent résultat !"

ElseIf note >= 5 Then

commentaire = "Bon résultat"

ElseIf note >= 4 Then

commentaire = "Résultat satisfaisant"

ElseIf note >= 3 Then

commentaire = "Résultat insatisfaisant"

ElseIf note >= 2 Then

commentaire = "Mauvais résultat"

ElseIf note >= 1 Then

commentaire = "Résultat exécrable"

Else

commentaire = "Aucun résultat"

End If

'Commentaire en B1

Range("K1") = commentaire

End Sub

SELECT

Une alternative aux instructions If contenant beaucoup de ElseIf existe, il s'agit de Select (cette
instruction étant plus adaptée dans ce genre de cas).

Voici la même macro avec Select :

Page 49 of 143
Sub commentaires2()

'Variables

Dim note As Single, commentaire As String

note = Range("J9")

'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 k1

Range("K9") = commentaire

End Sub

Page 50 of 143
Notez que nous pouvons également entrer plusieurs valeurs :

Case Is = 6, 7 'Si la valeur = 6 ou 7

Case Is <> 6, 7 'Si la valeur est différente de 6 ou 7

Exemple :

Sub commentaires2()

'Variables

Dim note As Single, commentaire As String

note = Range("J9")

'Commentaire en fonction de la note

Select Case note '<= la valeur à tester (ici, la note)

Case Is = 6, 7 'Si la valeur = 6 ou 7

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

Page 51 of 143
commentaire = "Aucun résultat"

End Select

'Commentaire en k1

Range("K9") = commentaire

End Sub

Ou une plage de valeurs :

Case 6 To 10 'Si la valeur = de 6 à 10

Exemple :

Sub commentaires2()

'Variables

Dim note As Single, commentaire As String

note = Range("J9")

'Commentaire en fonction de la note

Select Case note '<= la valeur à tester (ici, la note)

Case 6 To 10 'Si la valeur = de 6 à 10

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"

Page 52 of 143
Case Is <= 1

commentaire = "Résultat exécrable"

Case Else

commentaire = "Aucun résultat"

End Select

'Commentaire en k1

Range("K9") = commentaire

End Sub

Fonction isnumeric

La fonction IsNumeric (vue à la page précédente) renvoie True (vrai) si la valeur est numérique
et False (faux) si ce n'est pas le cas :

If IsNumeric(Range("A1")) = True Then

Ou

If IsNumeric(Range("A1")) Then

Ces 2 lignes sont identiques (il n'est pas nécessaire d'entrer = True puisque que l'on cherche de
toute manière à savoir si l'expression est vraie).

Dans le cas où nous voulons vérifier si la valeur n'est pas numérique, nous avons également
deux possibilités :

If IsNumeric(Range("A1")) = False Then 'Si la valeur n'est pas numérique

If Not IsNumeric(Range("A1")) Then 'Si la valeur n'est pas numérique

Il existe de nombreuses autres fonctions que vous pouvez utiliser dans vos conditions (ou plus
généralement dans vos codes VBA).

Exemple 1 :

Utilisation de la fonction IsNumeric pour vérifier si la valeur entrée par l'utilisateur peut être
considérée comme un nombre :

Page 53 of 143
Sub Valeur_Numérique()

nombre = InputBox("Entrez un nombre :")

'Test de la valeur entrée

If IsNumeric(nombre) Then

'Action à effectuer si la valeur entrée est un nombre

MsgBox "Bravo, bel effort !"

End If

End Sub

Exemple 2 :

Utilisation de la fonction IsNumeric pour déterminer si les différentes valeurs suivantes peuvent
être considérées comme des nombres :

Sub Valeur_Numéric2()

MsgBox IsNumeric(0) 'Renvoie : True

MsgBox IsNumeric("0") 'Renvoie : True

MsgBox IsNumeric(1) 'Renvoie : True

MsgBox IsNumeric("1") 'Renvoie : True

MsgBox IsNumeric(" 1 ") 'Renvoie : True

MsgBox IsNumeric(-45) 'Renvoie : True

MsgBox IsNumeric("45") 'Renvoie : True

MsgBox IsNumeric("-45") 'Renvoie : True

MsgBox IsNumeric(36.21) 'Renvoie : True

MsgBox IsNumeric("-36.21") 'Renvoie : True

MsgBox IsNumeric(3 + "2") 'Renvoie : True

MsgBox IsNumeric(True) 'Renvoie : True

MsgBox IsNumeric(False) 'Renvoie : True

Page 54 of 143
MsgBox IsNumeric("3b") 'Renvoie : False

MsgBox IsNumeric("un") 'Renvoie : False

MsgBox IsNumeric("") 'Renvoie : False

MsgBox IsNumeric(Null) 'Renvoie : False

End Sub

Fonctions de dates

Il existe de nombreuses fonctions de dates et d'heures pouvant être utilisées dans des conditions,
en voici quelques exemples.

La fonction IsDate renvoie True si la valeur est une date ou False si ce n'est pas le cas :

If IsDate(Range("A1")) Then 'Si la valeur est une date

La fonction Day permet d'extraire le jour d'une date :

If Day(Range("A1")) = 1 Then 'Si c'est le premier jour du mois

La fonction Year permet d'extraire l'année d'une date :

If Year(Range("A1")) = 2024 Then 'Si c'est une date de l'année 2024

La fonction Weekday renvoie le numéro du jour de la semaine :

If Weekday(Range("A1"), 2) >= 6 Then 'Si c'est un samedi ou un dimanche

La fonction Date renvoie la date actuelle :

If Range("A1") < Date Then 'Si la date est passée

Exemples d'utilisation

Enregistrer la date retournée par la fonction Date dans la cellule A1 :

If Range("A1") < Date Then 'Si la date est passée

Exemple :

Sub dates1()

Sheets("Feuil2").Range("A1") = Format(Date, "d mmmm yyyy")

Sheets("Feuil2").Range("A3") = Date
Page 55 of 143
End Sub

Fonction isempty

La fonction IsEmpty renvoie False si la variable a été initialisée ou True si ce n'est pas le cas :

If IsEmpty(maVariable) Then 'Si la variable n'a pas été initialisée

Exemple :

Cas1 : variable initialisée

Sub Vide()

Dim maVariable As Single

maVariable = 2

If IsEmpty(maVariable) Then

MsgBox "Ma variable n'a pas été initialisée !"

Else

MsgBox "Ma variable contient : " & maVariable

End If

End Sub

Cas 2 : variable non initialisée

Sub Vide()

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

Page 56 of 143
Condition en fonction de la comparaison de 2 chaînes de caractères

Jusque-là nous n'avons vu que cela :

maVariable = "Exemple 12345"

If maVariable = "Exemple 12345" Then '=> Vrai

Dans ce cas, les 2 chaînes de caractères sont identiques, l'expression est donc vraie.

Maintenant, pour vérifier si la variable contient la valeur 12345 sans tenir compte des autres
caractères, nous utiliserons l'opérateur Like ainsi que * devant et derrière la valeur à rechercher.

Le caractère *

Le caractère * peut remplacer : aucun, un ou plusieurs caractères :

maVariable = "Exemple 12345"

If maVariable Like "*12345*" Then '=> Vrai

Le caractère #

Le caractère # peut remplacer un caractère numérique de 0 à 9 :

maVariable = "Exemple 12345"

If maVariable Like "Exemple 12###" Then '=> Vrai

Le caractère ?

Le caractère ? peut remplacer un caractère quelconque :

maVariable = "Exemple 12345"

If maVariable Like "?xemple?1234?" Then '=> Vrai

Nous pouvons également remplacer un caractère en fonction d'une plage de caractères ou de


caractères précis :

➢ [abc] : remplace un des caractères suivants : a b c


➢ [a-g] : remplace un des caractères suivants : a b c d e f g
➢ [369] : remplace un des caractères suivants : 3 6 9
➢ [2-5] : remplace un des caractères suivants : 2 3 4 5
➢ [?*#] : remplace un des caractères suivants : ? * #

Page 57 of 143
maVariable = "Exemple 12345"

If maVariable Like "[BIEN]xemple 1234[4-7]" Then '=> Vrai

Pour remplacer un caractère non compris dans les valeurs entre crochets, un ! doit être ajouté
après [:

maVariable = "Exemple 12345"

If maVariable Like "[!FAUX]xemple 1234[!6-9]" Then '=> Vrai

Chapitre 4: 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. Le code suivant numérote les cellules de la colonne A (de la ligne 1 à 12) :

Sub exemple()

Cells(1, 1) = 1

Cells(2, 1) = 2

Cells(3, 1) = 3

Cells(4, 1) = 4

Cells(5, 1) = 5

Cells(6, 1) = 6

Cells(7, 1) = 7

Cells(8, 1) = 8

Cells(9, 1) = 9

Cells(10, 1) = 10

Cells(11, 1) = 11

Cells(12, 1) = 12

End Sub

Ce code est très répétitif ...

Page 58 of 143
Maintenant, imaginez qu'il faille numéroter plusieurs milliers de lignes ... Vous comprenez
donc probablement l'intérêt de créer des boucles.

boucle Do

Voici la boucle Do :

Sub exemple()

Do While [CONDITION]

'Instructions

Loop

End Sub

Tant que la condition est vraie, les instructions sont exécutées en boucle (attention à ne pas
créer une boucle infinie). Voici la macro répétitive ci-dessus avec la boucle Do :

Sub exemple2()

Dim numero As Integer

numero = 1 'Numéro de départ

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]

Page 59 of 143
'Instructions

Loop

End Sub

Avec Do, la condition peut également être placée en fin de boucle, ce qui implique que les
instructions seront dans tous les cas exécutés au moins une fois :

Sub exemple()

Do

'Instructions

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

Page 60 of 143
La boucle For est répétée ici 5 fois. A chaque répétition de la boucle, la variable i est
automatiquement incrémentée de 1 :

Sub boucle_For()

Dim i As Integer

For i = 1 To 5

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

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()

Dim cellule As Range

For Each cellule In Range("A1:B3")

cellule = [Link]

Next

End Sub

Parcourir chaque feuille du classeur :

Page 61 of 143
Sub exemple()

Dim feuille As Worksheet

For Each feuille In Worksheets

MsgBox [Link]

Next

End Sub

Parcourir chaque élément d'un tableau :

Sub exemple()

Dim tableau(2) As String

tableau(0) = "A"

tableau(1) = "B"

tableau(2) = "C"

For Each valeur In tableau

MsgBox valeur

Next

End Sub

Quitter une boucle prématurément

Il est possible de quitter une boucle For prématurément grâce à l'instruction suivante :

Exit For 'Quitter une boucle For

Dans cet exemple, l'objectif est de retourner le numéro de la première ligne contenant la valeur
1. Lorsque cet objectif est atteint, le numéro est affiché et la boucle est interrompue (car il est
dans ce cas inutile de parcourir les autres lignes) :

Sub QuitterBoucle()

Dim i As Integer

'Boucle pour 100 lignes au maximum

Page 62 of 143
For i = 1 To 100

'Si la cellule vaut 1

If Cells(i, 1) = 1 Then 'Si l'objectif est atteint

MsgBox "La cellule a été trouvée à la ligne " & i & " !"

Exit For 'On quitte la boucle For

End If

Next

End Sub

Les autres instructions Exit :

➢ Exit Do 'Quitter une boucle Do


➢ Exit Sub ‘Quitter une procédure
➢ Exit Function 'Quitter une fonction

Cas Pratique

Pour mettre en pratique ce qui a été vu jusque-là, nous allons créer étape par étape une macro
qui va numéroter de 1 à 100 une plage de cellules carrée de 10 par 10 et colorer une cellule sur
2, aperçu :

Page 63 of 143
Voici le point de départ de l'exercice :

Sub exerc

iceBoucles()

'...

End Sub

Pour commencer, ajoutez une boucle For qui va numéroter de 1 à 10 les cellules de la ligne 1,
aperçu :

Solutions :

Sub exerciceBoucles()

Dim colonne As Integer

'Boucle des colonnes

For colonne = 1 To 10

Cells(1, colonne) = colonne

Next

End Sub

Créez maintenant une seconde boucle qui va répéter la première boucle sur 10 lignes, aperçu :

Page 64 of 143
Sub exerciceBoucles2()

Dim colonne As Integer, ligne As Integer

'Boucle des lignes

For ligne = 1 To 10

'Boucle des colonnes

For colonne = 1 To 10

Cells(ligne, colonne) = colonne

Next

Next

End Sub

Les lignes sont pour le moment numérotées de 1 à 10.

Trouvez maintenant une solution pour obtenir une numérotation de 1 à 100, aperçu :

Page 65 of 143
Une solution "simple" consiste à utiliser une variable qui sera incrémentée de 1 après chaque
entrée dans une cellule :

Sub exerciceBoucles3()

Dim colonne As Integer, ligne As Integer, valeur As Integer

'Valeur de la première cellule

valeur = 1

'Boucle des lignes

For ligne = 1 To 10

'Boucle des colonnes

For colonne = 1 To 10

Cells(ligne, colonne) = valeur

valeur = valeur + 1 'Valeur incrémentée de 1

Next

Next

End Sub

Page 66 of 143
Une autre solution consiste à calculer la valeur à insérer dans la cellule à l'aide des numéros de
colonne et de ligne :

Sub exerciceBoucles4()

Dim colonne As Integer, ligne As Integer

'Boucle des lignes

For ligne = 1 To 10

'Boucle des colonnes

For colonne = 1 To 10

Cells(ligne, colonne) = (ligne - 1) * 10 + colonne

Next

Next

End Sub

Pour terminer l'exercice, il reste encore à colorer le fond d'une cellule sur 2 à l'aide d'une
instruction If et de l'opérateur Mod (qui retourne le reste d'une division), aperçu :

Page 67 of 143
Sub exerciceBoucles5()

Dim colonne As Integer, ligne As Integer

'Boucle des lignes

For ligne = 1 To 10

'Boucle des colonnes

For colonne = 1 To 10

Cells(ligne, colonne) = (ligne - 1) * 10 + colonne

'Coloration d'une cellule sur 2

If (ligne + colonne) Mod 2 = 0 Then 'Si le reste de la division par 2 = 0

Cells(ligne, colonne).[Link] = RGB(102, 205, 170)

End If

Next

Next

End Sub

La condition (ligne + colonne) Mod 2 = 0 est vraie si le reste de la division de (ligne + colonne)
par 2 est égal à 0 (sachant que le reste de la division d'un nombre entier positif par 2 ne peut
être que 0 ou 1).

Pour prendre un exemple plus simple, si l'objectif de l'exercice était de colorer les lignes paires
(sans tenir compte des colonnes), la condition aurait été ligne Mod 2 = 0.

Chapitre 5 : Les procédures et fonctions

Public - Private

Pour le moment, toutes les procédures créées sont de type Public, elles sont accessibles depuis
tous les modules.

Sub exemple()

'Est identique à :

Page 68 of 143
Public Sub exemple()

Pour rendre une procédure inaccessible hors du module, ajoutez Private :

Private Sub exemple()

Lancer une procédure depuis une procédure

Pour exécuter une procédure depuis une autre procédure, entrez simplement son nom.

Un exemple simple :

Private Sub avertissement()

MsgBox "Attention !!!"

End Sub

Sub exemple()

If Range("A1") = "" Then

avertissement '<= exécute la procédure "avertissement"

End If

End Sub

Ici, lorsque la procédure exemple est lancée et que A1 vaut "", la procédure avertissement est
exécutée et affiche la boîte de dialogue.

Les arguments

Les arguments permettent de transmettre des valeurs d'une procédure à une autre (car rappelez-
vous que par défaut les variables ne sont pas accessibles depuis les autres procédures).

Ajout d'un argument texte à la procédure avertissement :

Private Sub avertissement2(texte As String)

MsgBox "Attention : " & texte & " !"

End Sub

Sub exemple2()

If Range("A1") = "" Then 'Si A1 est vide

Page 69 of 143
avertissement2 "cellule vide"

ElseIf Not IsNumeric(Range("A1")) Then 'Si A1 est non numérique

avertissement2 "valeur non numérique"

End If

End Sub

L'argument ajouté à la procédure avertissement est de type String :

Private Sub avertissement(texte As String)

Pour exécuter la procédure avertissement, il faudra donc entrer en argument une valeur de type
String :

avertissement "cellule vide"

En cas d'arguments multiples, ceux-ci doivent être séparés par des virgules.

Les arguments optionnels

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 :

Private Sub boiteDialogue(nom As String, Optional prenom, Optional age)

Cette procédure peut alors être lancée avec ou sans arguments optionnels, comme ceci :

'Exemple 1 : on affiche le nom

Page 70 of 143
boiteDialogue nom

'Exemple 2 : on affiche le nom et le prénom

boiteDialogue nom, prenom

'Exemple 3 : on affiche le nom et l'âge

boiteDialogue nom, , age

'Exemple 4 : on affiche le nom, le prénom et l'âge

boiteDialogue nom, prenom, age

Les arguments doivent être indiqués dans l'ordre.

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).

Voici un exemple avec les 2 portions de code ci-dessus :

Sub exemple3()

Dim nom As String, prenom As String, age As Integer

nom = Range("A1")

prenom = Range("B1")

age = Range("C1")

'Exemple 1 : on affiche le nom

boiteDialogue nom

'Exemple 2 : on affiche le nom et le prénom

boiteDialogue nom, prenom

'Exemple 3 : on affiche le nom et l'âge

boiteDialogue nom, , age

'Exemple 4 : on affiche le nom, le prénom et l'âge

boiteDialogue nom, prenom, age

Page 71 of 143
End Sub

Private Sub boiteDialogue(nom As String, Optional prenom, Optional age)

'Si l'âge est manquant

If IsMissing(age) Then

If IsMissing(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

'Si l'âge a été renseigné

Else

If IsMissing(prenom) Then 'Si le prénom est manquant, on affiche le nom et l'âge

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

Aperçu (avec nom prénom et âge) :

Page 72 of 143
Il est également possible de renseigner des valeurs par défaut aux arguments optionnels et de
tester ensuite ces valeurs (au lieu d'utiliser la fonction IsMissing) :

Sub exemple4()

Dim nom As String, prenom As String, age As Integer

nom = Range("A1")

prenom = Range("B1")

age = Range("C1")

'Exemple 1 : on affiche le nom

boiteDialogue nom

'Exemple 2 : on affiche le nom et le prénom

boiteDialogue nom, prenom

'Exemple 3 : on affiche le nom et l'âge

boiteDialogue nom, , age

'Exemple 4 : on affiche le nom, le prénom et l'âge

boiteDialogue nom, prenom, age

End Sub

Page 73 of 143
Private Sub boiteDialogue(nom As String, Optional prenom As String = "", Optional age As
Integer = 0)

'Si l'âge est manquant

If age = 0 Then

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

'Si l'âge a été renseigné

Else

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 exemple5()

Dim nombre As Integer

Page 74 of 143
nombre = InputBox("Entrez un nombre :")

carre nombre

MsgBox nombre

End Sub

Private Sub carre(ByRef valeur As Integer) 'Il n'est pas nécessaire de préciser ByRef (type par
défaut)

valeur = valeur ^ 2

End Sub

Pour mieux comprendre, voici ce qui se passe lorsque la macro est lancée :

'La valeur initiale de la variable "nombre" est 30

nombre = InputBox("Entrez un nombre :")

'La sous-procédure est lancée avec la variable "nombre" en argument

carre nombre

'La variable "valeur" fait référence à la variable "nombre" passée en argument, par conséquent
si la variable "valeur" est modifiée, la variable "nombre" le sera aussi

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, un nombre est alors affiché dans la boîte de dialogue

MsgBox nombre

La seconde possibilité consiste à utiliser ByVal. Contrairement à ByRef qui fait directement
référence à la variable, ByVal transmet uniquement sa valeur, ce qui signifie que la variable
passée en argument ne subit aucune modification. Voici ce qui se passe avec le code précédent
et ByVal :

Page 75 of 143
'La valeur initiale de la variable "nombre" est 30

nombre = InputBox("Entrez un nombre :")

'La sous-procédure est lancée avec la variable "nombre" en argument

carre nombre

'La variable "valeur" copie la valeur de la variable "nombre" (les 2 variables ne sont pas liées)

Private Sub carre(ByVal valeur As Integer)

'La valeur de la variable "valeur" est modifiée

valeur = valeur ^ 2

'Fin de la sous-procédure (dans cet exemple, la sous-procédure n'aura servi à rien)

End Sub

'La variable "nombre" n'a pas été modifiée, 30 est donc affiché dans la boîte de dialogue

MsgBox nombre

Les fonctions

La principale différence entre Sub et Function est qu'une fonction retourne une valeur.

En voici un exemple simple :

Function carre(nombre As Double)

carre = nombre ^ 2 'La fonction "carre" retourne la valeur de "carre"

End Function

Sub exemple6()

Dim resultat, nb As Double

nb = InputBox("Entrez un nombre :")

resultat = carre(nb) 'La variable resultat reçoit la valeur retournée par la fonction

MsgBox resultat 'Affichage du résultat (ici, le carré de 9.876)

End Sub

Page 76 of 143
Vous pouvez remarquer que les arguments d'une fonction sont ajoutés entre () contrairement
aux procédures où elles sont superflues.

Chapitre 6 : Les boîtes de dialogue

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

Dans ce cas, MsgBox n'est utilisé qu'avec un seul argument.

Aperçu du résultat de ce code :

Nous allons maintenant créer une boîte de dialogue qui va nous demander de confirmer la
suppression avant d'exécuter les instructions.

Voici les 3 arguments que nous allons renseigner :

MsgBox([TEXTE], [BOUTONS], [TITRE])

➢ Texte : texte de la boîte de dialogue


➢ Boutons : choix des boutons (Oui, Non, Annuler, etc.) + d'autres options
➢ Titre : titre de la boîte de dialogue

Page 77 of 143
Aperçu :

Sub effacerB2_2()

If MsgBox("Etes-vous certain de vouloir supprimer le contenu de B2 ?", vbYesNo,


"Demande de confirmation") = vbYes Then

Range("B2").ClearContents

MsgBox "Le contenu de B2 a été effacé !"

End If

End Sub

Aperçu :

vbYesNo indique que les boutons de la boîte de dialogue sont les boutons "Oui" et "Non",
vbYes correspond au bouton "Oui" :

If MsgBox("Texte", vbYesNo, "Titre") = vbYes Then 'Si le bouton Oui est cliqué

MsgBox peut être utilisé à la fois comme une procédure ou une fonction. Si vous avez besoin
de connaître le choix de l'utilisateur et donc obtenir une valeur en retour, utilisez MsgBox en
tant que fonction en ajoutant des () aux arguments.

Page 78 of 143
Les différentes possibilités pour le second argument de msgbox

Les valeurs à 0 sont celles par défaut.

Le deuxième argument de MsgBox peut prendre plusieurs valeurs de ce tableau.

Par exemple, pour une boîte de dialogue avec "Oui, Non, Annuler" + icône exclamation +
bouton 2 par défaut :

Sub effacerB2_3()

If MsgBox("Warning", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Demande


de confirmation") = vbYes Then

Range("B2").ClearContents

MsgBox "Le contenu de B2 a été effacé !"

End If

Page 79 of 143
End Sub

Les constantes peuvent être remplacées par leur valeur respective, ces 3 lignes affichent une
boîte de dialogue identique :

MsgBox("Texte", vbYesNoCancel + vbExclamation + vbDefaultButton2, "Titre")

MsgBox("Texte", 3 + 48 + 256, "Titre")

MsgBox("Texte", 307, "Titre")

Les valeurs renvoyées par msgbox

Voici l'exemple d'une MsgBox qui apparaît en boucle tant que le bouton "Oui" n'est pas cliqué
:

Sub humour()

Do
Page 80 of 143
If MsgBox("Aimez-vous le cours de Vba-Excel ?", 36, "Sondage") = vbYes Then

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 :

Sub saut_Ligne()

MsgBox "Exemple 1" & Chr(10) & "Exemple 2" & Chr(10) & Chr(10) & "Exemple 3"

End Sub

Aperçu :

Inputbox

La fonction InputBox demande à l'utilisateur d'entrer une valeur dans une boîte de dialogue,
exemple :

Sub exemple()

Dim resultat As String

resultat = InputBox("Texte ?", "Titre") 'La variable reçoit la valeur entrée dans l'InputBox

Page 81 of 143
If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat

MsgBox resultat

End If

End Sub

Aperçu:

Il est également possible d'indiquer une valeur par défaut en troisième argument :

Sub exemple()

Dim resultat As String

resultat = InputBox("Texte ?", "Titre", "Valeur par défaut") 'La variable reçoit la valeur
entrée dans l'InputBox

If resultat <> "" Then 'Si la valeur est différente de "" on affiche le résultat

MsgBox resultat

End If

End Sub

Page 82 of 143
Chapitre 7 : les événements

Les événements Workbook

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 :

Private Sub Workbook_Open()

End Sub

Par exemple, en ajoutant l'instruction suivante, une boîte de dialogue sera affichée à l'ouverture
du classeur :

Private Sub Workbook_Open()

MsgBox "Message de bienvenue"

End Sub

WORKBOOK_BEFORECLOSE (AVANT FERMETURE)

Pour exécuter des instructions juste avant la fermeture du classeur, choisissez BeforeClose

Page 83 of 143
Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub

La fermeture du classeur peut être annulée en attribuant la valeur True à la variable Cancel.

Voici un exemple où l'utilisateur doit confirmer la fermeture du classeur :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Si l'utilisateur répond Non, la variable Cancel vaudra True (ce qui annulera la fermeture)

If MsgBox("Etes-vous certain de vouloir fermer ce classeur ?", 36, "Confirmation") = vbNo


Then

Cancel = True

End If

End Sub

WORKBOOK_BEFORESAVE (AVANT ENREGISTREMENT)

Cet événement se déclenche juste avant l'enregistrement :

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

End Sub

L'enregistrement peut être annulé en attribuant la valeur True à la variable Cancel.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Page 84 of 143
If SaveAsUI = False Then

If MsgBox("Do you really want to save this Workbook? ", vbYesNo) = vbNo Then

Cancel = True

Exit Sub

End If

End If

End Sub

WORKBOOK_AFTERSAVE (APRÈS ENREGISTREMENT)

Cet événement se déclenche juste après l'enregistrement :

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

End Sub

Exemple :

Private Sub Workbook_AfterSave(ByVal Success As Boolean)

If Success Then

MsgBox ("The workbook was successfully saved.")

End If

End Sub

WORKBOOK_BEFOREPRINT (AVANT IMPRESSION)

Cet événement se déclenche juste avant l'impression :

Private Sub Workbook_BeforePrint(Cancel As Boolean)

End Sub

L'impression peut être annulée en attribuant la valeur True à la variable Cancel.

Exemple :

Page 85 of 143
Private Sub Workbook_BeforePrint(Cancel As Boolean)

[Link] = "[Link]"

End Sub

WORKBOOK_SHEETACTIVATE (À L'ACTIVATION D'UNE FEUILLE)

Cet événement se déclenche à chaque changement de feuille :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

End Sub

Par exemple, affichage du nom de la feuille dans une boîte de dialogue :

Private Sub Workbook_SheetActivate(ByVal Sh As Object)

MsgBox "Nom de la feuille : " & [Link]

End Sub

WORKBOOK_SHEETBEFOREDOUBLECLICK (AVANT DOUBLE-CLIC)

Cet événement se déclenche juste avant un double-clic sur une cellule :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As


Range, Cancel As Boolean)

End Sub

Par exemple, coloration d'une cellule double-cliquée en fonction de la feuille :

Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As


Range, Cancel As Boolean)

If [Link] = "Feuil1" Then

[Link] = RGB(255, 108, 0) 'Couleur orange

Else

[Link] = RGB(136, 255, 0) 'Couleur verte

Page 86 of 143
End If

End Sub

Le double-clic peut être annulé en attribuant la valeur True à la variable Cancel.

WORKBOOK_SHEETBEFORERIGHTCLICK (AVANT CLIC DROIT)

Cet événement se déclenche juste avant un clic droit sur une cellule :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

WORKBOOK_SHEETCHANGE (À CHAQUE MODIFICATION DE CELLULE)

Cet événement se déclenche à chaque modification du contenu d'une cellule :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

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 :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

Par exemple, coloration de la sélection si A1 est vide :

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

If Range("A1") = "" Then

[Link] = RGB(124, 255, 255) 'Bleu clair

End If

End Sub
Page 87 of 143
WORKBOOK_NEWSHEET (À L'INSERTION D'UNE FEUILLE)

Cet événement se déclenche à chaque insertion d'une nouvelle feuille :

Private Sub Workbook_NewSheet(ByVal Sh As Object)

End Sub

Les événements Worksheet

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.

WORKSHEET_SELECTIONCHANGE (AU CHANGEMENT DE SÉLECTION)

Pour exécuter des instructions en fonction d'un événement pour une feuille en particulier,
sélectionnez la feuille dans l'éditeur, puis Worksheet :

L'événement SelectionChange est ajouté par défaut, il agit lors d'un changement de sélection :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

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 :

WORKSHEET_ACTIVATE (À L'ACTIVATION DE LA FEUILLE)

Cet événement se déclenche lorsque la feuille est activée :

Page 88 of 143
Private Sub Worksheet_Activate()

End Sub

Par exemple, sélection de la cellule D5 à l'activation de la feuille :

Private Sub Worksheet_Activate()

Range("D5").Select

End Sub

WORKSHEET_DEACTIVATE (À LA SORTIE DE LA FEUILLE)

Cet événement se déclenche lorsqu'une autre feuille du classeur est activée :

Private Sub Worksheet_Deactivate()

End Sub

Par exemple, effacement du contenu des cellules B2 à B10 après avoir quitté la feuille :

WORKSHEET_BEFOREDOUBLECLICK (AU DOUBLE-CLIC)

Cet événement se déclenche lors d'un double-clic sur une cellule de la feuille :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub

Par exemple, coloration de la cellule double-cliquée en vert (ou en blanc si elle est déjà colorée)
:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If [Link] = 16777215 Then 'Si blanc

[Link] = RGB(200, 255, 100) 'Couleur verte

Else 'Sinon

[Link] = 16777215 'Couleur blanche

Page 89 of 143
End If

End Sub

Le double-clic peut être annulé en attribuant la valeur True à la variable Cancel.

WORKSHEET_BEFORERIGHTCLICK (AU CLIC DROIT)

Cet événement se déclenche lors d'un clic droit sur la feuille :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

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)

'Si cellule de la colonne 3 (C)

If [Link] = 3 Then

Target = Date 'Ajout de la date du jour

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é).

WORKSHEET_CHANGE (À CHAQUE MODIFICATION DE CELLULE)

Cet événement se déclenche lors de modifications du contenu des cellules de la feuille :

Private Sub Worksheet_Change(ByVal Target As Range)

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 :

Page 90 of 143
[Link] = False 'Désactive les événements

'Instructions ...

[Link] = True 'Réactive les événements

Chapitre 8 : Les Formulaire et contrôle

UserForm

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 :

Page 91 of 143
Si la fenêtre des propriétés n'est pas présente, affichez-la (F4) et commencez par modifier le
nom de l'UserForm (pour mieux s'y retrouver par la suite)

TITRE DE L'USERFORM

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 :

Page 92 of 143
Les propriétés d'un UserForm peuvent également être modifiées à partir d'un code VBA.

LES ÉVÉNEMENTS DE L'USERFORM

Tout comme le classeur ou ses feuilles, l'UserForm a ses propres événements.

Commencez par afficher le code de l'UserForm :

Cliquez ensuite sur UserForm :

Page 93 of 143
Et sélectionnez l'événement UserForm_Initialize qui se déclenche au lancement de l'UserForm
:

Private Sub UserForm_Initialize()

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.

Entrez le nom de l'UserForm suivi d’un. :

La propriété Height est la hauteur et Width la largeur :

Private Sub UserForm_Initialize()

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) :

Private Sub UserForm_Initialize()

[Link] = 250

[Link] = 250

End Sub

Page 94 of 143
Le second événement est déclenché au clic sur l'UserForm :

Private Sub UserForm_Initialize()

[Link] = 250

[Link] = 250

End Sub

Private Sub UserForm_Click()

[Link] = [Link] + 50

[Link] = [Link] + 50

End Sub

Aperçu de l'UserForm (F5) :

LANCER UN USERFORM

Pour lancer un UserForm à partir d'une procédure, utilisez Show :

Sub lancerUserform()

UserForm_Exemple.Show

End Sub

Page 95 of 143
Les contrôles

Boutons, Label et TextBox

Les contrôles sont les éléments (boutons, intitulés, zone de texte, cases à cocher, etc.) qui
peuvent être insérés sur un UserForm (ou sur une feuille Excel). Les contrôles ont également
toute une panoplie de propriétés et d'événements qui diffèrent d'un contrôle à l'autre.

Pour commencer, ajoutez un UserForm et insérez les 3 contrôles suivants : un intitulé Label,
une zone de texte TextBox et un bouton CommandButton :

Modifiez les propriétés de l'UserForm et des contrôles (dont les propriétés (Name) pour le nom,
Caption pour le texte et Font pour la taille du texte) pour obtenir ceci :

Pour positionner les contrôles de manière plus précise qu'avec un déplacement manuel,
modifiez les propriétés Left et Top du contrôle. De même, pour redimensionner les contrôles
de manière plus précise qu'avec un redimensionnement manuel, modifiez les propriétés Width
et Height.

Page 96 of 143
Pour le moment, lorsque l'on entre un nombre et que l'on clique sur le bouton, il ne se passe
rien.

Pour y remédier, nous allons commencer par ajouter un événement pour entrer la valeur de la
zone de texte dans la cellule A1 et fermer l'UserForm.

En double-cliquant sur le bouton, un événement par défaut est ajouté dans le code de
l'UserForm. Dans ce cas, il s'agit de l'événement souhaité, mais en cas de besoin, vous pouvez
sélectionner un autre événement dans la liste :

L'événement Click est déclenché au clic sur le bouton :

Private Sub CommandButton_valider_Click()

'La cellule A1 (de la feuille active) obtient la valeur de la zone de texte nommée
"TextBox_nombre"

Range("A1") = TextBox_nombre.Value

'Fermeture (Unload) de l'UserForm (Me)

Unload Me

End Sub

La valeur est alors entrée dans la cellule A1 avant de fermer l'UserForm.

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 :

Private Sub TextBox_nombre_Change()

If IsNumeric(TextBox_nombre.Value) Then 'Si valeur numérique

Page 97 of 143
TextBox_nombre.BackColor = RGB(255, 255, 255) 'Blanc

Else 'Sinon

TextBox_nombre.BackColor = RGB(247, 205, 201) 'Rouge clair

End If

End Sub

L'événement est déclenché à chaque entrée ou suppression de caractère dans la zone de texte.

Aperçu :

Il nous reste encore à empêcher la validation du formulaire si la valeur n'est pas numérique en
ajoutant une instruction If :

Private Sub CommandButton_valider_Click()

'Si valeur numérique

If IsNumeric(TextBox_nombre.Value) Then

Range("A1") = TextBox_nombre.Value

Unload Me

End If

End Sub

LES CASES À COCHER (CHECKBOX)

Voici un exemple d'utilisation de cases à cocher dont l'objectif est de modifier les valeurs en
colonne B en fonction des cases cochées dans l'UserForm :

Page 98 of 143
L'événement Click du bouton enregistre ici les choix de l'utilisateur et ferme ensuite l'UserForm
:

Private Sub CommandButton_valider_Click()

'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

'Numéro 3

If [Link] = True Then 'Si coché

Page 99 of 143
Range("B4") = "Oui"

Else 'Si décoché

Range("B4") = "Non"

End If

'Fermeture

Unload Me

End Sub

Rappelez-vous qu'une condition cherche toujours à savoir si le résultat du test est True :

If [Link] = True Then 'Si coché

Il n'est donc pas utile d'ajouter = True :

If [Link] Then 'Si coché

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) :

If [Link] Then 'Si coché

L'ajout de .Value est donc facultatif :

If CheckBox1 Then 'Si coché

Suite à ces simplifications, le code ressemble maintenant à ceci :

Private Sub CommandButton_valider_Click()

'Numéro 1

If CheckBox1 Then 'Si coché

Range("B2") = "Oui"

Else 'Si décoché

Range("B2") = "Non"

End If

Page 100 of 143


'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 ...

Dans ce cas, l'utilisation d'une boucle est plus que bienvenue :

Private Sub CommandButton_valider_Click()

Dim i As Integer

'Boucle des cases à cocher

For i = 1 To 3

If Controls("CheckBox" & i) Then 'Si coché

Range("B" & i + 1) = "Oui"

Else 'Si décoché

Page 101 of 143


Range("B" & i + 1) = "Non"

End If

Next

'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 :

Private Sub UserForm_Initialize()

If Range("B2") = "Oui" Then

CheckBox1 = True

End If

If Range("B3") = "Oui" Then

CheckBox2 = True

End If

If Range("B4") = "Oui" Then

CheckBox3 = True

End If

End Sub

Pour simplifier ce code, vous avez la possibilité d'écrire l'instruction If sur une seule ligne et
sans End If lorsqu'il n'y a qu'une seule action à effectuer :

Page 102 of 143


Private Sub UserForm_Initialize()

If Range("B2") = "Oui" Then CheckBox1 = True

If Range("B3") = "Oui" Then CheckBox2 = True

If Range("B4") = "Oui" Then CheckBox3 = True

End Sub

L'utilisation d'une boucle est également possible :

Private Sub UserForm_Initialize()

Dim i As Integer

For i = 1 To 3

If Range("B" & i + 1) = "Oui" Then Controls("CheckBox" & i) = True

Next

End Sub

LES BOUTONS D'OPTION (OPTIONBUTTON)

Contrairement aux cases à cocher, l'utilisateur ne peut choisir qu'un seul bouton d'option par
groupe.

Page 103 of 143


Il faudra séparer ici les boutons d'option en 2 groupes puis enregistrer les résultats dans 2
cellules :

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 :

Page 104 of 143


Répétez ensuite l'opération pour les 4 autres contrôles (en entrant une valeur différente). Vous
pouvez à présent sélectionner une réponse par groupe. 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 :

Private Sub CommandButton_valider_Click()

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) :

Page 105 of 143


Private Sub CommandButton_valider_Click()

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 :

Private Sub CommandButton_valider_Click()

Dim i As Integer, choix1 As Integer, choix2 As Integer

'Question 1

For i = 1 To 4

Page 106 of 143


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

LA LISTE DÉROULANTE (COMBOBOX) ET LA ZONE DE LISTE (LISTBOX)

Voici le point de départ de ce nouvel exemple :

Page 107 of 143


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) :

Private Sub UserForm_Initialize()

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

Page 108 of 143


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.

La propriété ListIndex de la liste déroulante correspond au numéro de la sélection dans la liste


(contrairement à la propriété Value qui correspond à la valeur au format texte).

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 :

nbLignes = Cells(1, colonne).End(xlDown).Row

Grâce à ces informations, il est désormais possible de créer l'événement Change de la liste
déroulante :

Private Sub ComboBox_Pays_Change()

Dim colonne As Integer, nbLignes As Integer

'Zone de liste vidée (sinon les villes sont ajoutées à la suite)

ListBox_villes.Clear

'Numéro de la sélection

colonne = ComboBox_pays.ListIndex + 1

'Si le numéro de colonne = 0 (donc si aucun pays sélectionné) la procédure est quittée

If colonne = 0 Then Exit Sub

'Nombre de lignes de la colonne du pays choisi

nbLignes = Cells(1, colonne).End(xlDown).Row

'Boucle pour ajouter les villes dans la zone de liste

For i = 2 To nbLignes

ListBox_villes.AddItem Cells(i, colonne)

Page 109 of 143


Next

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 :

Private Sub CommandButton_valider_Click()

MsgBox "Ville sélectionnée : " & ListBox_villes '(propriété Value de ListBox_villes)

End Sub

INSERTION SUR UNE FEUILLE

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.

LE BOUTON BASCULE (TOGGLEBUTTON)

Insérez pour commencer un bouton bascule (contrôle ActiveX) à partir de l'onglet Développeur
:

Page 110 of 143


Notez que pour manipuler un contrôle ActiveX sur une feuille, le Mode Création doit être activé
:

Double-cliquez maintenant sur le bouton et modifiez ses propriétés pour obtenir :

L'objectif ici est de masquer la feuille 2 lorsque le bouton est pressé ou de l'afficher dans le cas
contraire.

Page 111 of 143


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 :

Private Sub ToggleButton1_Click()

'Si le bouton est pressé

If ToggleButton1 Then

'Masquer la feuille et modifier le texte du bouton

Sheets("Feuil2").Visible = 2

[Link] = "La feuille 2 est masquée"

'Sinon

Else

'Afficher la feuille et modifier le texte du bouton

Sheets("Feuil2").Visible = -1

[Link] = "La feuille 2 est affichée"

End If

End Sub

Page 112 of 143


EXERCICE PRATIQUE

Il est temps de mettre en pratique l'utilisation des contrôles avec un petit exercice. Le fichier :
controles_exercice.xlsm

Voici le point de départ de l'exercice :

Vous l'aurez compris, l'objectif est de remplir le tableau de la feuille à l'aide du formulaire.

Quelques points à prendre en compte :

➢ Lister les pays en fonction de la liste de la seconde feuille


➢ Vérifier si tous les champs ont été renseignés avant d'ajouter un nouveau contact
➢ Après ajout d'un contact, réinitialiser le formulaire sans le fermer

Voici une solution parmi d'autres pour réaliser cet exercice.

LE BOUTON "FERMER"

Evénement Click du bouton Fermer :

Private Sub CommandButton_fermer_Click()


Page 113 of 143
Unload Me

End Sub

LE CONTENU DE LA LISTE DÉROULANTE

Evénement Initialize de l'UserForm :

Private Sub UserForm_Initialize()

Dim i As Integer

'Boucle pour ajouter les pays dans la liste déroulante

For i = 1 To 231

ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)

Next

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é :

Private Sub CommandButton_ajouter_Click()

'Si formulaire complet

If (OptionButton_1 Or OptionButton_2 Or OptionButton_3) And TextBox_nom <> "" And


TextBox_prenom <> "" And TextBox_adresse <> "" And TextBox_lieu <> "" And
ComboBox_pays.ListIndex >= 0 Then

'Instructions pour insérer le contact ici ...

'Si formulaire incomplet

Else

MsgBox "Formulaire incomplet"

End If

Page 114 of 143


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 :

Private Sub CommandButton_ajouter_Click()

'Coloration des Labels en noir (&H80000012 = couleur de base de la propriété ForeColor)

Label_civilite.ForeColor = &H80000012

Label_nom.ForeColor = &H80000012

Label_prenom.ForeColor = &H80000012

Label_adresse.ForeColor = &H80000012

Label_lieu.ForeColor = &H80000012

Label_pays.ForeColor = &H80000012

'Contrôles des champs

If OptionButton_1 = False And OptionButton_2 = False And OptionButton_3 = False Then


'Si pas de civilité

Label_civilite.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_nom = "" Then 'Si pas de nom

Label_nom.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_prenom = "" Then 'Si pas de prénom

Label_prenom.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_adresse = "" Then 'Si pas d'adresse

Label_adresse.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_lieu = "" Then 'Si pas de lieu

Label_lieu.ForeColor = RGB(255, 0, 0)

ElseIf ComboBox_pays.ListIndex = -1 Then 'Si pas de pays

Label_pays.ForeColor = RGB(255, 0, 0)

Page 115 of 143


Else

'Instructions pour insérer le contact ici ...

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) :

Dim ligne As Integer

'Numéro de ligne de la première cellule vide de la colonne 1 en partant du bas de la feuille

ligne = Cells([Link], 1).End(xlUp).Row + 1

'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

Page 116 of 143


End If

'Insertion des valeurs sur la feuille

Cells(ligne, 2) = TextBox_nom

Cells(ligne, 3) = TextBox_prenom

Cells(ligne, 4) = TextBox_adresse

Cells(ligne, 5) = TextBox_lieu

Cells(ligne, 6) = ComboBox_pays

'Après insertion, réinitialisation du formulaire

OptionButton_1 = False

OptionButton_2 = False

OptionButton_3 = False

TextBox_nom = ""

TextBox_prenom = ""

TextBox_adresse = ""

TextBox_lieu = ""

ComboBox_pays.ListIndex = -1

Dans ce code, le numéro de la ligne d'insertion est obtenu grâce à :

ligne = Cells([Link], 1).End(xlUp).Row + 1

[Link] retourne ici le nombre de ligne de la feuille, Cells([Link], 1) correspond


donc à la dernière cellule de la colonne 1.

En partant de cette dernière cellule et en recherchant vers le haut (xlUp), Excel va retourner le
numéro de ligne de la première cellule non vide de cette colonne (qui sera ici la dernière ligne
complétée du tableau). Et puisque l'on ne recherche pas la dernière ligne complétée du tableau
mais celle juste au-dessous, il faut encore ajouter + 1 à ce numéro.

Même si vous avez un peu de mal avec cette dernière ligne de code, retenez-la bien car elle
pourra vous servir à chaque fois que vous aurez besoin d'insérer une ligne à la suite d'un tableau

Page 117 of 143


(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

'Boucle pour ajouter les pays dans la liste déroulante

For i = 1 To 231

ComboBox_pays.AddItem Sheets("Pays").Cells(i, 1)

Next

End Sub

'Bouton Ajouter

Private Sub CommandButton_ajouter_Click()

'Coloration des Labels en noir (&H80000012 = couleur de base de la propriété ForeColor)

Label_civilite.ForeColor = &H80000012

Label_nom.ForeColor = &H80000012

Label_prenom.ForeColor = &H80000012

Label_adresse.ForeColor = &H80000012

Label_lieu.ForeColor = &H80000012

Label_pays.ForeColor = &H80000012

'Contrôles des champs

If OptionButton_1 = False And OptionButton_2 = False And OptionButton_3 = False Then


'Si pas de civilité

Label_civilite.ForeColor = RGB(255, 0, 0)

Page 118 of 143


ElseIf TextBox_nom = "" Then 'Si pas de nom

Label_nom.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_prenom = "" Then 'Si pas de prénom

Label_prenom.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_adresse = "" Then 'Si pas d'adresse

Label_adresse.ForeColor = RGB(255, 0, 0)

ElseIf TextBox_lieu = "" Then 'Si pas de lieu

Label_lieu.ForeColor = RGB(255, 0, 0)

ElseIf ComboBox_pays.ListIndex = -1 Then 'Si pas de pays

Label_pays.ForeColor = RGB(255, 0, 0)

Else

Dim ligne As Integer

'Numéro de ligne de la première cellule vide de la colonne 1 en partant du bas de la feuille

ligne = Cells([Link], 1).End(xlUp).Row + 1

'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

'Insertion des valeurs sur la feuille

Cells(ligne, 2) = TextBox_nom

Page 119 of 143


Cells(ligne, 3) = TextBox_prenom

Cells(ligne, 4) = TextBox_adresse

Cells(ligne, 5) = TextBox_lieu

Cells(ligne, 6) = ComboBox_pays

'Après insertion, réinitialisation du formulaire

OptionButton_1 = False

OptionButton_2 = False

OptionButton_3 = False

TextBox_nom = ""

TextBox_prenom = ""

TextBox_adresse = ""

TextBox_lieu = ""

ComboBox_pays.ListIndex = -1

End If

End Sub

'Bouton Fermer

Private Sub CommandButton_fermer_Click()

Unload Me

End Sub

Chapitre 9 : Tableaux

Les tableaux permettent de stocker un grand nombre de valeurs contrairement aux variables qui
ne peuvent stocker qu'une seule valeur à la fois. Nous avons effleuré le sujet à la leçon sur les
variables, nous allons maintenant l'approfondir.

Page 120 of 143


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). Rien de tel qu'un exemple pour mieux
comprendre ...

La première feuille contient ici une base de données de 5000 lignes sur 3 colonnes :

La seconde feuille contient une grille où seront comptabilisés les OUI en fonction des années
et des clients :

Page 121 of 143


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 :

Page 122 of 143


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.

DÉCLARATION D'UN TABLEAU

Voici quelques exemples de déclarations

'Exemple de déclaration d'un tableau à 1 dimension

Page 123 of 143


Dim tab1(4)

'Exemple de déclaration d'un tableau à 2 dimensions

Dim tab2(6, 1)

'Exemple de déclaration d'un tableau dynamique

Dim tab3()

Si vous ne pouvez pas entrer de valeurs fixes (parce que cela dépend de la taille de la base de
données par exemple), laissez les parenthèses vides.

Vous n'avez pas besoin de déclarer un type (String, Integer, etc.) car dans bien des cas cela
ralentirait votre procédure.

ENREGISTRER DES DONNÉES DANS UN TABLEAU

Commençons par enregistrer ces quelques données dans un tableau :

Nous voulons enregistrer ici 11 x 1 valeurs, il faudra donc déclarer un tableau à une dimension
:

Dim tableau(10)

Le tableau tableau(10) peut contenir 11 valeurs, car rappelez-vous que la numérotation d'un
tableau commence à 0. Chaque élément du tableau reçoit ensuite sa valeur :

Sub exemple()

Page 124 of 143


Dim tableau(10)

'Enregistrement des valeurs dans le tableau

tableau(0) = Range("A2")

tableau(1) = Range("A3")

tableau(2) = Range("A4")

tableau(3) = Range("A5")

tableau(4) = Range("A6")

tableau(5) = Range("A7")

tableau(6) = Range("A8")

tableau(7) = Range("A9")

tableau(8) = Range("A10")

tableau(9) = Range("A11")

tableau(10) = Range("A12")

End Sub

Mais pour éviter toutes ces répétitions, l'utilisation d'une boucle For est plus que recommandée
:

Sub exemple()

Dim tableau(10), i As Integer

'Enregistrement des valeurs dans le tableau

For i = 0 To 10

tableau(i) = Range("A" & i + 2)

Next

End Sub

Notez que vous pouvez utiliser, modifier chaque élément du tableau individuellement comme
une variable. En voici un exemple avec tableau(3), la 4e valeur du tableau :

Page 125 of 143


Sub exemple()

Dim tableau(10), i As Integer

'Enregistrement des valeurs dans le tableau

For i = 0 To 10

tableau(i) = Range("A" & i + 2)

Next

'Affichage 1

MsgBox tableau(3) 'Renvoie : 08.03.2023

'Modification de l'une des valeurs

tableau(3) = Year(tableau(3))

'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 :

Page 126 of 143


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

'Enregistrement des valeurs dans le tableau

For i = 0 To 10

tableau(i, 0) = Range("A" & i + 2)

tableau(i, 1) = Range("B" & i + 2)

tableau(i, 2) = Range("C" & i + 2)

Next

Et quelques exemples de valeurs :

MsgBox tableau(0, 0) 'Renvoie : 11.03.2026

MsgBox tableau(0, 1) 'Renvoie : 24

MsgBox tableau(9, 2) 'Renvoie : NON

Page 127 of 143


MsgBox tableau(10, 2) 'Renvoie : OUI

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 :

derniereLigne = Cells([Link], 1).End(xlUp).Row

Si vous entrez une variable lors de la déclaration, Excel ne l'acceptera pas. Déclarez un tableau
dynamique (parenthèses vides), puis définissez ses dimensions avec Redim :

Dim tableau()

ReDim tableau(derniereLigne - 2, 2)

De cette manière vous enregistrerez automatiquement toutes les lignes de la base de données
dans le tableau :

Sub exemple()

'Déclarations

Dim tableau(), derniereLigne As Integer, i As Integer

'Dernière ligne de la base de données

Page 128 of 143


derniereLigne = Cells([Link], 1).End(xlUp).Row

'Redimensionnement

ReDim tableau(derniereLigne - 2, 2)

'Enregistrement des valeurs dans le tableau

For i = 0 To derniereLigne - 2

tableau(i, 0) = Range("A" & i + 2)

tableau(i, 1) = Range("B" & i + 2)

tableau(i, 2) = Range("C" & i + 2)

Next

End Sub

UBOUND

Dans l'exemple ci-dessus, le dernier numéro de notre tableau était égal à derniereLigne - 2 :

For i = 0 To derniereLigne - 2

Cette fonction renvoie le plus grand numéro pour une dimension choisie (par défaut la
première). Quelques exemples pour mieux comprendre :

Sub exemple()

Dim tableau(10, 2)

MsgBox UBound(tableau) 'Renvoie : 10

MsgBox UBound(tableau, 1) 'Renvoie : 10

MsgBox UBound(tableau, 2) 'Renvoie : 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"

Page 129 of 143


Dim i As Integer

'Enregistrement des valeurs dans le tableau

For i = 0 To 10

tableau(i, 0) = Range("A" & i + 2)

tableau(i, 1) = Range("B" & i + 2)

tableau(i, 2) = Range("C" & i + 2)

Next

Le code ci-dessus peut être remplacé par :

'Déclaration

Dim tableau()

'Enregistrement des valeurs dans le tableau

tableau = Range("A2:C12")

Même si au premier abord cette seconde méthode semble séduisante, elle peut dans bien des
cas vous faire perdre plus de temps que la première méthode ...

En enregistrant vos données dans le tableau de cette manière, le premier numéro n'est pas 0
mais 1, cela peut être source de confusion. De plus, si au cours du développement vous
choisissez de n'enregistrer dans le tableau que les données répondant à certains critères (ou
effectuer toute autre opération), vous devrez de toute façon passer par une boucle.

ARRAY

Vous aurez peut-être parfois besoin de créer un tableau contenant une liste fixe de valeurs. Une
solution consiste à déclarer le tableau et à entrer les valeurs l'une après l'autre :

Dim tableau(5)

tableau(0) = "SI"

tableau(1) = "RECHERCHEV"

tableau(2) = "SOMME"

tableau(3) = "NB"

Page 130 of 143


tableau(4) = "ESTNUM"

tableau(5) = "STXT"

Une solution bien plus pratique consiste à utiliser la fonction Array qui retourne un tableau de
valeurs :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

SPLIT

La fonction Split permet de diviser une chaîne de caractères en un tableau en fonction d'un
délimiteur défini.

Par exemple, voici une chaîne de caractères :

chaine = "SI, RECHERCHEV, SOMME, NB, ESTNUM, STXT"

Pour convertir cette chaîne de caractères en tableau, utilisez la fonction Split et définissez le
séparateur :

tableau = Split(chaine, ", ")

Le tableau renverra les valeurs suivantes :

MsgBox tableau(0) 'Renvoie : SI

MsgBox tableau(1) 'Renvoie : RECHERCHEV

MsgBox tableau(2) 'Renvoie : SOMME

MsgBox tableau(3) 'Renvoie : NB

MsgBox tableau(4) 'Renvoie : ESTNUM

MsgBox tableau(5) 'Renvoie : STXT

Les 3 tableaux suivants renvoient également les mêmes valeurs :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

tableau = Split("SI/RECHERCHEV/SOMME/NB/ESTNUM/STXT", "/")

tableau = Split("SI RECHERCHEV SOMME NB ESTNUM STXT", " ")

Page 131 of 143


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 :

tableau = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")

MsgBox Join(tableau, " - ") 'Renvoie : SI - RECHERCHEV - SOMME - NB - ESTNUM -


STXT

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.

Pour cet exercice la base de données a été réduite à 1000 lignes.

Objectif de l'exercice : la procédure devra parcourir la base de données en boucle et


comptabiliser pour chaque année et chaque numéro de client le nombre de OUI ou de NON
(selon le choix de l'utilisateur) et entrer ce décompte dans la cellule correspondante.

Page 132 of 143


Complétez la macro suivante avant de passer à la solution :

Sub exercice()

'Dernière ligne de la base de données

'...

'Valeur recherchée (OUI ou NON)

'...

'Déclaration du tableau dynamique

Dim tableau()

'...

'Enregistrement des données dans le tableau

'...

'Décomptes des OUI ou des NON

'...

End Sub

Page 133 of 143


Voici une solution pour réaliser cet exercice (des informations complémentaires sont
disponibles un peu plus bas) :

Sub exercice()

Dim derniereLigne As Integer, valeurRecherchee As String, numero As Integer, compteur


As Integer, ligne As Integer, annee As Integer, client As Integer, i As Integer

'Dernière ligne de la base de données

derniereLigne = Sheets("BD").Cells([Link], 1).End(xlUp).Row

'Valeur recherchée (OUI ou NON)

If Sheets("RES").OptionButton_oui Then

valeurRecherchee = "OUI"

Else

valeurRecherchee = "NON"

End If

'Déclaration du tableau dynamique

Dim tableau()

ReDim tableau(derniereLigne - 2, 1)

'Numéro du premier enregistrement dans le tableau

numero = 0

'Enregistrement des données dans le tableau

For ligne = 2 To derniereLigne

If Sheets("BD").Range("C" & ligne) = valeurRecherchee Then

tableau(numero, 0) = Year(Sheets("BD").Range("A" & ligne)) 'Année de la date

tableau(numero, 1) = Sheets("BD").Range("B" & ligne) 'Numéro de client

numero = numero + 1

End If

Page 134 of 143


Next

'Décomptes de OUI ou de NON

For annee = 2011 To 2026 'Boucle des années

For client = 1 To 30 'Boucle des clients

'Compteur des OUI ou des NON

compteur = 0

For i = 0 To numero - 1

If tableau(i, 0) = annee And tableau(i, 1) = client Then compteur = compteur + 1

Next

'Affichage dans la cellule

Cells(annee - 2009, client + 1) = compteur

Next

Next

End Sub

DERNIÈRE LIGNE

Calcul de la dernière ligne de données de la feuille BD

'Dernière ligne de la base de données

derniereLigne = Sheets("BD").Cells([Link], 1).End(xlUp).Row

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 :

'Valeur recherchée (OUI ou NON)

If Sheets("RES").OptionButton_oui Then

valeurRecherchee = "OUI"

Else

Page 135 of 143


valeurRecherchee = "NON"

End If

DÉCLARATION DU TABLEAU

Dans le cas présent, il aurait été possible de calculer le nombre de OUI ou de NON de la feuille
BD pour redimensionner le tableau dynamique au nombre exact de données qu'il s'apprête à
recevoir.

Mais pour éviter ce calcul supplémentaire, le tableau est simplement redimensionné ici à la
taille de la base de données :

'Déclaration du tableau dynamique

Dim tableau()

ReDim tableau(derniereLigne - 2, 1)

NUMÉRO

La variable numero va permettre de déterminer la position des enregistrements dans le tableau


(et commence à 0) :

'Numéro du premier enregistrement dans le tableau

numero = 0

ENREGISTREMENT DES DONNÉES DANS LE TABLEAU

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 :

'Enregistrement des données dans le tableau

For ligne = 2 To derniereLigne

If Sheets("BD").Range("C" & ligne) = valeurRecherchee Then

tableau(numero, 0) = Year(Sheets("BD").Range("A" & ligne)) 'Année de la date

tableau(numero, 1) = Sheets("BD").Range("B" & ligne) 'Numéro de client

numero = numero + 1

End If

Page 136 of 143


Next

Pour éviter de recalculer de nombreuses fois l'année de chaque date du tableau dans les
prochaines boucles, seule l'année de la date est enregistrée dans le tableau.

Après chaque entrée dans le tableau, la variable numéro est incrémenté de 1 pour la prochaine
entrée.

DÉCOMPTES

La boucle For parcourt ici chaque ligne de données du tableau (de 0 à numero - 1 qui correspond
au numéro de la dernière entrée) et recherche les correspondances pour l'année définie et le
numéro de client défini :

'Compteur des OUI ou des NON

compteur = 0

For i = 0 To numero - 1

If tableau(i, 0) = annee And tableau(i, 1) = client Then compteur = compteur + 1

Next

Le résultat est ensuite inséré dans la cellule correspondant à l'année définie et au numéro de
client défini :

'Affichage dans la cellule

Cells(annee - 2009, client + 1) = compteur

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 :

'Décomptes de OUI ou de NON

For annee = 2011 To 2026 'Boucle des années

For client = 1 To 30 'Boucle des clients

'Compteur des OUI ou des NON

compteur = 0

For i = 0 To numero - 1

Page 137 of 143


If tableau(i, 0) = annee And tableau(i, 1) = client Then compteur = compteur + 1

Next

'Affichage dans la cellule

Cells(annee - 2009, client + 1) = compteur

Next

Next

SCREENUPDATING

Nous ne l'avons pas encore vu jusque-là mais vous pouvez encore ajouter la ligne suivante en
début de procédure pour accélérer l'exécution de la macro :

[Link] = False

En ajoutant cette ligne, vous demandez à Excel de ne pas actualiser l'affichage tant que la
procédure n'est pas terminée.

Dans ce cas, au lieu de voir chaque nombre être ajouté l'un après l'autre dans les cellules, tous
les nombres seront affichés en une fois.

Chapitre 10 : 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 :

Page 138 of 143


Les fonctions sont toutes en anglais ...

Pour s'y retrouver, une liste des fonctions traduites en anglais est disponible sur ce site, en voici
un extrait :

La fonction choisie pour cet exemple est donc [Link].

L'exemple suivant affiche le nombre de cellules vides de la plage A1:D8 dans la boîte de
dialogue :

Sub exemple()

MsgBox [Link](Range("A1:D8"))

Page 139 of 143


End Sub

Créer une fonction personnalisée

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) :

Page 140 of 143


DÉVELOPPER LA FONCTION PERSONNALISÉE

Commencez par créer votre fonction :

Function SI_VERT(celluleCouleur As Range, celluleValeur As Range)

End Function

Les arguments :

➢ celluleCouleur As Range : la cellule dont il faut tester la couleur


➢ celluleValeur As Range : la cellule contenant le montant

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 :

Function SI_VERT(celluleCouleur As Range, celluleValeur As Range)

couleur = Sheets("Feuil1").Range("K1").[Link]

End Function

Mais pour éviter de dépendre d'une cellule, nous allons utiliser ici directement le numéro de la
couleur qui nous intéresse :

Function SI_VERT(celluleCouleur As Range, celluleValeur As Range)

couleur = 5296274 'Vert

End Function

Pour connaître le numéro de couleur de fond d'une cellule, sélectionnez la cellule et exécutez
cette macro :

Sub test()

MsgBox [Link]

End Sub

Page 141 of 143


Il ne reste plus qu'à tester la couleur avec un If :

Function SI_VERT(celluleCouleur As Range, celluleValeur As Range)

[Link]

If [Link] = 5296274 Then 'Si VRAI

SI_VERT = celluleValeur

Else 'Si FAUX

SI_VERT = 0

End If

End Function

La fonction est maintenant prête à l'emploi.

[Link] indique que la fonction est volatile (comme c'est le cas pour la fonction
SI), ce qui signifie qu'elle doit être recalculée à chaque changement de valeur. Par exemple, si
vous modifiez l'un des montants (ou n'importe quelle autre cellule), la fonction est recalculée
est affichera le bon montant.

Page 142 of 143


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()

[Link]

End Sub

Page 143 of 143

Vous aimerez peut-être aussi