0% ont trouvé ce document utile (0 vote)
5 vues81 pages

Cours Vba Bio

Ce document est un support de cours sur la programmation VBA sous Excel, destiné aux étudiants en gestion de niveau V. Il couvre les bases du langage VBA, l'utilisation de l'éditeur de code, la création de macros, ainsi que la manipulation des cellules et des feuilles dans Excel. Les étudiants apprendront à automatiser des tâches, à modifier des propriétés de cellules et à appliquer des mises en forme à l'aide de VBA.

Transféré par

Loic Sibeufe
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)
5 vues81 pages

Cours Vba Bio

Ce document est un support de cours sur la programmation VBA sous Excel, destiné aux étudiants en gestion de niveau V. Il couvre les bases du langage VBA, l'utilisation de l'éditeur de code, la création de macros, ainsi que la manipulation des cellules et des feuilles dans Excel. Les étudiants apprendront à automatiser des tâches, à modifier des propriétés de cellules et à appliquer des mises en forme à l'aide de VBA.

Transféré par

Loic Sibeufe
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

12/01/2023

SUPPORT DE COURS DE:

PROGRAMMATION VB SOUS EXCEL

SPECIALITE: GESTION

NIVEAU: V

BY TCHANQUE TCHAKOUNTIO ARMAND


COURS DE PROGRAMMATION VBA SOUS
EXCEL

INTRODUCTION

Le VBA (Visual Basic for Applications) est un langage proche du Visual Basic qui nécessite
une application hôte pour s'exécuter (Excel dans notre cas). Grâce au VBA nous allons
pouvoir réaliser à peu près tout ce que l'on souhaite avec Excel ...

Mais avant de démarrer, commençons par afficher les outils qui nous seront utiles.

Si vous utilisez une version plus récente d'Excel, cliquez


sur Fichier →Options → Personnaliser le Ruban puis cochez Développeur.

Un nouvel onglet sera ajouté :

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

PREMIER MACRO

Il est possible d'automatiser certaines tâches en toute simplicité grâce à l'enregistreur de


macros.

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

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

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

Ce code correspond aux manipulations enregistrées.

Nous allons nous arrêter quelques instants sur le code généré :

Sub Macro1()
'
' Macro1 Macro
'

'
Columns("A:A").Select
[Link]
Columns("C:C").Select
[Link]
Columns("B:B").Select
[Link] Destination:=Columns("A:A")
Columns("D:D").Select
[Link] Destination:=Columns("C:C")
Columns("C:C").Select
End Sub

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

Sub Macro1()

End Sub

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

Sub manipulationsDesColonnes()

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

'
' Macro1 Macro
'

'

Les commentaires sont très utiles pour s'y retrouver lorsque l'on dispose de beaucoup de code
ou pour ne pas exécuter certaines lignes de code sans pour autant les supprimer.

Sub manipulationsDesColonnes()

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

5
Insérez un bouton en cliquant sur Insérer Bouton (Contrôles de formulaires) :

Tracez votre bouton et sélectionnez ensuite simplement votre macro :

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

6
LES SELECTIONS

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

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

7
End Sub

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

Complétez votre macro avec ceci :

Sub exemple()

'Sélection de la cellule A8
Range("A8").Select

End Sub

Vous pouvez tester cette macro en cliquant sur votre bouton de formulaire, la cellule A8 est
alors sélectionnée.

Nous allons maintenant modifier cette macro pour sélectionner la cellule A8 de la seconde
feuille :

Sub exemple()

'Activation de la feuille 2
Sheets("Feuil2").Activate

'Sélection de la cellule A8
8
Range("A8").Select

End Sub

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

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

9
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

SÉLECTION DE LIGNES

10
Il est possible de sélectionner des lignes entières avec Range ou Rows (Rows étant spécifique
aux lignes) :

Sub exemple()

'Sélection des lignes 2 à 6


Range("2:6").Select

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

Sub exemple()

'Sélection des colonnes B à G


Range("B:G").Select

End Sub
Sub exemple()

'Sélection des colonnes B à G


Columns("B:G").Select

End Sub
LES PROPRIETES

Nous allons maintenant agir sur le contenu et l'apparence des cellules et des feuilles.
Commencez par ouvrir l'éditeur, ajoutez-y un module, copiez la macro ci-dessous et associez-
la à un bouton de formulaire (relisez la page des Sélections en cas de besoin) :

11
Sub proprietes()

'Macro incomplète
Range("A8")

End Sub

Nous voulons effectuer une action sur la cellule A8 avec ce début de macro. Pour afficher la
liste des possibilités que l'on peut associer à l'objet Range, ajoutez un . après Range("A8") :

L'éditeur affiche alors les différentes possibilités ... Pour ce premier exemple, cliquez
sur Value puis appuyez sur la touche Tab pour valider ce choix :

Sub proprietes()

'Macro incomplète
Range("A8").Value

End Sub

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

12
'Traduction :
'La valeur de la cellule A8 est désormais : 48

End Sub

Puis, la valeur Exemple de texte à A8 (le texte doit être mis entre " ") :

Sub proprietes()

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

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


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

End Sub

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

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

'Modifier la taille du texte des cellules A1 à A8


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

End Sub

MISE EN FORME : TEXTE EN GRAS

Sub proprietes()
14
'Mettre en gras les cellules A1 à A8
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 proprietes()

'Mettre en italique les cellules A1 à A8


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

End Sub

MISE EN FORME : TEXTE SOULIGNÉ

Sub proprietes()

'Souligner les cellules A1 à A8


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

End Sub

15
MISE EN FORME : POLICE

Sub proprietes()

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


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

End Sub

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

16
'Ajouter une bordure aux cellules sélectionnées
[Link] = 1

End Sub

MODIFIER LES PROPRIÉTÉS D'UNE FEUILLE

Sub proprietes()

'Masquer une feuille


Sheets("Feuil3").Visible = 2

'Visible = -1 : afficher la feuille

End Sub

MODIFIER LA VALEUR D'UNE CELLULE EN FONCTION D'UNE AUTRE

L'objectif ici est que A7 prenne la valeur de A1, ce qui nous donne :

Sub proprietes()

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

'Ou :

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

End Sub

Ou pour copier par exemple la taille du texte :

Sub proprietes()

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

End Sub

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

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

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

Sheets("Feuil2").Range("A8") n'est donc plus répété. Bien que ce ne soit pas indispensable
dans ce cas, il est également possible de faire de même pour .Font, ce qui nous donnerait :

Sub proprietes()
19
With Sheets("Feuil2").Range("A8")
.[Link] = 3
With .Font
.Bold = True
.Size = 18
.Italic = True
.Name = "Arial"
End With
End With

End Sub

LES COULEURS

Nous allons commencer par attribuer une couleur au texte en A1. Après avoir ajouté Font.,
nous obtenons :

Nous avons 2 possibilités pour définir la couleur : ColorIndex et ses 56 couleurs ou Color qui
nous permettra d'utiliser n'importe quelle couleur.

COLORINDEX

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
20
Ce qui nous donne :

COLOR

Voici un exemple similaire avec Color :

Sub couleurs()

'Couleur du texte en A1 : RGB(50, 200, 100)


Range("A1").[Link] = RGB(50, 200, 100)

End Sub

Pour donner une couleur violette à notre texte, nous pouvons donc rechercher les valeurs RGB
de cette couleur sur la liste de couleurs et entrer :

Sub couleurs()

'Couleur du texte en A1 : RGB(192, 32, 255)


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

End Sub

Ce qui nous donne :

21
CRÉER UNE BORDURE COLORÉE

Nous allons créer une macro qui va ajouter une bordure à la cellule active avec ActiveCell. La
bordure sera rouge et épaisse :

Sub couleurs()

'Epaisseur de la bordure
[Link] = 4

'Couleur de la bordure : rouge


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

End Sub

Aperçu :

COLORER LE FOND DES CELLULES SÉLECTIONNÉES

Sub couleurs()

'Colorer le fond des cellules sélectionnées


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

End Sub

Aperçu :

22
COLORER L'ONGLET D'UNE FEUILLE

Sub couleurs()

'Colorer l'onglet de la feuille "Feuil1"


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

End Sub

Aperçu :

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

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

MsgBox maVariable

MsgBox affiche une valeur dans une boîte de dialogue

LES TYPES DE VARIABLES

24
Quelques exemples avec différents types :

'Exemple : nombre entier


Dim nbEntier As Integer
nbEntier = 12345

'Exemple : nombre à virgule


Dim nbVirgule As Single
nbVirgule = 123.45

'Exemple : texte
Dim varTexte As String
varTexte = "[Link]"

'Exemple : date
Dim varDate As Date
varDate = "09/01/2023"

'Exemple : vrai/faux
Dim varBoolean As Boolean

25
varBoolean = True

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

EXEMPLE PRATIQUE : 1

Nous allons maintenant créer par étapes une macro qui va récupérer le nom dans la cellule
A2, le prénom dans la cellule B2, l'âge dans la cellule C2 et qui va les afficher dans une boîte
de dialogue.

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

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

Sub variables()

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

TAF : Nous allons maintenant chercher à afficher dans la boite de dialogue la ligne du
tableau correspondant au numéro indiqué dans la cellule F5.

Voici l'objectif :

27
LES CONSTANTES

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

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

Sub exemple()

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


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

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

28
Cells(1, 1) = Cells(1, 2) * TAUX_TVA
Cells(2, 1) = Cells(2, 2) * TAUX_TVA
Cells(3, 1) = Cells(3, 2) * TAUX_TVA
Cells(4, 1) = Cells(4, 2) * TAUX_TVA
Cells(5, 1) = Cells(5, 2) * TAUX_TVA

End Sub

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

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

LA PORTEE D’UNE VARIABLE

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

29
'=> Utilisation de var1 possible

End Sub

Sub procedure2()

'=> Utilisation de var1 possible

End Sub

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

Public var1 As Integer

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

LES TABLEAUX

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

Voici quelques exemples de déclarations :

'Exemple de déclaration de variable


Dim var1 As String

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

Et voici comment attribuer des valeurs aux 5 cases de ce tableau :

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"

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"
CREER 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

31
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
MsgBox [Link] & " " & [Link]

End Sub

LES BOITES DE DIQLOGUE

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.

Voici les 3 arguments que nous allons renseigner :

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

• Texte : texte de la boîte de dialogue


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

Sub effacerB2()

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

LES DIFFERENTS BOUTONS DE LA BOITE DE DIALOGUE MSGBOX

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

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

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

LES VALEURS RENVOYEES 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
If MsgBox("Aimez-vous le site Excel-Pratique ?", 36, "Sondage") = vbYes Then
Exit Do 'Si réponse = Oui on sort de la boucle
End If
Loop While True 'Boucle infinie

MsgBox ";-)"

End Sub

34
INPUTBOX

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

Sub exemple()

Dim resultat As String

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

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

End Sub

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

InputBox("Texte ?", "Titre", "Valeur par défaut")

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

La principale instruction est If, voici comment elle fonctionne :

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


'Instructions si vrai

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

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

36
End Sub

Nous allons commencer par ajouter une condition pour vérifier si la valeur de la cellule F5 est
bien numérique avant d'exécuter le code.

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

37
numeroLigne = Range("F5") + 1
nom = Cells(numeroLigne, 1)
prenom = Cells(numeroLigne, 2)
age = Cells(numeroLigne, 3)

'Boîte de dialogue
MsgBox nom & " " & prenom & ", " & age & " ans"

'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

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

LES OPERATEURS

38
Ajoutons maintenant les conditions indiquées un peu plus haut en utilisant And ainsi que les
opérateurs de comparaison détaillés ci-dessus :

Sub exemple()

'Si F5 est numérique


If IsNumeric(Range("F5")) Then

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


numeroLigne = Range("F5") + 1

'Si le numéro est dans la bonne plage


If numeroLigne >= 2 And numeroLigne <= 17 Then
nom = Cells(numeroLigne, 1)
39
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

ELSEIF

lseIf 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 A1 une note de 1 à 6 et en B1 un commentaire en fonction de la


note :

Sub commentaires()

40
'Variables
Dim note As Single, commentaire As String
note = Range("A1")

'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("B1") = commentaire

End Sub

SELECT

Une alternative aux instructions If contenant beaucoup de ElseIf existe, il s'agit


de Select (cette instruction étant plus adaptée dans ce genre de cas).

Voici la même macro avec Select :

Sub commentaires()

'Variables
Dim note As Single, commentaire As String
note = Range("A1")

41
'Commentaire en fonction de la note
Select Case note '<= la valeur à tester (ici, la note)
Case Is = 6
commentaire = "Excellent résultat !"
Case Is >= 5
commentaire = "Bon résultat"
Case Is >= 4
commentaire = "Résultat satisfaisant"
Case Is >= 3
commentaire = "Résultat insatisfaisant"
Case Is >= 2
commentaire = "Mauvais résultat"
Case Is >= 1
commentaire = "Résultat exécrable"
Case Else
commentaire = "Aucun résultat"
End Select

'Commentaire en B1
Range("B1") = commentaire

End Sub

FONCTION ISNUMERIC

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

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


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
42
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")) = 2023 Then 'Si c'est une date de l'année 2023

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


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

Dans cet exemple, la condition est vraie car aucun type ni valeur n'ont été attribués
à maVariable :

Sub exemple()

Dim maVariable

If IsEmpty(maVariable) Then
MsgBox "Ma variable n'a pas été initialisée !"
Else
MsgBox "Ma variable contient : " & maVariable
End If

43
End Sub

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 * peut remplacer : aucun, un ou plusieurs caractères :

maVariable = "Exemple 12345"

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

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 ? peut remplacer un caractère quelconque :

maVariable = "Exemple 12345"

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

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

44
Sub exemple()

Cells(1, 1) = 1
Cells(2, 1) = 2
Cells(3, 1) = 3
Cells(4, 1) = 4
Cells(5, 1) = 5
Cells(6, 1) = 6
Cells(7, 1) = 7
Cells(8, 1) = 8
Cells(9, 1) = 9
Cells(10, 1) = 10
Cells(11, 1) = 11
Cells(12, 1) = 12

End Sub

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

Voici la boucle Do While :

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

Dim numero As Integer

numero = 1 'Numéro de départ

45
Do While numero <= 12 'Tant que la variable numero est <= 12, la boucle est répétée
Cells(numero, 1) = numero 'Numérotation
numero = numero + 1 'Le numéro est augmenté de 1 à chaque boucle
Loop

End Sub

DO LOOP

Dans le précédent exemple, vous avez pu voir la boucle Do sous la forme suivante :

Sub exemple()

Do While [CONDITION]
'Instructions
Loop

End Sub

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

Sub exemple()

Do
'Instructions
Loop While [CONDITION]

End Sub

Plutôt que de répéter la boucle tant que la condition est vraie, il est possible de quitter la
boucle lorsque la condition est vraie en remplaçant While par Until :

Sub exemple()

Do Until [CONDITION]
'Instructions
Loop

End Sub

46
FOR NEXT

Sub exemple()

Dim i As Integer

For i = 1 To 5
'Instructions
Next

End Sub

La boucle For est répétée ici 5 fois.

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 :

Sub exemple()

Dim feuille As Worksheet

For Each feuille In Worksheets


MsgBox [Link]
Next

End Sub

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

Dim i As Integer

'Boucle pour 100 lignes au maximum


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

48
Next

End Sub

LES FONCTIONS ET LES PROCEDURES

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

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

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

LES ARGUMENTS

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

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

Private Sub avertissement(texte As String)

MsgBox "Attention : " & texte & " !"

End Sub

Sub exemple()

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


avertissement "cellule vide"
ElseIf Not IsNumeric(Range("A1")) Then 'Si A1 est non numérique
avertissement "valeur non numérique"
End If

End Sub

50
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


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

51
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

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

52
MsgBox nom & " " & prenom & ", " & age & " ans"
End If

End If

End Sub

LES FONCTIONS

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

En voici un exemple simple :

Function carre(nombre As Double)

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

End Function

Sub exemple()

Dim resultat As Double

resultat = carre(9.876) '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

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

UTILISATION DES TABLEAUX

LES TABLEAUX

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

53
INTERET DES TABLEAUX

Imaginez que dans une procédure vous ayez besoin de stocker 500 valeurs. S'il fallait créer
500 variables pour stocker toutes ces valeurs, cela deviendrait vite très compliqué, tandis
qu'avec un tableau, le stockage et l'utilisation de ces valeurs seront grandement simplifiés.

Le second intérêt est la vitesse d'exécution (parcourir un tableau de données est infiniment
plus rapide que de parcourir une plage de cellules équivalente).

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

DECLARATION D’UN TABLEAU


Voici quelques exemples de déclarations

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


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()
ENREGISTRER DES DONNEES DANS UN TABLEAU
Commençons par enregistrer ces quelques données dans un tableau :

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

Dim tableau(10)

Le tableau tableau(10) peut contenir 11 valeurs, car rappelez-vous que la numérotation d'un
tableau commence à 0.

Chaque élément du tableau reçoit ensuite sa valeur :

Sub exemple()

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

55
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

LES TABLEAUX A DEUX DIMENSIONS

Pour enregistrer plusieurs colonnes de données, une dimension supplémentaire est nécessaire.

En voici un exemple :

56
• Enregistrement des données dans un tableau à 2 dimensions :

'Déclarations

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)

NextTABLEAUX DYNAMIQUES

Imaginons que cette même base de données soit régulièrement mise à jour et que l'on ne
puisse donc pas entrer de valeurs fixes à la déclaration ... Dans ce cas, le tableau dynamique
sera bien utile.

• 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

57
'Dernière ligne de la base de données
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

Une solution pour connaître ce numéro (si cette information n'est pas déjà disponible) consiste
à utiliser la fonction Ubound :

For i = 0 To UBound(tableau)

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

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.

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

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"
tableau(4) = "ESTNUM"
tableau(5) = "STXT"

59
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", " ")
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

60
LES FORMULAIRES : 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 :

TITRE DE L'USERFORM

Pour modifier le titre de l'UserForm, modifiez sa propriété Caption :

61
DIMENSIONS DE L'USERFORM

Pour modifier les dimensions de l'UserForm, modifiez ses propriétés Width et Height ou
redimensionnez l'UserForm à la main :

LES CONTROLES

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

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

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

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

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

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

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

63
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


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

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

65
'Numéro 3
If [Link] = True Then 'Si coché
Range("B4") = "Oui"
Else 'Si décoché
Range("B4") = "Non"
End If

'Fermeture
Unload Me

End Sub

Maintenant, imaginez que vous n'ayez pas 3 mais 30 cases à cocher ... Dans ce cas,
l'utilisation d'une boucle est plus que bienvenue :

Private Sub CommandButton_valider_Click()

Dim i As Integer

'Boucle des cases à cocher


For i = 1 To 30
If Controls("CheckBox" & i) Then 'Si coché
Range("B" & i + 1) = "Oui"
Else 'Si décoché
Range("B" & i + 1) = "Non"
End If
Next

'Fermeture
Unload Me

End Sub
LES BOUTONS D'OPTION (OPTIONBUTTON)

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

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

66
La première étape consiste à créer les groupes de boutons (car pour le moment vous ne
pouvez sélectionner qu'une seule réponse parmi les 8 réponses).

Pour faire cela, sélectionnez les 4 premiers contrôles et entrez une valeur dans la
propriété GroupName :

67
Répétez ensuite l'opération pour les 4 autres contrôles (en entrant une valeur différente).

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

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

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

68
Au lancement de l'UserForm, nous voulons que les 4 pays soient chargés dans la liste
déroulante (à l'aide de la méthode AddItem) :

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

69
Au changement de sélection dans la liste déroulante, la liste des villes correspondant au pays
choisi doit ensuite être affichée dans la zone de liste.

Pour faire cela, nous avons besoin de connaître le numéro de colonne ainsi que le nombre de
villes de cette colonne.

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

End Sub
70
Il ne reste ensuite plus qu'à ajouter un événement au clic sur le bouton Valider pour traiter
cette information. Dans ce cas, un simple affichage de la sélection dans une boîte de dialogue
:

Private Sub CommandButton_valider_Click()

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

End Sub

LES EVENNEMENT WORKBOOK

LES EVENEMENTS

Jusque-là, nous avons lancé nos macros en cliquant sur un bouton. Il est également possible
de les exécuter automatiquement lors d'un événement particulier du classeur, tel que
l'ouverture du classeur, sa fermeture, son enregistrement, etc.

WORKBOOK_OPEN (À L'OUVERTURE)

Pour exécuter des instructions à l'ouverture du classeur (après l'activation des macros par
l'utilisateur), rendez-vous dans ThisWorkbook et sélectionnez Workbook :

71
L'événement Workbook_Open est ajouté par défaut, il agit à l'ouverture du classeur :

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

Private Sub Workbook_BeforeClose(Cancel As Boolean)

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

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
WORKBOOK_BEFOREPRINT (AVANT IMPRESSION)

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

Private Sub Workbook_BeforePrint(Cancel As Boolean)

End Sub

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

LES EVENNEMENT 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 :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Static selectionPrecedente As String

'Suppression de la couleur de fond de la sélection précédente


If selectionPrecedente <> "" Then
Range(selectionPrecedente).[Link] = xlColorIndexNone

74
End If

'Coloration de la sélection actuelle


[Link] = RGB(181, 244, 0)

'Enregistrement de l'adresse de la sélection actuelle


selectionPrecedente = [Link]

End Sub

WORKSHEET_ACTIVATE (À L'ACTIVATION DE LA FEUILLE)

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

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 :

Private Sub Worksheet_Deactivate()

Range("B2:B10").ClearContents

75
End Sub

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

76
Cancel = True 'Annulation du clic droit
End If

End Sub

Le clic droit peut être annulé en attribuant la valeur True à la variable Cancel (dans ce cas, le
menu contextuel ne sera pas affiché).

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 :

[Link] = False 'Désactive les événements

'Instructions ...

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

LES FONCTION EN VBA

Vous trouverez sur cette page les fonctions VBA les plus utilisées, expliquées à l'aide d'un exemple
simple.

BOÎTES DE DIALOGUE

InputBox Affiche une boîte de dialogue invitant l'utilisateur à entrer du texte.

77
MsgBox Affiche une boîte de dialogue invitant l'utilisateur à cliquer sur un bouton.

DATES ET HEURES

CDate Convertit une valeur en date.

Date Renvoie la date actuelle.

DateAdd Ajoute l'intervalle de temps spécifié à une date.

Renvoie un nombre entier correspondant au nombre d'intervalles de temps spécifié entre 2


DateDiff
dates.

DatePart Renvoie un nombre entier correspondant à une donnée d'une date.

DateSerial Renvoie une date en fonction d'une année, d'un mois et d'un jour.

DateValue Convertit une chaîne de caractères en date.

Day Renvoie un nombre entier correspondant au jour d'une date.

Format Renvoie une chaîne de caractères en fonction d'une date ou d'un nombre dans le format spécifié.

Hour Renvoie un nombre entier correspondant à l'heure d'une date ou d'une heure.

Renvoie True si la valeur est une date (ou peut être convertie en date) ou False si ce n'est pas le
IsDate
cas.

Minute Renvoie un nombre entier correspondant aux minutes d'une date ou d'une heure.

Month Renvoie un nombre entier correspondant au mois d'une date.

MonthName Renvoie le nom du mois en fonction du numéro du mois.

Now Renvoie la date et l'heure actuelle.

Second Renvoie un nombre entier correspondant aux secondes d'une date ou d'une heure.

Time Renvoie l'heure actuelle du système.

Timer Renvoie le nombre de secondes écoulées depuis minuit.

TimeSerial Renvoie une heure en fonction d'une heure, de minutes et de secondes.

TimeValue Convertit une chaîne de caractères en heure.

78
Weekday Renvoie le numéro du jour de la semaine en fonction d'une date.

WeekdayName Renvoie le nom du jour en fonction du numéro du jour de la semaine.

Year Renvoie un nombre entier correspondant à l'année d'une date.

NOMBRES ET MATH

Abs Renvoie la valeur absolue d'un nombre.

CInt / CLng Convertit une valeur numérique en nombre entier en arrondissant à l'entier le plus proche.

CSng / CDbl Convertit une valeur numérique en nombre à virgule.

Int / Fix Renvoie la partie entière d'un nombre.

RGB Renvoie un nombre entier correspondant à une couleur au format RGB.

Rnd Renvoie un nombre aléatoire inférieur à 1 et supérieur ou égal à 0.

Round Arrondit un nombre en fonction du nombre de décimales spécifié.

Val Renvoie les nombres contenus dans une chaîne de caractères.

TABLEAUX

Array Renvoie un tableau contenant les valeurs passées en arguments.

Choose Renvoie une valeur de sa liste d'arguments en fonction d'un numéro.

Join Regroupe les valeurs d'un tableau en une chaîne de caractères, en définissant ou non un délimiteur.

Split Divise une chaîne de caractères en fonction d'un délimiteur pour obtenir un tableau de valeurs.

UBound Renvoie le plus grand indice disponible pour la dimension spécifiée d'un tableau.

TESTS ET CONDITIONS

IIf Renvoie l'une des 2 valeurs passées en argument en fonction d'une condition.

IsArray Renvoie True si la variable pointe vers un tableau ou False si ce n'est pas le cas.

79
IsDate Renvoie True si la valeur est une date (ou peut être convertie en date) ou False si ce n'est pas le cas.

IsEmpty Renvoie False si la variable a été initialisée ou True si ce n'est pas le cas.

IsMissing Renvoie False si l'argument optionnel a été renseigné ou True si ce n'est pas le cas.

IsNumeric Renvoie True si la valeur peut être considérée comme un nombre ou False si ce n'est pas le cas.

Switch Renvoie la valeur correspondant à la première expression qui retourne True.

VarType Renvoie un nombre entier correspondant au type de la variable.

TEXTE

Asc Renvoie le nombre entier correspondant à un caractère.

Chr Renvoie le caractère correspondant au nombre entier passé en argument

Format Renvoie une chaîne de caractères en fonction d'une date ou d'un nombre dans le format spécifié.

InStr Renvoie un nombre entier correspondant à la position d'une valeur dans une chaîne de caractères.

Renvoie un nombre entier correspondant à la position d'une valeur dans une chaîne de caractères en
InStrRev
commençant par la droite.

LCase Convertit une chaîne de caractères en minuscules.

Left Renvoie le nombre de caractères spécifié d'une chaîne de caractères depuis la gauche.

Len Renvoie le nombre de caractères d'une chaîne de caractères.

Renvoie le nombre de caractères spécifié d'une chaîne de caractères en commençant par le numéro
Mid
de caractère défini.

Renvoie une chaîne de caractères après avoir remplacé la ou les sous-chaînes correspondant à la
Replace
valeur recherchée.

Right Renvoie le nombre de caractères spécifié d'une chaîne de caractères depuis la droite.

StrReverse Renvoie une chaîne de caractères après avoir inversé l'ordre des caractères.

Renvoie une chaîne de caractères après avoir supprimé les espaces à gauche et à droite de la chaîne
Trim
de caractères.

UCase Convertit une chaîne de caractères en majuscules.

80

Vous aimerez peut-être aussi