Vous êtes sur la page 1sur 50

Corrigés des exercices

Chapitre 2

1. Résultats du programme calcul3()

La figure 14.1 donne le déroulement de l’exécution du programme calcul3().

Étape 1 Étape 2 Étape 3 Étape 4


x 40 x 40 x 51 x 51
y 8 y 8 y 6 y 6
z z 32 z 32 z 45
x=40 z=x-y x=x+11 z=x-y
y=8 y=y-2

Figure 14.1 • Les 4 étapes.

À l’étape 2, la variable z prend la valeur 32. À l’étape 4, la variable z prend la valeur 45.

2. Résultats du programme calcul4()

Six variables sont définies par le programme calcul4() : x, y, z, x1, y1 et z1. Elles sont
toutes de type Double. Le déroulement de l’exécution du programme est le suivant :
1. x = 2/3 : 2/3 est calculé, puis sa valeur 0.666666666666667 est affectée à x. Le résultat
est donné avec 15 décimales.
2. y = 4/7 : 4/7 est calculé, puis affecté à y. La variable y vaut alors 0.571428571428571.
3. z = x + y : la somme x + y est tout d’abord calculée. Elle vaut 1.23809523809524.
La variable z prend alors cette valeur.
4. x1 = Round(x, 2) : cette affectation utilise la fonction Round(x, nb). Celle-ci calcule
la valeur arrondie de x avec nb décimales, soit 2 décimales. Elle fournit comme
résultat 0.67 et x1 prend la valeur 0.67.
5. y1 = Round(y, 2) : de la même façon, la fonction Round(y, 2) calcule la valeur
arrondie de y avec 2 décimales. La variable y1 vaut alors 0.57.

Livre 7608-VBA.indb 1 07/08/12 07:05


2 ◆ Introduction à la programmation avec VBA

6. z1 = x1 + y1 : z1 vaut la somme 0.67 + 0.57, c’est-à-dire 1.24 qui est le résultat calculé
par le programme.

3. Extraction des chiffres d’un nombre


Le tirage au hasard d’un nombre compris entre 1000 et 9999 est obtenu en utilisant la
fonction Int(9000 * Rnd() + 1000) et en affectant ce résultat à la variable étudiée. Pour
obtenir le chiffre de l’unité, puis celui de la dizaine, puis celui de la centaine et enfin
celui du millier, il faut effectuer des divisions entières à l’aide des opérateurs \ et Mod.
Voici le texte du programme. Il utilise les variables val (valeur du nombre à étudier),
nbu (valeur de l’unité), nbd (valeur de la dizaine), nbc (valeur de la centaine), nbm
(valeur du millier) et les variables x et y comme variables auxiliaires.

Listing 14.1 : chiffres4()


Sub chiffres4()

Dim val As Integer, x As Integer, y As Integer

Dim nbu As Integer, nbd As Integer, nbc As Integer, nbm As Integer

Randomize

val = Int(9000 * Rnd() + 1000) 'nb compris entre 1000 et 9999

nbu = val Mod 10

x = val \ 10

nbd = x Mod 10

y = x \ 10

nbc = y Mod 10

nbm = y \ 10

MsgBox val & " : " & nbu & " " & nbd & " " & nbc & " " & nbm

End Sub

Chapitre 3
1. Prénom, année de naissance et âge
Le programme prenom_age() est défini avec trois variables :
• prenom de type String : la valeur est donnée par l’utilisateur.
• annee de type Integer : la valeur est aussi donnée par l’utilisateur.
• age de type Integer : la valeur est calculée par le programme.
Si l’on veut qu’il affiche comme résultat "Alexandre tu as 23 ans. Bonne chance!",
il faut que la chaîne de caractères à afficher grâce à l’instruction MsgBox soit structurée
de la façon suivante :

prenom & " tu as " & age & " ans. Bonne chance!"

La chaîne est constituée de la valeur de la variable prenom, puis de la chaîne " tu as ",
puis de la valeur de la variable age, et enfin de la chaîne " ans. Bonne chance!". Notez
que les deux chaînes contiennent des espaces de façon que les mots de la chaîne finale
soient séparés les uns des autres.

Livre 7608-VBA.indb 2 07/08/12 07:05


Corrigés des exercices ◆ 3

Voici le texte du programme.

Listing 14.2 : prenom_age()


Sub prenom_age()

Dim prenom As String

Dim annee As Integer, age As Integer

prenom = InputBox("quel est ton prénom ?")

annee = InputBox("quelle est ton année de naissance ?")

age = 2012 - annee

MsgBox prenom & " tu as " & age & " ans. Bonne chance!"

End Sub

Si l’on veut que le résultat soit affiché sur deux lignes au sein de la boîte de dialogue,
il faut introduire le caractère spécial vbCr de la façon suivante :

MsgBox prenom & " tu as " & age & " ans." & vbCr & "Bonne chance!"

2. Numéro de Sécurité sociale


Soit ch la variable qui enregistre le numéro de Sécurité sociale donnée par l’utili-
sateur, et soit les variables sexe, annee, mois, departement, numero_registre et cle les
variables de type String qui vont servir à mémoriser les diverses informations issues
du numéro de Sécurité sociale.
Tout numéro de Sécurité sociale se présente comme l’indique la figure 14.2.

N° SS 1 78 07 64 386 097 52

Positions 1 3 6 9 12 20

Figure 14.2 • Structure d’un numéro de Sécurité sociale.

Pour extraire chaque information du numéro de Sécurité sociale, il faut employer


plusieurs fois la fonction Mid(ch, d, n) qui extrait n caractères de la chaîne ch à partir
de la position d. Les caractères étant numérotés à partir de 1, les nombres 1, 3, 6, 9, 12
et 20 donnent les positions des débuts de chaque partie à considérer.
Le programme est donc le suivant.

Listing 14.3 : numero_SS()


Sub numero_SS()

Dim ch As String

Dim sexe As String, annee As String, mois As String

Dim departement As String, numero_registre As String

Dim cle As String

ch = InputBox("Numéro de Sécurité Sociale " & vbCr _
• & "(avec un espace entre chaque élément) ?")

sexe = Mid(ch, 1, 1)

Livre 7608-VBA.indb 3 07/08/12 07:05


4 ◆ Introduction à la programmation avec VBA


annee = Mid(ch, 3, 2)

mois = Mid(ch, 6, 2)

departement = Mid(ch, 9, 2)

numero_registre = Mid(ch, 12, 7)

cle = Mid(ch, 20, 2)

MsgBox "Sexe : " & sexe & vbCr _
• & "Annee : " & annee & vbCr _
• & "Mois : " & mois & vbCr _
• & "Département : " & departement & vbCr _
• & "Numéro registre : " & numero_registre & vbCr _
• & "Clé : " & cle

End Sub

3. Calculs concernant un emprunt


Soit les variables suivantes :
• montant : le montant de l’emprunt.
• taux  : le taux d’intérêt annuel ; d’où la variable t définie par t = taux / 12 qui
donne le taux mensuel.
• nb_annees : durée de l’emprunt ; d’où la variable nb définie par nb = nb_annees * 12
qui donne le nombre de mois de la durée de l’emprunt.
• mensualite : mensualité à payer.
Le calcul de la mensualité est donné par la formule :

mensualite = (montant * t) / (1 - (1 + t) ^ -nb)

Le programme emprunt() effectue les trois calculs demandés :


a. calcul de la mensualité ;
b. calcul de la valeur cible : montant emprunté ;
c. calcul de la valeur cible : nombre de mois.
Les deux derniers calculs sont faits en reformulant la formule initiale :

new_montant = (new_mensualite * (1 - (1 + t) ^ -nb)) / t

new_nbmois = (-Log(1 - (montant * t / new_mensualite))) / Log(1 + t)

Listing 14.4 : emprunt()


Sub emprunt()

Dim montant As Double, new_montant As Double

Dim taux As Double, t As Double

Dim mensualite As Double, new_mensualite As Double

Dim nb_annees As Integer

Dim nb As Integer, new_nbmois As Double
• '--- Calcul mensualité ---

montant = InputBox("Montant de l'emprunt ?")

taux = InputBox("Taux d'intérêt annuel (exemple : 5,5) ?")

taux = taux / 100

Livre 7608-VBA.indb 4 07/08/12 07:05


Corrigés des exercices ◆ 5


nb_annees = InputBox("Durée de l'emprunt (nb années) ?")

t = taux / 12

nb = nb_annees * 12

mensualite = (montant * t) / (1 - (1 + t) ^ -nb)

MsgBox Round(mensualite, 2)
• '--- Valeur cible = montant emprunté ---

new_mensualite = InputBox("Quelle mensualité souhaitez-vous ? ")

new_montant = (new_mensualite * (1 - (1 + t) ^ -nb)) / t

MsgBox Round(new_montant, 2)
• '--- Valeur cible = nombre de mois ---

new_mensualite = InputBox("Quelle mensualité maximale souhaitez-vous ? ")

new_nbmois = (-Log(1 - (montant * t / new_mensualite))) / Log(1 + t)

MsgBox Round(new_nbmois, 2)

End Sub

Chapitre 4
Équation du second degré
L’équation du second degré ax2 + bx + c = 0 est définie avec les coefficients numériques
a, b et c, le coefficient a devant être différent de 0. Les valeurs des racines dépendent
de la valeur du discriminant b2 – 4 × a × c.
Soit discrim la variable qui donne la valeur du discriminant. Trois cas sont à distinguer
pour calculer les racines de l’équation :
• Si la valeur de discrim est positive, les racines sont données par les valeurs de r1
et r2.
• Si la valeur de discrim est nulle, les deux racines sont égales.
• Si la valeur de discrim est négative, il n’y a pas de racines réelles.
Avant l’étude de ces trois cas, il convient de vérifier si le coefficient a est bien différent
de 0.
Le programme est structuré par une instruction conditionnelle imbriquée qui examine
tous les cas présentés ci-dessus.

Listing 14.5 : eq2degre()


Sub eq2degre()

Dim a As Double, b As Double, c As Double

Dim discrim As Double, r1 As Double, r2 As Double

a = InputBox("donne la valeur du coef a : ")

b = InputBox("donne la valeur du coef b : ")

c = InputBox("donne la valeur du coef c : ")

discrim = b * b - 4 * a * c

If a = 0 Then
• MsgBox "a=0 : calcul impossible!"

ElseIf discrim > 0 Then
• r1 = (-b - Sqr(discrim)) / (2 * a)
• r2 = (-b + Sqr(discrim)) / (2 * a)
• MsgBox "r1=" & r1 & " " & "r2=" & r2

Livre 7608-VBA.indb 5 07/08/12 07:05


6 ◆ Introduction à la programmation avec VBA


ElseIf discrim = 0 Then
• r1 = -b / (2 * a)
• r2 = r1
• MsgBox "r1=r2=" & r1

Else
• MsgBox "Pas de racines réelles"

End If

End Sub

Exemples : si a = 1, b = –6.2 et c = 9.25, les racines valent r1 = 2.5 et r2 = 3.7 ; si a = 1,
b = –13 et c = 42.25, le discriminant est nul et r1 = r2 = 6.5.

2. Deux nombres sont-ils proches ?


Soit x et y deux variables dont les valeurs sont des nombres aléatoires donnés par
la fonction Int(500 * Rnd() + 1), et soit seuil la variable dont la valeur positive est
donnée par l’utilisateur à l’aide de l’instruction InputBox.
Pour résoudre le problème, il faut tout d’abord calculer la valeur absolue de la différence
x – y. Soit diff la variable qui reçoit la valeur x – y. Si da différence est négative, il suffit
d’attribuer la valeur –diff à la variable diff en écrivant If diff < 0 Then diff = –diff.
Cette instruction If…Then…(sans Else) rend alors positive la valeur de la différence,
donnant ainsi la valeur absolue (la valeur absolue d’un nombre est toujours positive).
La comparaison peut ensuite être faite entre cette valeur positive et la valeur du seuil
à l’aide d’une instruction conditionnelle If …Then…Else…End If.
Le programme nbsproches() fournit alors les résultats.

Listing 14.6 : nbs proches()


Sub nbsproches()

Dim x As Integer, y As Integer

Dim seuil As Integer, diff As Integer

Randomize

x = Int(500 * Rnd() + 1) 'de 1 à 500

y = Int(500 * Rnd() + 1)

seuil = InputBox("valeur du seuil positive : ")

diff = x - y

If diff < 0 Then diff = -diff

If diff < seuil Then
• MsgBox "OK " & x & " et " & y & " sont proches"

Else
• MsgBox "NON " & x & " et " & y & " ne sont pas proches"

End If

End Sub

Exemple : si x vaut 102 et y vaut 341, et si l’utilisateur donne 200 comme valeur de la
variable seuil, les deux nombres x et y sont proches car la variable diff vaut +139,
valeur inférieure à 200.

Livre 7608-VBA.indb 6 07/08/12 07:05


Corrigés des exercices ◆ 7

3. Une loterie de 1 à 500


Soit nb la variable dont la valeur est tirée au hasard par la fonction Int(500 * Rnd() + 1)
qui donne un résultat compris entre 1 et 500.
Quatre cas sont à distinguer selon les valeurs de la variable nb :
• de 1 à 200 : gain de 10 € ;
• 201 ou 202 : gain de 1 000 € ;
• de 203 à 400 : gain de 20 € ;
• de 401 à 500 : gain de 15 €.
Plusieurs formulations sont possibles pour examiner ces quatre cas. Nous en avons
choisi deux. La première est définie avec une succession d’instructions If…Then… (sans
Else). La seconde est structurée par l’instruction Select Case…
Voici le premier programme.

Listing 14.7 : loterie1()


Sub loterie1()

Dim nb As Integer, gain As Integer

Randomize

nb = Int(500 * Rnd() + 1)

If nb >= 1 And nb <= 200 Then gain = 10

If nb = 201 Or nb = 202 Then gain = 1000

If nb >= 203 And nb <= 400 Then gain = 20

If nb >= 401 Then gain = 15

MsgBox "Vous avez gagné " & gain & "€ car nb = " & nb

End Sub

Voici le second programme défini avec l’instruction Select Case...

Listing 14.8 : loterie2()


Sub loterie2()

Dim nb As Integer, gain As Integer

Randomize

nb = Int(500 * Rnd() + 1)

Select Case nb

Case 1 To 200
• gain = 10

Case 201, 202
• gain = 1000

Case 203 To 400
• gain = 20

Case 401 To 500
• gain = 15

End Select

MsgBox "Vous avez gagné " & gain & "€ car nb = " & nb

End Sub

Livre 7608-VBA.indb 7 07/08/12 07:05


8 ◆ Introduction à la programmation avec VBA

Notez les deux formulations lorsque le programme examine si la variable nb vaut 201
ou 202 :
• L’instruction conditionnelle définit la condition avec l’opérateur logique Or :

If nb = 201 Or nb = 202 Then gain = 1000

• L’instruction Select Case… donne les deux valeurs possibles en les énumérant :

Case 201, 202
• gain = 1000

Chapitre 5
1. Somme et moyenne de plusieurs nombres
Le programme est construit avec quatre variables : x reçoit la valeur du nombre donné
par l’utilisateur, som permet de calculer la somme des nombres x, nb permet de compter
le nombre des nombres donnés par l’utilisateur, et moy donne la moyenne de ces
nombres.
Le texte du programme est le suivant.

Listing 14.9 : somme_nbpos()


Sub somme_nbspos()

Dim x As Double, som As Double, moy As Double

Dim nb As Integer

som = 0

nb = 0

x = InputBox("Donnez un nombre positif :" & vbCr _
• & "Pour arrêter le processus , tapez -1")

While x <> -1
• som = som + x
• nb = nb + 1
• x = InputBox("Donnez un nombre positif :" & vbCr _
• & "Pour arrêter le processus , tapez -1")

Wend

If nb > 0 Then
• moy = som / nb
• MsgBox "somme = " & som & vbCr _
• & "moyenne = " & moy

Else
• MsgBox "aucun nombre positif!"

End If

End Sub

Le programme est structuré par l’instruction While…Wend avec la condition x <> –1.


Lorsque x vaut –1, l’instruction itérative arrête son exécution, sans que cette valeur
de –1 soit prise en compte dans le calcul de la somme des nombres.

Livre 7608-VBA.indb 8 07/08/12 07:05


Corrigés des exercices ◆ 9

2. Calcul de Un
Pour calculer Un = a × Un – 1 + b × Un – 2 à partir des valeurs de a, b, U0, U1 et n données
par l’utilisateur, plusieurs variables sont nécessaires :
• Les variables a, b et n enregistrent les valeurs données au clavier.
• Les variables U0 et U1 mémorisent les deux valeurs initiales U0 et U1 données par
l’utilisateur.
• Les variables U, V et W vont effectuer le calcul demandé lors de l’exécution de
l’affectation : U = a * V + b * W.
Le texte du programme utilise aussi la variable i pour compter le nombre de répétitions
effectuées. Voici le code de ce programme.

Listing 14.10 : calcul_Un()


Sub calcul_Un()

Dim a As Double, b As Double

Dim U0 As Double, U1 As Double

Dim U As Double, V As Double, W As Double

Dim n As Integer, i As Integer

a = InputBox("donne la valeur de a : ")

b = InputBox("donne la valeur de b : ")

U0 = InputBox("donne la valeur de U0 : ")

U1 = InputBox("donne la valeur de U1 : ")

n = InputBox("donne la valeur de n : ")

W = U0

V = U1

For i = 2 To n
• U = a * V + b * W
• W = V
• V = U

Next i

MsgBox "Un vaut " & U

End Sub

Lorsque i vaut 2, la variable U prend la valeur de a × U1 + b × U0 puisque V vaut U1


(c’est-à-dire U1) et que W vaut U0 (c’est-à-dire U0). La valeur de U est donc la valeur
U2. Puis W prend la valeur de V, c’est-à-dire U1, et V prend la valeur de U, c’est-à-dire
U2. Au tour suivant, U va donc prendre la valeur de a × U2 + b × U1, qui est la valeur
de U3. Le même processus reproduit plusieurs fois permet de calculer de proche en
proche la valeur Un pour n donné par l’utilisateur.

3. Calcul de la valeur actuelle nette


La formule financière qui donne la valeur actuelle nette (VAN) à la date 0 est la
suivante :
∑ Fi (1 + t) –i – I

Livre 7608-VBA.indb 9 07/08/12 07:05


10 ◆ Introduction à la programmation avec VBA

Elle définit une somme pour i allant de 1 à nb_annees, en mettant en jeu les éléments
suivants :
• Fi définit le flux net de trésorerie de la période i : la variable flux représentera ces
quantités au sein du programme.
• t est le taux d’actualisation : la variable taux donnera sa valeur au sein de la somme
à calculer.
• I est le montant de l’investissement initial : la variable invest_init donnera sa
valeur initiale.
Voici le texte du programme qui calcule la VAN selon cette formule.

Listing 14.11 : VAN()


Sub VAN()

Dim invest_init As Double

Dim flux As Double

Dim taux As Double

Dim nb_annees As Integer, i As Integer

Dim VAN As Double, somme As Double

invest_init = InputBox("Investissement initial ?")

taux = InputBox("Taux d'actualisation ?")

nb_annees = InputBox("Nombre d'années ?")

somme = -invest_init

For i = 1 To nb_annees
• flux = InputBox("Flux de trésorerie année " & i)
• somme = somme + flux * (1 + taux) ^ -i

Next i

VAN = somme

MsgBox VAN

End Sub

Le programme permet à l’utilisateur de donner les valeurs de l’investissement initial,


du taux d’actualisation et du nombre d’années à prendre en compte.
Le calcul de la VAN se fait en initialisant la variable somme avec la valeur négative
–invest_init. Il se poursuit en ajoutant les quantités flux * (1 + taux) ^ – i à la somme
déjà calculée, la valeur de la variable flux étant donnée à chaque fois par l’utilisateur.
Au terme du calcul, la variable somme a pour valeur la valeur actuelle nette recherchée.
Exemple : si l’investissement initial vaut 10000, le taux d’actualisation 0,1, le nombre
d’années 4 et si les flux nets de trésorerie valent 3500, 3000, 3200 et 3400, le résultat
vaut 387,610. La VAN est alors positive.

Livre 7608-VBA.indb 10 07/08/12 07:05


Corrigés des exercices ◆ 11

Chapitre 6
1. Les deux valeurs les plus grandes
Le programme recherche les deux valeurs les plus grandes. Soit maxsup et maxinf
les variables qui enregistrent les deux valeurs maximales, la valeur de maxsup étant
supérieure ou égale à celle de maxinf.
Le programme étudie chaque valeur x tirée au hasard :
• Si x est supérieure à maxsup, deux mises à jour sont nécessaires : maxinf doit prendre
la valeur de maxsup et maxsup doit prendre la valeur de x.
• Sinon (x est inférieure ou égale à maxsup) et si x est supérieure à maxinf, la valeur
de maxinf doit être mise à jour : maxinf = x.
Voici le programme correspondant.

Listing 14.12 : deuxmax()


Sub deuxmax()

Dim x As Integer, maxsup As Integer, maxinf As Integer

Dim i As Integer

Dim ch As String

Randomize

maxsup = 0

maxinf = 0

For i = 1 To 10
• x = Int(100 * Rnd() + 1) 'de 1 à 100
• ch = ch & " " & CStr(x)
• If x > maxsup Then
• maxinf = maxsup
• maxsup = x
• ElseIf x > maxinf Then
• maxinf = x
• End If

Next i

MsgBox ch & vbCr & "maxsup=" & maxsup & " maxinf=" & maxinf

End Sub

2. Étude d’un mot


Le mot donné au clavier est enregistré par la variable ch. Ce mot contient Len(ch)
caractères.
Pour étudier si les caractères de la chaîne ch sont tous différents, il suffit de comparer
le ième caractère de ch avec tous les autres caractères de la sous-chaîne commençant
en i + 1, en faisant l’étude pour chaque valeur de i allant de 1 à Len(ch) – 1.
Voici le texte du programme.

Livre 7608-VBA.indb 11 07/08/12 07:05


12 ◆ Introduction à la programmation avec VBA

Listing 14.13 : lettresdiff()


Sub lettresdiff() 'première solution, voir MMIA p4

Dim ch As String

Dim i As Integer, j As Integer, nb As Integer

ch = InputBox("donne un mot :")

nb = 0

For i = 1 To Len(ch) - 1
• For j = i + 1 To Len(ch)
• If Mid(ch, i, 1) = Mid(ch, j, 1) Then nb = nb + 1
• Next j

Next i

If nb = 0 Then
• MsgBox ("lettres toutes différentes")

Else
• MsgBox ("lettres NON toutes différentes")

End If

End Sub

Une double boucle permet de structurer l’étude des caractères : la boucle extérieure est
définie par la variable i allant de 1 à Len(ch) – 1 et la boucle intérieure par la variable
j allant de i + 1 à Len(ch). La condition Mid(ch, i, 1) = Mid(ch, j, 1) permet de
tester si le ième caractère est égal ou non au jième caractère de la chaîne ch. Si tous les
caractères sont différents, la variable nb garde sa valeur initiale qui vaut 0.

3. Palindrome
Soit ch la chaîne de caractères à étudier. Soit i la variable qui donne la position des
caractères à partir du début de la chaîne et j la variable qui donne la position des
caractères à partir de la fin de la chaîne. Pour déterminer si ch est un palindrome
ou non, il faut comparer le premier et le dernier caractère, puis le deuxième et
l’avant-dernier, etc. Il suffit donc de comparer le ième caractère et le jième caractère
autant de fois que nécessaire en augmentant i de 1 et en diminuant j de 1 après
chaque comparaison.
Le programme est alors le suivant.

Listing 14.14 : palindrome()


Sub palindrome()

Dim ch As String

Dim i As Integer, j As Integer

Dim val As Boolean

ch = InputBox("donne le mot à étudier :")

i = 1

j = Len(ch)

val = True

While i < j And val
• If Mid(ch, i, 1) = Mid(ch, j, 1) Then
• i = i + 1
• j = j - 1

Livre 7608-VBA.indb 12 07/08/12 07:05


Corrigés des exercices ◆ 13

• Else
• val = False
• End If

Wend

If val = True Then
• MsgBox ch & " est un palindrome"

Else
• MsgBox ch & " n'est pas un palindrome"

End If

End Sub

Exemple : le mot « radar » est un palindrome, alors que ce n’est pas le cas du mot
« radars » (avec un s).

Chapitre 7
1. Valeurs cumulées
Le premier tableau tab1 contient les dix valeurs numériques données par l’utilisateur
et le second tableau tab2 enregistre les valeurs cumulées. La ième valeur cumulée est
calculée en faisant la somme de la ième valeur du tableau initial tab1(i) et de la valeur
cumulée tab2(i – 1) calculée précédemment :

tab2(i) = tab1(i) + tab2(i - 1)

Il faut alors exécuter cette instruction pour toutes les valeurs de i allant de 2 à 10. Pour
la valeur i = 1, il suffit d’attribuer à tab2(1) la valeur du premier nombre du tableau.
Voici le programme correspondant.

Listing 14.15 : val_cumulees()


Sub val_cumulees()

Dim tab1(1 To 10) As Integer, tab2(1 To 10) As Integer

Dim i As Integer

Dim ch1 As String, ch2 As String

ch1 = ""

For i = 1 To 10
• tab1(i) = InputBox("donne la valeur n°" & i)
• ch1 = ch1 & CStr(tab1(i)) & " "

Next i

tab2(1) = tab1(1)

ch2 = tab2(1) & " "

For i = 2 To 10
• tab2(i) = tab1(i) + tab2(i - 1)
• ch2 = ch2 & CStr(tab2(i)) & " "

Next i

MsgBox ch1 & vbCr & ch2

End Sub

Livre 7608-VBA.indb 13 07/08/12 07:05


14 ◆ Introduction à la programmation avec VBA

2. Deux valeurs successives égales ?


Le tableau t est constitué de 15 éléments. Chaque élément du tableau a pour valeur
un nombre tiré au hasard.
La propriété recherchée (existe-t-il deux valeurs successives égales ?) ne concerne
que quelques éléments du tableau et non pas tous les éléments. Il convient alors de
supposer a priori que la propriété n’est pas vérifiée et d’affecter à la variable prop la
valeur 1. Mais dès que le programme constate que deux valeurs successives t(i) et
t(i + 1) sont égales (t(i) = t(i + 1)), la variable prop doit prendre la valeur 0 pour
signifier que la propriété recherchée est vérifiée.
Le programme est donc le suivant.

Listing 14.16 : deuxnbs()


Sub deuxnbs()

Dim t(1 To 15) As Integer

Dim i As Integer, prop As Integer

Dim ch As String

ch = ""

Randomize

For i = 1 To 15
• t(i) = Int(20 * Rnd() + 1) 'de 1 à 20
• ch = ch & CStr(t(i)) & " "

Next i

prop = 1

i = 1

While i < 14 And prop = 1
• If t(i) = t(i + 1) Then prop = 0
• i = i + 1

Wend

If prop = 0 Then
• MsgBox ch & vbCr _
• & "il y a deux nbs successifs égaux"

Else
• MsgBox ch & vbCr _
• & "il n'y a pas deux nbs successifs égaux"

End If

End Sub

L’instruction itérative While…Wend a pour condition i < 14 And prop = 1. Tant que
cette condition reste vraie, le programme examine si t(i) et t(i + 1) ont des valeurs
égales. Si c’est le cas, la variable prop prend la valeur 0, ce qui rend alors la condition
du While fausse, arrêtant ainsi l’exécution de cette instruction.
Le test final étudie la valeur de la variable prop. Si celle-ci vaut 0, deux nombres
successifs du tableau sont bien égaux. En revanche, si la variable prop a conservé sa
valeur initiale 1, cela signifie que le programme n’a pas constaté l’égalité recherchée :
il n’y a donc pas deux valeurs successives égales au sein du tableau.

Livre 7608-VBA.indb 14 07/08/12 07:05


Corrigés des exercices ◆ 15

Chapitre 8
1. Calcul de ex
ex qui vaut 1 + x + x 2 / 2! + x 3 / 3!+…+ x n / n peut s’écrire sous la forme 1 + ∑x k / k!,
pour k allant de 1 à n.
En langage VBA, x k / k! s’écrit (x ^ k) / facto(k), le caractère ^ signifiant puissance,
et facto(k) étant une fonction qui calcule la factorielle de k.
Pour calculer ex, il suffit donc de répéter n fois l’affectation suivante :

res = res + (x ^ k) / facto(k)

dans laquelle res permet de calculer la somme totale après avoir été initialisée à 1.
Le code du programme est constitué d’une procédure et d’une fonction :
• La procédure exp() permet à l’utilisateur de donner les valeurs de x et de n, puis
elle effectue le calcul en utilisant une boucle For…Next…
• La fonction facto(x) calcule la factorielle de x.

Listing 14.17 : exp() et facto(x)


Sub exp()

Dim x As Double, n As Double, res As Double, k As Integer

x = InputBox("donne la valeur de x :")

n = InputBox("donne la valeur de n :")

res = 1

For k = 1 To n
• res = res + (x ^ k) / facto(k)

Next k

MsgBox res

End Sub


Function facto(x As Integer) As Double

Dim i As Integer, f As Double

f = 1

For i = 1 To x
• f = f * i

Next i

facto = f

End Function

Exemple : si x = 2 et n = 15, le résultat vaut 7.38905609538414.

2. Gestion d’un tableau de notes


Le programme gestion_notes() assure la gestion d’un tableau de notes à l’aide de
trois procédures :
• ajout_note() : elle ajoute une note au tableau de notes.
• affichage_notes() : elle affiche toutes les notes.
• moyenne_notes() : elle calcule la moyenne des notes.

Livre 7608-VBA.indb 15 07/08/12 07:05


16 ◆ Introduction à la programmation avec VBA

Nous avons défini deux variables globales : tnotes qui définit un tableau de 15 notes
et nbnotes qui donne le nombre de notes mises au sein du tableau. Ces deux variables
globales sont déclarées en tête du texte et sont utilisées par chacune des procédures.
Voici le texte complet des quatre procédures.
Listing 14.18 : gestion_notes(), ajout_note(), affichage_notes() et moyenne_notes()


Dim tnotes(1 To 15) As Double

Dim nbnotes As Integer

Sub gestion_notes()

Dim rep As Integer

nbnotes = 0

rep = 1

While rep <> 4
• rep = InputBox("1: ajout d'une note" & vbCr _
• & "2: affichage des notes" & vbCr _
• & "3: moyenne des notes" & vbCr _
• & "4: FIN")
• If rep = 1 Then ajout_note
• If rep = 2 Then affichage_notes
• If rep = 3 Then moyenne_notes

Wend

End Sub


Sub ajout_note()

tnotes(nbnotes + 1) = InputBox("donne la note :")

nbnotes = nbnotes + 1

End Sub


Sub affichage_notes()

Dim i As Integer, resultats As String

resultats = ""

For i = 1 To nbnotes
• resultats = resultats & " " & tnotes(i)

Next i

MsgBox (resultats)

End Sub


Sub moyenne_notes()

Dim i As Integer, s As Double, moy As Double

For i = 1 To nbnotes
• s = s + tnotes(i)

Next i

moy = s / nbnotes

MsgBox moy

End Sub
La procédure gestion_notes() propose quatre choix à l’utilisateur :
• S’il tape 1, c’est la procédure ajout_note() qui s’exécute.
• S’il tape 2, c’est la procédure affichage_notes() qui s’exécute.
• S’il tape 3, c’est la procédure moyenne_notes() qui s’exécute.
• En revanche, s’il tape 4, aucune procédure n’est appelée, la condition du While
devient fausse et le programme met fin à son exécution.

Livre 7608-VBA.indb 16 07/08/12 07:05


Corrigés des exercices ◆ 17

3. Une fonction personnalisée


Le nombre de combinaisons à calculer est défini à l’aide de deux paramètres n et p,
et vaut n! / (p! * (n – p)!).
En langage VBA, cette expression s’écrit facto(n) / (facto(p) * facto(n – p)) lorsque
facto(…) est une fonction qui calcule la factorielle de son argument.
Le code de la fonction facto(x) étant déjà défini (voir listing 14.17), le texte de la
fonction personnalisée fp_combin(c1, c2) est alors le suivant.

Listing 14.19 : fp_combin(c1, c2)


Function fp_combin(c1 As Range, c2 As Range) As Integer

Dim n As Integer, p As Integer

n = c1.Value

p = c2.Value

fp_combin = facto(n) / (facto(p) * facto(n - p))

End Function

Chapitre 9
1. Partage d’une série de nombres
Le programme est structuré avec les variables suivantes :
• p désigne la plage B1:D10 qui contient la série des nombres à étudier (colonne B)
et les résultats recherchés (colonnes C et D).
• seuil enregistre la valeur donnée par l’utilisateur.
• i désigne la ligne du ième nombre de la série des nombres.
• j désigne la ligne du jième nombre à ajouter dans la colonne C (nombres inférieurs
à la valeur de seuil) ; k désigne la ligne du k ième nombre à ajouter dans la colonne
D (nombres supérieurs ou égaux à la valeur de seuil).
Voici le texte du programme.

Listing 14.20 : partage_serie()


Sub partage_serie()

Dim p As Range

Dim seuil As Integer

Dim i As Integer, j As Integer, k As Integer

Set p = Range("B1:D10")

seuil = InputBox("donne la valeur du seuil :")

j = 1

k = 1

For i = 1 To 10
• If p.Cells(i, 1).Value < seuil Then
• p.Cells(j, 2).Value = p.Cells(i, 1).Value
• j = j + 1

Livre 7608-VBA.indb 17 07/08/12 07:05


18 ◆ Introduction à la programmation avec VBA

• Else
• p.Cells(k, 3).Value = p.Cells(i, 1).Value
• k = k + 1
• End If

Next i

End Sub

Le ième nombre de la série des nombres est donné par la variable p.Cells(i, 1).Value.
Si cette valeur est inférieure à la valeur de seuil, ce nombre est recopié dans la deuxième
colonne de la plage au sein d’une cellule de coordonnées (j, 2), puis j est augmenté
de 1. Sinon, ce nombre est recopié dans la troisième colonne de la plage au sein d’une
cellule de coordonnées (k, 3), puis k est augmenté de 1.

2. Table de multiplications
Le programme est le suivant.

Listing 14.21 : table_multip()


Sub table_multip()

Dim c As Range

Dim i As Integer, j As Integer

Set c = Range("A1")

For i = 1 To 10 '---(1) Valeurs de i ---
• c.Offset(i, 0).Value = i

Next i

For j = 1 To 10 '---(2) Valeurs de j ---
• c.Offset(0, j).Value = j

Next j

For i = 1 To 10 '---(3) Résultats ---
• For j = 1 To 10
• c.Offset(i, j).Value = _
• c.Offset(i, 0).Value * c.Offset(0, j).Value
• Next j

Next i

End Sub
La variable c désigne la cellule A1.
Le programme exécute les actions suivantes :
1. Valeurs de i. Les valeurs de i allant de 1 à 10 sont placées au sein des cellules de
la plage A2:A11 (sur la colonne A).
2. Valeurs de j. Les valeurs de j allant de 1 à 10 sont placées au sein des cellules de
la plage B1:K1 (sur la ligne 1).
3. Résultats. Les résultats des calculs sont affectés aux cellules de la plage B2:K11.
Le produit i * j est calculé par le produit c.Offset(i, 0).Value * c.Offset(0,
j).Value, et sa valeur est affectée à la cellule c.Offset(i, j).

3. Effectifs et fréquences cumulées


Voici le code du programme.

Livre 7608-VBA.indb 18 07/08/12 07:05


Corrigés des exercices ◆ 19

Listing 14.22 : val_cumulees()


Sub val_cumulees()

Dim i As Integer, nblig As Integer

Dim s As Double

Dim pl As Range

Set pl = Selection

nblig = pl.Rows.Count
• '---(1) Effectifs cumulés ---

pl.Cells(1).Offset(0, 1).Value = pl.Cells(1).Value

s = 0

For i = 2 To nblig
• s = pl.Cells(i).Value + pl.Cells(i - 1).Offset(0, 1).Value
• pl.Cells(i).Offset(0, 1).Value = s

Next i
• '---(2) Fréquences relatives ---

For i = 1 To nblig
• pl.Cells(i).Offset(0, 2).Value = pl.Cells(i).Value / s

Next i
• '---(3) Fréquences relatives cumulées ---

For i = 1 To nblig
• pl.Cells(i).Offset(0, 3).Value = pl.Cells(i).Offset(0, 1).Value / s

Next i

End Sub

Le programme est conçu pour que l’utilisateur sélectionne tout d’abord une plage de
cellules à une seule colonne dans laquelle il va mettre les effectifs à examiner. Cette
colonne est désignée par la variable pl. Puis le programme calcule le nombre de lignes
de la plage pl en exécutant nblig = pl.Rows.Count.
Le programme effectue ensuite les trois traitements demandés.
1. Calcul des effectifs cumulés. La valeur initiale des effectifs cumulés est la première
valeur des effectifs. D’où la première affectation :
pl.Cells(1).Offset(0, 1).Value = pl.Cells(1).Value.
Pour déterminer la ième valeur des effectifs cumulés, il faut faire la somme de la ième
valeur de l’effectif étudié et de la (i – 1)ème valeur de l’effectif cumulé déjà calculée.
Le résultat de la somme est affecté à la variable s. Le calcul est schématisé par la
figure 14.3.

+1

pl.Cells(i-1).Offset(0,+1)
ligne i-1 116
ligne i 21 137 pl.Cells(i).Offset(0,+1)=s

pl.Cells(i)

Figure 14.3 • Le calcul du ième effectif cumulé.

Livre 7608-VBA.indb 19 07/08/12 07:05


20 ◆ Introduction à la programmation avec VBA

La somme s vaut donc :



s = pl.Cells(i).Value + pl.Cells(i - 1).Offset(0, 1).Value

Cette valeur s est la valeur recherchée. Elle est affectée à la cellule désignée par
pl.Cells(i).Offset(0, 1) car c’est elle qui doit contenir la ième valeur des effectifs
cumulés. Le calcul ainsi défini est répété plusieurs fois, pour chacune des valeurs
de i allant de 2 à nblig.
Au sortir de la boucle, la variable s contient la somme des effectifs de la plage pl.
2. Calcul des fréquences relatives. Chaque valeur est le quotient de la ième valeur de
l’effectif initial par la somme des effectifs s. Elle vaut donc pl.Cells(i).Value / s,
et sa valeur est affectée à la ième cellule de la deuxième colonne des résultats qui
est définie par pl.Cells(i).Offset(0, 2). D’où l’affectation qu’il faut exécuter
nblig fois :

pl.Cells(i).Offset(0, 2).Value = pl.Cells(i).Value / s

3. Calcul des fréquences relatives cumulées. Chaque valeur est le résultat de la


division de la fréquence cumulée par la somme des effectifs. Elle vaut donc
pl.Cells(i).Offset(0, 1).Value / s. Sa valeur est ensuite affectée à la ième cellule
de la troisième colonne des résultats. Le code suivant doit alors être exécuté nblig
fois :

pl.Cells(i).Offset(0, 3).Value = pl.Cells(i).Offset(0, 1).Value / s

Chapitre 10
1. Formulaire de calcul
Le formulaire est construit selon la maquette donnée par la figure 14.4.

UF_3nbs

Le premier nombre TextBox1

Le deuxième nombre TextBox2

Le troisième nombre TextBox3

CALCUL TextBox4

Btn_Calcul

Figure 14.4 • La maquette du formulaire.

La variable UF_3nbs désigne l’objet formulaire et cet objet est affiché par la procédure
trois_nbs() dont voici le code (on peut aussi définir un bouton de commande).

Livre 7608-VBA.indb 20 07/08/12 07:05


Corrigés des exercices ◆ 21

Listing 14.23 : trois_nbs()


Sub trois_nbs()

UF_3nbs.Show

End Sub

Au bouton de commande Btn_Calcul du formulaire est associée la procédure


Btn_Calcul_Click(). Celle-ci examine la valeur des trois nombres donnés par l’uti-
lisateur et détermine si l’un d’entre eux est égal ou non à la somme des deux autres.
Voici le code de cette procédure.

Listing 14.24 : Btn_Calcul_Click()


Private Sub Btn_Calcul_Click()

Dim x As Integer, y As Integer, z As Integer

x = CInt(TextBox1.Text)

y = CInt(TextBox2.Text)

z = CInt(TextBox3.Text)

If x = y + z Or y = x + z Or z = x + y Then
• TextBox4.Text = "Egalité"

Else
• TextBox4.Text = "NON Egalité"

End If

End Sub

2. Nombre proche
La plage B1:B10 donne la série des nombres à étudier. Le bouton de commande
Btn_Calcul, intitulé « CALCUL », permet d’afficher le formulaire UF_Nbproche lors
de l’exécution du code suivant :

Private Sub Btn_Calcul_Click()

UF_Nbproche.Show

End Sub

Lorsque l’utilisateur clique sur le bouton du formulaire intitulé « Nombre Proche »,


la procédure associée recherche alors le nombre le plus proche parmi les dix nombres
situés en B1:B10. La figure 14.5 donne un état de la feuille de calcul après le traitement.

Figure 14.5 • La feuille de calcul après le traitement.

Livre 7608-VBA.indb 21 07/08/12 07:05


22 ◆ Introduction à la programmation avec VBA

Le bouton du formulaire intitulé «  Nombre Proche  » est désigné par la variable


Btn_Proche, et la procédure associée a pour nom Btn_Proche_Click(). Son code est
le suivant.

Listing 14.25 : Btn_Proche_Click()


Private Sub Btn_Proche_Click()

Dim p As Range

Dim i As Integer, x As Integer

Dim diff As Integer, nb As Integer

Set p = Range("B1:B10")

x = CInt(TextBox1.Text)

diff = Abs(x - p.Cells(1).Value)

nb = p.Cells(1).Value

For i = 2 To 10
• If Abs(x - p.Cells(i).Value) < diff Then
• diff = Abs(x - p.Cells(i).Value)
• nb = p.Cells(i).Value
• End If

Next i

TextBox2.Text = CStr(nb)

End Sub

3. Agence de voyage
Il s’agit d’ajouter un bouton de commande et un formulaire à l’application présentée
au paragraphe 3.2 du chapitre 10 afin de pouvoir modifier les informations données
lors d’une inscription (nombre de personnes et formule retenue).
Le bouton, ajouté sur la feuille de calcul, est intitulé « MODIFICATION », et il est
désigné par la variable Btn_Modif. Le formulaire associé est désigné par la variable
UF_Modif. Il a la même structure que le formulaire UF_Inscription de l’application
comme l’indique la figure 14.6.

Figure 14.6 • Le formulaire de modification.

Livre 7608-VBA.indb 22 07/08/12 07:05


Corrigés des exercices ◆ 23

L’utilisateur saisit d’abord les informations au sein du formulaire  : le nom de la


personne déjà inscrite (sans le modifier), puis le nombre de personnes et la formule
retenue (Week-End, Semaine ou Promotion) qui sont modifiées par rapport à l’enre-
gistrement déjà effectué. Puis l’utilisateur clique sur le bouton de commande intitulé
« VALIDATION ».
Ce bouton est désigné par la variable Btn_OK_Modif. La procédure associée, appelée
Btn_OK_Modif_Click(), est alors exécutée. En voici le code.

Listing 14.26 : Btn_OK_Modif_Click()


Private Sub Btn_OK_Modif_Click()

Dim c As Range

Dim nb As Integer, prix As Integer

Dim choix As String

Dim i As Integer
• '---(1) Recherche du nom ---

i = 1

While Range("B3").Offset(i, 0).Value <> TextBox1.Text _

And Range("B3").Offset(i, 0).Value <> Empty
• i = i + 1

Wend
• '---(2) Enregistrement des modifs ---

If Range("B3").Offset(i, 0) <> Empty Then
• Set c = Range("B3").Offset(i, 0)
• c.Offset(0, 1).Value = TextBox2.Text
• nb = CInt(TextBox2.Text)
• choix = ComboBox1.Value
• c.Offset(0, 2).Value = choix
• If choix = "Week-End" Then prix = nb * 100
• If choix = "Semaine" Then prix = nb * 500
• If choix = "Promotion" Then prix = nb * 150
• c.Offset(0, 3).Value = prix
• MsgBox "La modification de " & TextBox1.Text & " est enregistrée"
• Unload Me

Else
• MsgBox "Erreur sur le nom de la personne"

End If

End Sub

La procédure agit en deux temps :


1. Recherche du nom. Les noms des personnes déjà inscrites figurent au sein de la
colonne B, à partir de la cellule B4. Le raisonnement à suivre est formulé avec une
double condition. Tant que la ième cellule de la colonne B contient un nom et que
celui-ci n’est pas le nom recherché, alors il faut examiner la cellule suivante de cette
colonne. Mais dès que la valeur de la ième cellule est le nom cherché, il convient
d’arrêter l’étude des noms. Il faut aussi arrêter le processus lorsque la ième cellule
est vide et ne contient pas de nom.
Lorsque la boucle While…Wend termine son exécution, la variable i désigne la ligne
qui contient le nom cherché, ou bien qui ne contient aucun nom.

Livre 7608-VBA.indb 23 07/08/12 07:05


24 ◆ Introduction à la programmation avec VBA

2. Enregistrement des modifications. Après avoir vérifié que la ième cellule


Range("B3").Offset(i, 0) n’est pas vide (elle contient donc un nom), le programme
affecte à la variable c l’adresse de cette cellule, puis il réalise les mises à jour relatives
au nom contenu par cette cellule.

Chapitre 11
1. Dessin
Le dessin à reproduire se présente comme à la figure 14.7.

2 1

J6: cellule
de départ
3 4

Figure 14.7 • La maquette du dessin.

Il convient tout d’abord de donner un format carré à chaque cellule concernée, en


choisissant par exemple 12,5 comme hauteur des lignes et 2 comme largeur des
colonnes.
Il s’agit ensuite de colorier les cellules en partant d’une cellule donnée. Nous proposons
de commencer à la cellule J6, positionnée à la ligne 6 et à la colonne 10.
Voici le programme qui colorie quatre cellules dans chacun des quatre parcours
(parcours numérotés 1, 2, 3 et 4 sur la figure).

Listing 14.27 : dessin()


Sub dessin()

Dim i As Integer, j As Integer

Dim k As Integer

i = 6

j = 10 'cellule J6

For k = 1 To 4 'parcours 1
• Cells(i, j).Interior.ColorIndex = 4
• i = i - 1
• j = j - 1

Next k

For k = 1 To 4 'parcours 2
• Cells(i, j).Interior.ColorIndex = 4
• i = i + 1
• j = j - 1

Next k

For k = 1 To 4 'parcours 3
• Cells(i, j).Interior.ColorIndex = 4

Livre 7608-VBA.indb 24 07/08/12 07:05


Corrigés des exercices ◆ 25

• i = i + 1
• j = j + 1

Next k

For k = 1 To 4 'parcours 4
• Cells(i, j).Interior.ColorIndex = 4
• i = i - 1
• j = j + 1

Next k

End Sub

2. Frise n° 1
La première frise est structurée par la répétition de six cellules qui sont organisées à
partir de la cellule B3 comme l’indique la figure 14.8.

c.Offset(-1,0) c.Offset(-1,+1)

c=cellule B3
=c.Offset(0,0)

c.Offset(+1,0)
c.Offset(+1,+1) c.Offset(0,+1)

Figure 14.8 • La frise n° 1.

Voici le programme qui permet de réaliser cette frise.

Listing 14.28 : frise1()


Sub frise1()

Dim c As Range

Dim j As Integer, k As Integer

Set c = Range("B3")

For k = 0 To 12 Step 2
• c.Offset(0, k).Interior.ColorIndex = 6 'jaune
• c.Offset(-1, k).Interior.ColorIndex = 6
• c.Offset(-1, k + 1).Interior.ColorIndex = 6
• c.Offset(0, k + 1).Interior.ColorIndex = 3 'rouge
• c.Offset(1, k).Interior.ColorIndex = 3
• c.Offset(1, k + 1).Interior.ColorIndex = 3

Next k

End Sub

Le programme affecte à la variable c l’adresse de la cellule B3. Puis il colorie les cellules
en fonction de leur position par rapport à cette cellule :
• k vaut d’abord 0 : le programme colorie les six premières cellules.
• La valeur suivante de k vaut 2 car le pas de l’instruction itérative est de 2. Les
cellules sont décalées de +2 vers la droite, et le même traitement est appliqué aux
six cellules concernées.

Livre 7608-VBA.indb 25 07/08/12 07:05


26 ◆ Introduction à la programmation avec VBA

• Il en est de même pour les valeurs suivantes de k : 4, 6, 8, 10 et 12. L’instruction


itérative définie avec la variable k assure ainsi sept fois le coloriage des six cellules.

3. Frise n° 2
Pour réaliser la seconde frise, il suffit de la découper en une succession de croix comme
l’indique la figure 14.9.

Cellule de départ

0
Ligne i 1
2
3
4
0 1 2 3 4
Colonne j

Figure 14.9 • La frise n° 2.

Chaque croix s’inscrit dans un ensemble de 5 × 5 cellules où chaque cellule est repérée
par son numéro de ligne i et son numéro de colonne j, i allant de 0 à 4 et j allant de 0
à 4. Les cellules sont coloriées lorsqu’elles appartiennent à l’une des deux diagonales :
première diagonale lorsque i = j et deuxième diagonale lorsque i = 4 – j.
Voici le programme correspondant.

Listing 14.29 : frise2()


Sub frise2()

Dim c As Range

Dim i As Integer, j As Integer, k As Integer

Set c = Range("B2")

For k = 0 To 15 Step 5
• For i = 0 To 4
• For j = 0 To 4
• If i = j Or i = 4 - j Then
• c.Offset(i, j + k).Interior.ColorIndex = 5
• End If
• Next j
• Next i

Next k

End Sub

Le programme attribue à la variable c l’adresse de la cellule B2 qui sert de cellule de


référence. Puis le programme exécute trois boucles imbriquées (triple boucle) :
• Lorsque k = 0, le programme exécute une première fois la double boucle structurée
par les valeurs de i et de j. Il colorie les cellules c.Offset(i, j + k) c’est-à-dire
c.Offset(i, j) lorsqu’elles satisfont aux conditions sur i et j.

Livre 7608-VBA.indb 26 07/08/12 07:05


Corrigés des exercices ◆ 27

• La valeur suivante de k vaut 5 puisque le pas de l’instruction itérative est de 5.


Le programme exécute alors une deuxième fois la double boucle définie par i et
j. Les cellules c.Offset(i, j + k), c’est-à-dire c.Offset(i, j + 5), sont situées à
droite des précédentes cellules, avec un déplacement de +5. Elles sont coloriées
lorsqu’elles satisfont aux conditions sur les variables i et j.
• Puis le programme exécute à nouveau ce traitement pour k = 10 et pour k = 15.
Au terme du processus, le programme a colorié quatre croix respectant les conditions
imposées aux variables i et j.

Chapitre 12
1. Calculs financiers
Nous proposons que le calcul du montant de l’emprunt soit structuré de la même façon
que celui qui détermine la mensualité d’un emprunt : il faut alors ajouter un troisième
bouton de commande « EMPRUNT Montant ? » sur la feuille F_menu comme cela
est présenté sur la figure 14.10.

Figure 14.10 • La feuille F_menu.

Le bouton de commande «  EMPRUNT Montant  ?  » est désigné par la variable


Btn_Emprunt2. Voici le code de la procédure associée Btn_Emprunt2_Click().

Listing 14.30 : Btn_Emprunt2_Click()


Private Sub Btn_Emprunt2_Click()

Dim f_emprunt2 As Worksheet

Set f_emprunt2 = Worksheets("F_montants_emprunt")

f_emprunt2.Activate

End Sub

Il faut ensuite définir une nouvelle feuille de calcul F_montants_emprunt organisée


comme l’indique la figure 14.11.

Livre 7608-VBA.indb 27 07/08/12 07:05


28 ◆ Introduction à la programmation avec VBA

Figure 14.11 • La feuille de calcul F_montants_emprunt.

Au bouton de commande intitulé « CALCUL Montants » et désigné par la variable


Btn_Calcul_Montants est associée la procédure Btn_Calcul_Montants_Click(), et au
bouton intitulé « Quitter » est associée la procédure Btn_Quitter_Click(). Voici le
texte de la première procédure.

Listing 14.31 : Btn_Calcul_Montants_Click()


Private Sub Btn_Calcul_Montants_Click()

Dim m As Double, t As Double

Dim taux As Double, mens As Double

Dim n As Integer, nb As Integer, i As Integer, j As Integer

Dim p As Range
• '---(1) Données et calcul du montant ---

mens = Range("B3").Value

t = Range("B4").Value

n = Range("B5").Value

m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12)

Range("B6").Value = Round(m, 2)
• '---(2) Mise en place du tableau ---

Set p = Range("B8:G13")

p.Cells(1, 1).Value = Round(m, 2)

taux = Range("B4").Value - 0.01

nb = Range("B5").Value - 2

For i = 2 To 6 'valeurs des durées
• p.Cells(i, 1).Value = nb
• nb = nb + 1

Next i

For j = 2 To 6 'valeurs des taux
• p.Cells(1, j).Value = taux
• taux = taux + 0.005

Next j
• '---(3) Calcul des montants ---

For i = 2 To 6
• For j = 2 To 6
• n = p.Cells(i, 1).Value
• t = p.Cells(1, j).Value
• m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12)
• p.Cells(i, j).Value = Round(m, 2)
• Next j

Next i

End Sub

Livre 7608-VBA.indb 28 07/08/12 07:05


Corrigés des exercices ◆ 29

La procédure effectue plusieurs calculs :


1. Données et calcul du montant. Elle calcule tout d’abord la valeur du montant à
partir des données fournies par l’utilisateur au sein des cellules B3, B4 et B5. Le
calcul du montant m est fait en utilisant les variables mens (mensualité), t (taux
d’intérêt en valeur décimale) et n (durée en années de l’emprunt) au sein de l’affec-
tation suivante :

m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12)

Cette formulation est la transcription informatique de la formule financière qui


définit la valeur du montant de l’emprunt : M = (Me / T) × (1 – (1 + T) –N), Me
étant la mensualité, T le taux d’intérêt mensuel et N le nombre de mois de la durée
de l’emprunt.
2. Mise en place du tableau. La procédure met en place le tableau B8:G13 désigné
par la plage p. Sur la première colonne (B9:B13), elle met les valeurs des durées qui
vont être utilisées. Sur la première ligne (cellules C8:G8), elle met les valeurs des
différents taux qui encadrent le taux d’intérêt déjà utilisé pour le calcul précédent.
3. Calcul des montants. La procédure calcule ensuite les valeurs des montants en
appliquant pour chaque couple de valeur (taux, durée) la formule financière.
Toutes ces valeurs se mettent en place dès que l’utilisateur a donné les valeurs
demandées, puis cliqué sur le bouton « CALCUL Montants ».

2. Gestion de prêts
Il s’agit de compléter l’application « Gestion de prêts » en la dotant d’un service supplé-
mentaire INFORMATIONS. Celui-ci doit permettre de donner des informations sur
l’état des prêts.
Un bouton de commande intitulé « INFORMATIONS » est ajouté à la feuille F_menu
comme l’indique la figure 14.12.

Figure 14.12 • La feuille F_menu.

Livre 7608-VBA.indb 29 07/08/12 07:05


30 ◆ Introduction à la programmation avec VBA

Au bouton « INFORMATIONS » est associée la procédure suivante :

Listing 14.32 : Btn_Infos_Click()


Private Sub Btn_Infos_Click()

UF_Infos.Show

End Sub
Voici le formulaire que nous proposons d’ajouter au sein de l’application. Il est donné
par la figure 14.13.

Figure 14.13 • Le formulaire UF_Infos.

Ce formulaire désigné par la variable UF_Infos contient deux boutons de commande.


Le premier, intitulé « CALCUL », est défini par la variable Btn_Nbpers. La procédure
associée Btn_Nbpers_Click() est conçue pour effectuer les calculs demandés. Le
second bouton est intitulé « Quitter » et permet d’effacer le formulaire de l’écran sans
conserver d’information. Le formulaire contient aussi six zones de texte définies par
les variables TextBox1, TextBox2,… , TextBox6. Celles-ci vont recevoir les informations
calculées par la procédure Btn_Nbpers_Click().
Pour calculer le nombre de personnes ayant empruntés 0 document, 1 document, 2
documents,… , 5 documents, cette procédure doit consulter le nombre de documents
empruntés par chaque personne inscrite. Comment trouver cette information ?
L’application est munie de plusieurs variables globales dont la variable ci. Celle-ci
désigne la première cellule de la liste des noms de personnes du classeur Inscrits. La
variable ci.Offset(i, 0) désigne donc la ième personne et ci.Offset(i, 3).Value
donne alors le nombre de documents empruntés par cette personne.
Le texte du programme est alors le suivant.

Livre 7608-VBA.indb 30 07/08/12 07:05


Corrigés des exercices ◆ 31

Listing 14.33 : Btn_Nbpers_Click()


Private Sub Btn_Nbpers_Click()

Dim i As Integer

Dim nb0 As Integer, nb1 As Integer, nb2 As Integer

Dim nb3 As Integer, nb4 As Integer, nb5 As Integer
• '---(1) Initialisations ---

init

i = 0

nb0 = 0: nb1 = 0: nb2 = 0: nb3 = 0: nb4 = 0: nb5 = 0
• '---(2) Calculs ---

While ci.Offset(i, 0).Value <> Empty
• If ci.Offset(i, 3).Value = 0 Then
• nb0 = nb0 + 1
• ElseIf ci.Offset(i, 3).Value = 1 Then
• nb1 = nb1 + 1
• ElseIf ci.Offset(i, 3).Value = 2 Then
• nb2 = nb2 + 1
• ElseIf ci.Offset(i, 3).Value = 3 Then
• nb3 = nb3 + 1
• ElseIf ci.Offset(i, 3).Value = 4 Then
• nb4 = nb4 + 1
• Else
• nb5 = nb5 + 1
• End If
• i = i + 1

Wend
• '---(3) Affichage des résultats ---

TextBox1.Text = CStr(nb0)

TextBox2.Text = CStr(nb1)

TextBox3.Text = CStr(nb2)

TextBox4.Text = CStr(nb3)

TextBox5.Text = CStr(nb4)

TextBox6.Text = CStr(nb5)

End Sub

La procédure agit en trois temps :


1. Initialisation. L’appel à la procédure init() permet de créer et d’initialiser toutes
les variables globales dont la variable ci. Puis les variables i, nb0, nb1,… , nb5
sont initialisées à 0 (les « : » ajoutés sur la ligne permettent de mettre plusieurs
instructions sur cette ligne).
2. Calculs. Tant que la ième cellule contient un nom, la procédure examine la valeur
de ci.Offset(i, 3) et met à jour le nombre de documents empruntés selon les
résultats aux tests.
3. Affichage des résultats. Les valeurs de nb0, nb1,… , nb5 étant calculées, elles sont
affichées sous forme de chaînes de caractères au sein des six zones de texte du
formulaire.

Livre 7608-VBA.indb 31 07/08/12 07:05


32 ◆ Introduction à la programmation avec VBA

Chapitre 13
1. Comparaison de trois suites récurrentes
Soit trois fonctions qui permettent de calculer la racine d’ordre 5 d’un nombre a,
c’est-à-dire a1/5 :
Fonction n° 1 : f(x) = (2 ¥ x + a / (x ^ 4)) / 3
Fonction n° 2 : f(x) = (3 ¥ x + a / (x ^ 4)) / 4
Fonction n° 3 : f(x) = (4 ¥ x + a / (x ^ 4)) / 5
Ces trois fonctions définissent une limite L qui vaut a1/5. Leurs coefficients de conver-
gence valent respectivement 2/3, ¼ et 0, indiquant ainsi que la fonction n° 3 est celle
dont la vitesse de convergence vers le résultat est la plus grande.
Voici le texte du programme formulé avec la variable U pour la fonction n° 1, la variable
V pour la fonction n° 2 et la variable W pour la fonction n° 3.

Listing 13.34 : suite_rac5()


Sub suite_rac5()

Dim i As Integer

Dim U As Double, V As Double, W As Double, a As Double

Dim c As Range

Set c = Range("B1")

a = InputBox("valeur de a :")

U = InputBox("valeur initiale de U :")

V = U

W = U

For i = 0 To 99
• U = (2 * U + (a / (U ^ 4))) / 3
• V = (3 * V + (a / (V ^ 4))) / 4
• W = (4 * W + (a / (W ^ 4))) / 5
• c.Offset(i, 0).Value = U 'affichage colonne B
• c.Offset(i, 1).Value = V 'affichage colonne C
• c.Offset(i, 2).Value = W 'affichage colonne D

Next i

End Sub

Si l’on donne à la variable a la valeur 243 qui vaut en fait 35 (3 à la puissance 5),
on vérifie ainsi à quelle vitesse on obtient la valeur 3 comme résultat. Lorsque l’on
donne 3,2 comme valeur initiale et que l’on affiche les résultats avec 15 décimales,
on obtient cette valeur 3 à la soixante-dix-septième itération avec la fonction n° 1, à
la vingt-deuxième itération avec la fonction n° 2 et à la quatrième itération avec la
dernière fonction. C’est bien cette fonction qui permet d’obtenir le programme le
plus performant.

Livre 7608-VBA.indb 32 07/08/12 07:05


Corrigés des exercices ◆ 33

Les trois racines de x3 – 3x + 1 = 0


La première racine 0.347296355333861 a été obtenue à la cinquantième itération avec
le calcul par dichotomie et à la quatrième itération avec la méthode de Newton (voir
paragraphe 3.1 du chapitre 13).
Pour calculer les deux autres racines, il faut déterminer des intervalles qui contiennent
les deux valeurs recherchées :
• Si x = –1, f(x) = x 3 – 3x + 1 vaut +3 et si x = -2, f(x) vaut –1 : la deuxième racine
est donc comprise entre –2 et –1.
• Si x = +1, f(x) vaut –1 et si x=+2, f(x) vaut +3 : la troisième racine est donc comprise
entre +1 et +2.
Il suffit alors de réutiliser les programmes déjà présentés :
• Dans le programme fx_dicho() (voir listing 13.5), il convient de donner aux
variables a et b les nouvelles valeurs. La deuxième racine établie avec a = –2 et
b = –1 vaut –1.87938524157182 à la quarante-neuvième itération. La troisième
racine calculée avec a = 1 et b = 2 vaut 1.53208888623796 à la quarante-neuvième
itération elle aussi.
• Dans le programme fx_newton() (voir listing 13.6), il faut initialiser le processus
en partant d’une valeur proche. La deuxième racine calculée avec une valeur
initiale y = –2 donne le même résultat que précédemment à la quatrième itération.
La troisième racine calculée en donnant à y la valeur +2 fournit la même valeur
que celle qui a été déterminée par dichotomie, mais à la sixième itération.

Livre 7608-VBA.indb 33 07/08/12 07:05


Livre 7608-VBA.indb 34 07/08/12 07:05
A
Memento VBA

Le mémento présente la syntaxe des types, des déclarations de variables, des instruc-
tions, des opérateurs, des fonctions et des procédures VBA.
Cette présentation utilise les symboles suivants :
• […] : terme optionnel.
• (…) : termes semblables non formulés.

Types 
Voici les différents types de variables disponibles en VBA :
• Nombres entiers : Byte, Integer, Long, LongLong, LongPtr.
• Nombres décimaux : Single, Double, Decimal, Currency.
• Valeurs booléennes : Boolean.
• Chaînes de caractères : String.
• Dates : Date.
• Union de tous les types : Variant.

Déclarations des variables


Les variables et les constantes sont déclarées Private par défaut. Elles peuvent être
déclarées Public ou Private de façon explicite.

Variables locales à une fonction ou à une procédure :


Exemples : Dim x As Integer, y As Double
Dim ch As String

Livre 7608-VBA.indb 1 07/08/12 07:05


2 ◆ Applications avec Excel

Variables globales à plusieurs procédures d’un même module :


Exemple : Dim resultat As Double (à placer en tête du code des procédures)

Variables globales dans un projet multimodule (applications avec formulaires…) :


Exemple : Public valeur As String (à placer en tête d’un module : Module1…)

Arguments d’une fonction ou d’une procédure :


Exemples : fct([ByVal ou ByRef] x As Integer,…) As Integer
proced([ByVal ou ByRef] y As Integer,…)

Affectation 
Voici quelques exemples de syntaxes de l’instruction d’affectation :
x = 4, z = x + y, u = f(t)

Entrée d’information
L’instruction InputBox assure le tranfert d’information du clavier à la mémoire
centrale. Elle s’écrit par exemple de la façon suivante :

x=InputBox("donne la valeur de x : ")

Sortie d’information
L’instruction MsgBox assure le transfert d’information de la mémoire centrale à l’écran.
Elle s’écrit par exemple de la façon suivante :

MsgBox "Le résultat vaut : " & res 

Instruction conditionnelle
L’instruction conditionnelle permet de construire une alternative en testant si la
condition est vraie ou non.
Syntaxes de l’instruction If…Then…Else…End If :
Forme standard Formes restreintes

If Condition Then •
If Condition Then
• Instruction n°1a • Instruction n°1a
• Instruction n°1b • Instruction n°1b
• (…) • (…)

Else •
End If
• Instruction n°2a •
• Instruction n°2b •
If Condition Then Instruction
• (…)

End If

Livre 7608-VBA.indb 2 07/08/12 07:05


Annexe A – Memento VBA ◆ 3

Forme imbriquée (cas général) Forme imbriquée (cas particulier)



If Condition1 Then •
If Condition1 Then
• If Condition2 Then • Instructions1
• Instructions2a •
ElseIf Condition2 Then
• Else • Instructions2
• Instructions2b •
ElseIf Condition3 Then
• End If • Instructions3

Else •
ElseIf (…)
• If Condition3 Then • (…)
• Instructions3a •
[Else
• Else • (…)]
• Instructions3b •
End If
• End If

End If

Syntaxe de l’instruction Select Case… :



Select Case Variable

Case Hypothèse_1
• Instructions_1

Case Hypothèse_2
• Instructions_2

(…)

[Case Else
• Instructions_n]

End Select

Instruction itérative
Deux cas sont à distinguer selon que le nombre de répétitions est connu a priori ou
bien qu’il dépend du contexte.

Le nombre de répétitions est connu a priori :


For var = val_début To val_fin [step p]
• Instruction n°1
• Instruction n°2
• (…)

Next var

Le nombre de répétitions dépend du contexte :


Les deux instructions utilisées dans cet ouvrage :

While Condition •
Do
• Instruction n°1 • Instruction n°1
• Instruction n°2 • Instruction n°2
• (…) • (…)

Wend •
Loop Until Condition

Livre 7608-VBA.indb 3 07/08/12 07:05


4 ◆ Applications avec Excel

Les quatre formes de Do…Loop… :

Cond : condition d’arrêt Cond : condition de continuation



Do •
Do
• Instruction n°1 • Instruction n°1
• (…) • (…)

Loop Until Cond •
Loop While Cond

Do Until Cond •
Do While Cond
• Instruction n°1 • Instruction n°1
• (…) • (…)

Loop •
Loop

Opérateurs
Il existe quatre familles d’opérateurs :
• Les opérateurs numériques : +, –, *, /.
^ : élévation à la puissance.
\ : division entière. Exemple : 23\3 donne 7.
Mod : reste de la division entière. Exemple : 23 Mod 3 donne 2.
• Les opérateurs de comparaison : <, <=, >, >=, =, <>.
• Les opérateurs logiques : And, Or, Not, Xor, Eqv.
• L’opérateur de concaténation : &.

Fonctions
Les fonctions effectuent des traitements informatiques et fournissent des résultats.

Syntaxe :


Function fexemple([ByVal ou ByRef] x As …, …) As …

Dim … 'déclaration des variables locales

(…)

Instruction n°1

Instruction n°2

(…)

fexemple = … 'valeur de retour

End Function

Exemples d’en-têtes de fonction :


• Function fnum(…, …) As Double : fonction numérique.
• Function fch(…, …) As String : fonction chaînes de caractères.
• Function fbool(…, …) As Boolean : fonction booléenne.

Livre 7608-VBA.indb 4 07/08/12 07:05


Annexe A – Memento VBA ◆ 5

Exemples d’appels de fonction : mettre des parenthèses


• val_res = fnum(a,b)
• ch_res = fch(ch1,x)
• bool_res = fbool(x,5)

Procédures
Les fonctions effectuent des traitements informatiques et agissent directement sur
l’environnement d’exécution, sans fournir de résultat.

Syntaxe :


Sub proced1() 'sans paramètres

ou Sub proced2([ByVal ou ByRef] x As …,…) 'avec paramètres

Dim … 'déclaration des variables locales
• (…)

Instruction n°1

Instruction n°2
• (…)

End Sub

Exemples d’en-têtes de procédure :


• Sub calcul() : sans paramètres.
• Sub etude(x As Integer, y As Integer) : avec deux paramètres.

Exemples d’appels de procédure : ne pas mettre de parenthèses


• Sans paramètre : calcul
• Avec paramètres : etude a, b
Les procédures et les fonctions sont déclarées Public par défaut. Elles peuvent être
déclarées Public ou Private de façon explicite.

ByVal et ByRef
Deux modes de transmission sont possibles lors de l’appel d’une fonction ou d’une
procédure :
• ByVal : le mode de transmission se fait par valeur, la valeur du paramètre d’appel
est transmise par recopie à l’argument correspondant de la fonction ou de la
procédure. Exemple : etude(ByVal x As Integer, ByVal y As Integer).
• ByRef  : le mode de transmission se fait par référence, l’adresse du paramètre
d’appel est transmise à l’argument correspondant de la fonction ou de la procédure.
Exemple : etude(ByRef x As Integer, ByRef y As Integer).

Livre 7608-VBA.indb 5 07/08/12 07:05


6 ◆ Applications avec Excel

Par défaut, les arguments des fonctions et des procédures sont déclarés ByRef. Exemple :
etude(x As Integer, y As Integer).

Fonctions prédéfinies
Voici quelques exemples de fonctions prédéfinies du langage VBA :
• Mathématiques : Abs(x), Sqr(x), Cos(x), Sin(x), Tan(x), Exp(x), Log(x), Int(x),
Fix(x), Round(x,nb)…
• Chaînes de caractères  : Len(ch) , InStr(ch,ch2) , Mid(ch,d,n) , Mid(ch,d) ,
Left(ch,n), Right(ch,n), Replace(ch,ch1,ch2), Trim(ch), Ltrim(ch), Rtrim(ch),
Lcase(ch), Ucase(ch)…
• Conversion des données : Asc(ch), CInt(ch), CDbl(ch), CLng(ch), Chr(n), CStr(n)…

Nombres aléatoires
Les nombres aléatoires sont calculés de la façon suivante :
• Randomize : réinitialise le processus aléatoire.
• Rnd() : donne un nombre aléatoire décimal tel que 0 <= Rnd() <1.
• Int(b – a + 1) * Rnd() + a) : donne des nombres entiers aléatoires compris
entre a et b, bornes comprises.
Exemple : Int(6  *  Rnd()  +  1) : donne des nombres entiers compris entre 1 et 6
(tirage d’un dé).

Livre 7608-VBA.indb 6 07/08/12 07:05


B
Les objets Excel

Les applications Excel mettent en jeu de nombreux objets qui sont définis selon un
modèle. Les classeurs, les feuilles de calcul et les cellules peuvent être représentés par
des variables objets. Il en est de même pour les objets de contrôle et les formulaires.
Voici une présentation synthétique de ces variables et de leurs propriétés.

Types, collections et variables objets


Le modèle objet d’Excel est structuré par plusieurs classes. Les classes les plus impor-
tantes sont définies par les types suivants :
• Object : la classe la plus générale.
• Application : l’application Excel elle-même.
• Workbook : la classe des classeurs.
• Worksheet : la classe des feuilles de calcul.
• Range : la classe des plages de cellules.
Le modèle objet comporte aussi plusieurs collections :
• Workbooks : l’ensemble des objets classeurs.
• Worksheets : l’ensemble des objets feuilles de calcul.
• Charts : l’ensemble des objets graphiques.
• Sheets : l’ensemble des objets feuilles de calcul et des objets graphiques.

Exemple de déclaration de variables objets :



Dim cls As Workbook, fe As Worksheet, plage As Range

Set cls = Workbooks("Exemple.xls")

Set fe = cls.Worksheets("Stock")

Set plage = fe.Range("B1:C5")

ou bien :

Set plage = Workbooks("Exemple.xls").Worksheets("Stock").Range("B1:C5")

Livre 7608-VBA.indb 1 07/08/12 07:05


2 ◆ Applications avec Excel

Les collections regroupent les objets du type correspondant :


• Workbooks("Exemple.xls") est un objet de la collection Workbooks, de type Workbook.
• Worksheets("Stock") est un objet de la collection Worksheets, de type Worksheet.
• Écriture particulière : Range("B1:C5") définit une collection de cellules, de type
Range.
• Set… affecte à chaque variable l’adresse de l’objet correspondant.
Les déclarations peuvent être allégées s’il n’y a qu’un classeur et qu’une feuille de calcul
dans l’application étudiée. Dans ce cas, on peut écrire : Set plage = Range("B1:C5").

Désignation des cellules


Les cellules peuvent être désignées sans déclaration préalable des variables objets ou
bien avec une déclaration préalable des variables objets.

Sans déclaration des variables objets


• Range("A2") désigne la cellule A2 de la feuille active.
• Range("A2:B5") désigne la plage A2:B5 de la feuille active.
• Range("A2:B5").Cells(i, j) désigne la cellule de la ième ligne et de la jième colonne
relative à la plage A2:B5.
• Range("A2:B5").Cells(1, 1) désigne la cellule A2 car Cells(i, j) commence
à 1, 1.
• Range("A2:B5").Cells(3, 2) désigne la cellule B4.
Lorsqu’il n’y a qu’une seule feuille de calcul :
• Cells(i, j) désigne la cellule de la ième ligne et de la jième colonne de la feuille de
calcul.
• Cells(3, 2) désigne la cellule B3 de la feuille active.
• Cells(i, 2) désigne la cellule de la ième ligne de la deuxième colonne de la feuille
active.

Avec déclaration des variables objets


Premier exemple :
• Dim p as Range déclare la variable p comme une variable de type Range.
• Set p = Range("B2:D8") affecte à la variable p l’adresse de la plage B2:D8.
• p.Cells(i, j) désigne la cellule de la ième ligne et jième colonne relative à la plage
B2:D8.
• p.Cells(1, 1) désigne la cellule B2 car Cells(i, j) commence à 1, 1.
• p.Cells(3, 2) désigne la cellule C4.

Livre 7608-VBA.indb 2 07/08/12 07:05


Annexe B – Les objets Excel ◆ 3

Deuxième exemple :
• Set p = Range("B1:B5") affecte à la variable p l’adresse de la plage B1:B5.
• p.Cells(i) désigne la cellule de la ième ligne relative à la plage B1:B5 (une seule
colonne).

Troisième exemple :
• Dim c as Range déclare la variable c comme une variable de type Range.
• Set c= Range("C3") affecte à la variable c l’adresse de la cellule C3.
• c.Offset(i, j) désigne la cellule obtenue par le déplacement i,j à partir de la
cellule C3.
• c.Offset(0, 0) désigne la cellule C3 car Offset(i, j) commence à 0, 0.
• c.Offset(1, 0) désigne la cellule C4.
• c.Offset(2, 1) désigne la cellule D5.
• c.Offset(–1, 1) désigne la cellule D2.

Valeur d'une cellule


La propriété Value permet de définir la valeur d’une cellule :
• Range("A2").Value donne la valeur de la cellule A2.
• x=Range("A2").Value affecte à x la valeur de la cellule A2.
• p.Cells(i, j).Value donne la valeur d’une cellule relative à la plage p.
• c.Offset(i, j).Value donne la valeur d’une cellule définie à partir de la cellule c.

Lignes et colonnes d’une plage


Les plages de cellules sont structurées par des lignes et des colonnes :
• p.Rows désigne la collection des lignes de la plage p.
• p.Rows.Count donne le nombre de lignes de la plage p.
• p.Columns désigne la collection des colonnes de la plage p.
• p.Columns.Count donne le nombre de colonnes de la plage p.
• p.Count donne le nombre total de cellules de la plage p.

Plage et cellule sélectionnées par l'utilisateur


Toute plage et toute cellule sélectionnée par l’utilisateur au sein de la feuille de calcul
peut être représentée par une variable objet de type Range :
• Set p = Selection : lorsqu’une plage a été sélectionnée, Selection attribue à p
l’adresse de cette plage.
• Set c = ActiveCell : lorsqu’une cellule a été sélectionnée, ActiveCell affecte à c
l’adresse de cette cellule.

Livre 7608-VBA.indb 3 07/08/12 07:05


4 ◆ Applications avec Excel

Actions sur les cellules


Plusieurs actions sont possibles sur les cellules :
• p.ClearContents efface le contenu des cellules de la plage p.
• p.Clear efface le contenu et le formatage des cellules de la plage p.
• c.Interior.Pattern = xlPatternNone efface la couleur de la cellule c.

Couleurs dans les cellules


Deux modalités permettent de colorier des cellules :
• c.Interior.Color = RGB(x, y, z) met une couleur au sein de la cellule c qui
dépend des valeurs de x, y et z.
• c.Interior.ColorIndex = i met la couleur n° i au sein de la cellule c (la couleur
fait partie d’un panel de 56 couleurs).

Objets de contrôle
Les objets de contrôle jouent le rôle d’interface entre l’utilisateur et les applications
Excel. Ils peuvent faire partie d’objets formulaires. Leurs caractéristiques principales
sont les suivantes :
• Types : Label, TextBox, ListBox, ComboBox, CommandButton, CheckBox, OptionButton,
ScrollBar…
• Propriétés : Name, Caption…
• Méthodes : selon les types.
• Événements : Click, DblClick…

Objets formulaires
Les formulaires sont des objets d’interfaces entre l’utilisateur et l’application. Leurs
caractéristiques principales sont les suivantes :
• Types : UserForm
• Propriétés : Name, Caption…
• Méthodes : Show, Hide, Load, Unload…
• Événements : Initialize, Activate, Desactivate, Click, DblClick…

Livre 7608-VBA.indb 4 07/08/12 07:05


C
Création des programmes VBA,
des formulaires et des boutons
de commande

L’éditeur proposé par Microsoft, appelé VBE (Visual Basic Editor), est indispensable
pour éditer et exécuter tous les programmes VBA, et pour créer les formulaire avec
tous leurs composants (boutons, zones de texte…). En revanche, il est possible de
créer des boutons de commande directement sur les feuilles de calcul sans utiliser
l’éditeur VBE.

Paramétrage de l’éditeur VBE


Avant d’éditer le texte du premier programme, il faut créer un accès à l’éditeur, choisir
un niveau de sécurité des programmes et introduire deux options recommandées
pour l’édition.

Création de l’onglet Développeur 


L’accès à l’éditeur VBE se fait en créant l’onglet Développeur. Plusieurs actions sont
nécessaires :
1. Cliquer sur l’onglet Fichier.
2. Choisir Options.
3. Choisir Personnaliser le ruban.
4. Dans le cartouche de droite, cocher l’option Développeur, puis cliquer sur OK.
Sélectionner ensuite l’onglet Développeur pour le faire apparaître.

Livre 7608-VBA.indb 1 07/08/12 07:05


2 ◆ Applications avec Excel

Niveaux de sécurité
Il faut ensuite définir le niveau de sécurité des programmes en procédant de la façon
suivante :
• Cliquer sur le bouton « Sécurité des macros » de l’onglet Développeur, puis choisir
le niveau qui convient parmi les quatre niveaux proposés.
• La deuxième option, « Désactiver les macros avec notification », peut être retenue.

Ouverture de l’éditeur VBE


L’accès à la fenêtre de l’éditeur VBE peut être obtenu en sélectionnant l’onglet
Développeur, puis en cliquant sur l’icône « Visual Basic » située à gauche. La frappe
de Alt + F11 aboutit au même résultat.

Options recommandées pour l’édition


Deux options sont recommandées pour faciliter l’édition :
• La première option rend obligatoire la déclaration des variables. L’éditeur VBE
étant ouvert, sélectionner Outils>Options, puis choisir Éditeur et cocher « Décla-
ration des variables obligatoire ».
• La deuxième option permet un meilleur suivi concernant la vérification de la
syntaxe des programmes. L’éditeur VBE étant ouvert, sélectionner Outils>Options,
puis choisir Éditeur et cocher « Vérification automatique de la syntaxe ».

Création d’un programme


L’éditeur VBE étant ouvert, les modalités de création d’un programme sont les
suivantes :

Édition d’un premier programme


Sélectionner Insertion>Module : le Module1 est créé et la fenêtre Module1(Code)
est activée.

Édition d’un nouveau programme 


• Au sein du même module : éditer le texte à la suite des autres programmes au sein
du module. Si le texte des programmes déjà enregistrés n’apparaît pas, cliquer sur
Modules>Module1 de la fenêtre VBAProject.
• Au sein d’un nouveau module : sélectionner Insertion>Module. Le module suivant
est créé (Module2, Module3…) et la fenêtre correspondante est activée.

Exécution d’un programme 


Pour exécuter un programme, placer le curseur à l’intérieur du texte du programme,
sélectionner Exécution>Exécuter Sub/UserForm ou bien cliquer sur « Macros » de
l’onglet Développeur, puis sélectionner le nom du programme au sein de la fenêtre Macro.

Livre 7608-VBA.indb 2 07/08/12 07:05


Annexe C – Création des programmes VBA, des formulaires et des boutons… ◆ 3

Sauvegarde des programmes


Il est nécessaire de sauvegarder les applications Excel qui contiennent les programmes,
même si ceux-ci n’utilisent pas de feuilles de calcul. Le format à utiliser est « Classeur
Excel (prenant en charge les macros) », qui crée un fichier dont l’extension est .xlsm.

Création d’un formulaire


Pour créer un formulaire, il faut créer l’objet correspondant constitué de tous ses
composants, puis associer à chaque bouton le code des procédures VBA.

Objet formulaire et ses objets contrôles 


La création d’un formulaire se fait en effectuant les actions suivantes :
1. Ouvrir l’éditeur VBE puis sélectionner Insertion>UserForm : l’objet formulaire
UserForm1 apparaît.
2. Cliquer du bouton droit sur l’image du formulaire, puis sélectionner « Propriétés » :
donner une nouvelle valeur à la propriété Name (nom de la variable qui désigne
l’objet formulaire), et donner une nouvelle valeur à la propriété Caption (le titre
de l’objet formulaire).
3. Mettre au sein de l’objet formulaire les différents objets contrôles en ouvrant tout
d’abord la Boîte à outils (le Mode Création est activé), puis, pour chaque objet :
a. Sélectionner l’objet à insérer au sein de la Boîte à outils ;
b. Le faire glisser au sein de l’objet formulaire en le positionnant au bon endroit ;
c. Donner éventuellement une nouvelle valeur à la propriété Name (nom de la
variable qui désigne l’objet) et à la propriété Caption de l’objet.

Texte du programme associé à un bouton


À chaque bouton appartenant au formulaire doit être associé le code d’un programme.
Les actions suivantes sont nécessaires :
1. Cliquer du bouton droit sur l’un des boutons insérés au sein de l’objet formulaire,
sélectionner « Code ».
2. Écrire le texte au sein du squelette fourni par la page de l’éditeur associée au
formulaire.

Accès aux propriétés et au code associé


Si des modifications sont à introduire dans la définition du formulaire et des boutons,
il convient de procéder de la façon suivante :
• Formulaire : cliquer du bouton droit sur l’image du formulaire, puis sélectionner
« Propriétés » ou sélectionner « Code ».
• Bouton du formulaire : cliquer du bouton droit sur l’image du bouton, puis sélec-
tionner « Propriétés » ou sélectionner « Code ».

Livre 7608-VBA.indb 3 07/08/12 07:05


4 ◆ Applications avec Excel

Création d’un bouton de commande sur une feuille Excel


Pour créer un bouton de commande sur une feuille Excel, il faut placer l’icône du
bouton sur la feuille, puis donner des valeurs aux propriétés de l’objet et lui associer
le code correspondant.

Création d’un objet bouton 


• Pour créer un objet bouton, il faut, sans ouvrir l’éditeur VBE :
1. Cliquer sur l’icône « Insérer des contrôles » située au milieu de l’onglet Développeur.
2. Mettre l’objet bouton sur la feuille Excel après l’avoir sélectionné au sein de la
partie « Contrôles ActiveX ».
• Le Mode Création est automatiquement activé.

Accès aux propriétés et au code associé


Deux modalités sont possibles lorsque le Mode Création est actif :
• Clic sur « Propriétés » de l’onglet Développeur pour accéder aux propriétés de
l’objet bouton, et clic sur « Visualiser le code » de l’onglet Développeur pour
accéder à la page de l’éditeur.
• Cliquer du bouton droit sur l’image du bouton, puis sélectionner « Propriétés » et
cliquer du bouton droit sur l’image du bouton, puis sélectionner « Visualiser le
code ».

Les propriétés de l’objet bouton 


Un objet bouton est défini par son nom et son intitulé :
1. Le nom est introduit en donnant une nouvelle valeur à la propriété Name. Exemple :
Btn_Calcul.
2. L’intitulé est introduit en donnant une nouvelle valeur à la propriété Caption.
Exemple : CALCUL.

Le code associé
À chaque bouton doit être associé le code d’une procédure VBA. Il convient d’écrire
le texte au sein du squelette fourni par la page d’édition Feuil1(Code) :

Sub Btn_Calcul_Click()
• Code à écrire

End Sub

Livre 7608-VBA.indb 4 07/08/12 07:05


Annexe C – Création des programmes VBA, des formulaires et des boutons… ◆ 5

Exécution de la procédure associée


Pour exécuter le code de la procédure associée, il faut désactiver le Mode Création,
puis cliquer sur l’image du bouton pour lancer l’exécution.

Modifications
Si des modifications sont à introduire dans la définition de l’objet bouton, il convient
de procéder de la façon suivante :
• Réactiver si nécessaire le Mode Création, puis cliquer sur « Propriétés » ou sur
« Visualiser le code » de l’onglet Développeur.
• Ou bien cliquer du bouton droit sur l’image du bouton, puis sélectionner
« Propriétés » ou « Visualiser le code ».

Livre 7608-VBA.indb 5 07/08/12 07:05


Livre 7608-VBA.indb 6 07/08/12 07:05

Vous aimerez peut-être aussi