7608 Corriges

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 33

Corrigs des exercices

Chapitre 2
1. Rsultats du programme calcul3()
La gure 14.1 donne le droulement de lexcution du programme calcul3().
x
y
z
x x x
y y y
z z z
x=40
y=8
z=x-y x=x+11
y=y-2
z=x-y
40
8
40
8
51
6
32
51
6
45 32
tape 1 tape 2 tape 3 tape 4
Figure 14.1 Les 4 tapes.
ltape 2, la variable z prend la valeur 32. ltape 4, la variable z prend la valeur 45.
2. Rsultats du programme calcul4()
Six variables sont dnies par le programme calcul4() : x, y, z, x1, y1 et z1. Elles sont
toutes de type Double. Le droulement de lexcution du programme est le suivant :
1. x = 2/3 : 2/3 est calcul, puis sa valeur 0.666666666666667 est affecte x. Le rsultat
est donn avec 15 dcimales.
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 dabord calcule. 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 dcimales, soit 2 dcimales. Elle fournit comme
rsultat 0.67 et x1 prend la valeur 0.67.
5. y1 = Round(y, 2) : de la mme faon, la fonction Round(y, 2) calcule la valeur
arrondie de y avec 2 dcimales. La variable y1 vaut alors 0.57.
Livre 7608-VBA.indb 1 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
2 Introduction la programmation avec VBA
6. z1 = x1 + y1 : z1 vaut la somme 0.67 + 0.57, cest--dire 1.24 qui est le rsultat calcul
par le programme.
3. Extraction des chifres dun nombre
Le tirage au hasard dun nombre compris entre 1000 et 9999 est obtenu en utilisant la
fonction Int(9000 * Rnd() + 1000) et en affectant ce rsultat la variable tudie. Pour
obtenir le chiffre de lunit, puis celui de la dizaine, puis celui de la centaine et enn
celui du millier, il faut effectuer des divisions entires laide des oprateurs \ et Mod.
Voici le texte du programme. Il utilise les variables val (valeur du nombre tudier),
nbu (valeur de lunit), 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. Prnom, anne de naissance et ge
Le programme prenom_age() est dni avec trois variables :
prenom de type String : la valeur est donne par lutilisateur.
annee de type Integer : la valeur est aussi donne par lutilisateur.
age de type Integer : la valeur est calcule par le programme.
Si lon veut quil afche comme rsultat "Alexandre tu as 23 ans. Bonne chance!",
il faut que la chane de caractres afcher grce linstruction MsgBox soit structure
de la faon suivante :
prenom & " tu as " & age & " ans. Bonne chance!"
La chane est constitue de la valeur de la variable prenom, puis de la chane " tu as ",
puis de la valeur de la variable age, et enn de la chane " ans. Bonne chance!". Notez
que les deux chanes contiennent des espaces de faon que les mots de la chane nale
soient spars les uns des autres.
Livre 7608-VBA.indb 2 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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 prnom ?")
annee = InputBox("quelle est ton anne de naissance ?")
age = 2012 - annee
MsgBox prenom & " tu as " & age & " ans. Bonne chance!"
End Sub
Si lon veut que le rsultat soit afch sur deux lignes au sein de la bote de dialogue,
il faut introduire le caractre spcial vbCr de la faon suivante :
MsgBox prenom & " tu as " & age & " ans." & vbCr & "Bonne chance!"
2. Numro de Scurit sociale
Soit ch la variable qui enregistre le numro de Scurit sociale donne par lutili-
sateur, et soit les variables sexe, annee, mois, departement, numero_registre et cle les
variables de type String qui vont servir mmoriser les diverses informations issues
du numro de Scurit sociale.
Tout numro de Scurit sociale se prsente comme lindique la gure 14.2.
1 78 07 64 386 097 52
1 3 6 9 12 20 Positions
N SS
Figure 14.2 Structure dun numro de Scurit sociale.
Pour extraire chaque information du numro de Scurit sociale, il faut employer
plusieurs fois la fonction Mid(ch, d, n) qui extrait n caractres de la chane ch partir
de la position d. Les caractres tant numrots partir de 1, les nombres 1, 3, 6, 9, 12
et 20 donnent les positions des dbuts de chaque partie considrer.
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("Numro de Scurit Sociale " & vbCr _
& "(avec un espace entre chaque lment) ?")
sexe = Mid(ch, 1, 1)
Livre 7608-VBA.indb 3 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
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 _
& "Dpartement : " & departement & vbCr _
& "Numro registre : " & numero_registre & vbCr _
& "Cl : " & cle
End Sub
3. Calculs concernant un emprunt
Soit les variables suivantes :
montant : le montant de lemprunt.
taux : le taux dintrt annuel ; do la variable t dnie par t = taux / 12 qui
donne le taux mensuel.
nb_annees : dure de lemprunt ; do la variable nb dnie par nb = nb_annees * 12
qui donne le nombre de mois de la dure de lemprunt.
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 demands :
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'intrt annuel (exemple : 5,5) ?")
taux = taux / 100
Livre 7608-VBA.indb 4 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 5
nb_annees = InputBox("Dure de l'emprunt (nb annes) ?")
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
Lquation du second degr ax
2
+ bx + c = 0 est dnie avec les coefcients numriques
a, b et c, le coefcient a devant tre diffrent de 0. Les valeurs des racines dpendent
de la valeur du discriminant b
2
4 a c.
Soit discrim la variable qui donne la valeur du discriminant. Trois cas sont distinguer
pour calculer les racines de lquation :
Si la valeur de discrim est positive, les racines sont donnes 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 ngative, il ny a pas de racines relles.
Avant ltude de ces trois cas, il convient de vrier si le coefcient a est bien diffrent
de 0.
Le programme est structur par une instruction conditionnelle imbrique qui examine
tous les cas prsents 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
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 relles"
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 alatoires donns par
la fonction Int(500 * Rnd() + 1), et soit seuil la variable dont la valeur positive est
donne par lutilisateur laide de linstruction InputBox.
Pour rsoudre le problme, il faut tout dabord calculer la valeur absolue de la diffrence
x y. Soit diff la variable qui reoit la valeur x y. Si da diffrence est ngative, il suft
dattribuer la valeur diff la variable diff en crivant If diff < 0 Then diff = diff.
Cette instruction IfThen(sans Else) rend alors positive la valeur de la diffrence,
donnant ainsi la valeur absolue (la valeur absolue dun nombre est toujours positive).
La comparaison peut ensuite tre faite entre cette valeur positive et la valeur du seuil
laide dune instruction conditionnelle If ThenElseEnd If.
Le programme nbsproches() fournit alors les rsultats.
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 lutilisateur donne 200 comme valeur de la
variable seuil, les deux nombres x et y sont proches car la variable diff vaut +139,
valeur infrieure 200.
Livre 7608-VBA.indb 6 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 7
3. Une loterie de 1 500
Soit nb la variable dont la valeur est tire au hasard par la fonction Int(500 * Rnd() + 1)
qui donne un rsultat 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 premire est dnie avec une succession dinstructions IfThen (sans
Else). La seconde est structure par linstruction 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 dni avec linstruction 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
8 Introduction la programmation avec VBA
Notez les deux formulations lorsque le programme examine si la variable nb vaut 201
ou 202 :
Linstruction conditionnelle dnit la condition avec loprateur logique Or :
If nb = 201 Or nb = 202 Then gain = 1000
Linstruction Select Case donne les deux valeurs possibles en les numrant :
Case 201, 202
gain = 1000
Chapitre 5
1. Somme et moyenne de plusieurs nombres
Le programme est construit avec quatre variables : x reoit la valeur du nombre donn
par lutilisateur, som permet de calculer la somme des nombres x, nb permet de compter
le nombre des nombres donns par lutilisateur, 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 arrter le processus , tapez -1")
While x <> -1
som = som + x
nb = nb + 1
x = InputBox("Donnez un nombre positif :" & vbCr _
& "Pour arrter 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 linstruction WhileWend avec la condition x <> 1.
Lorsque x vaut 1, linstruction itrative arrte son excution, 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 9
2. Calcul de U
n
Pour calculer U
n
= a U
n 1
+ b U
n 2
partir des valeurs de a, b, U
0
, U
1
et n donnes
par lutilisateur, plusieurs variables sont ncessaires :
Les variables a, b et n enregistrent les valeurs donnes au clavier.
Les variables U0 et U1 mmorisent les deux valeurs initiales U
0
et U
1
donnes par
lutilisateur.
Les variables U, V et W vont effectuer le calcul demand lors de lexcution de
laffectation : U = a * V + b * W.
Le texte du programme utilise aussi la variable i pour compter le nombre de rptitions
effectues. 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
(cest--dire U
1
) et que W vaut U0 (cest--dire U
0
). La valeur de U est donc la valeur
U
2
. Puis W prend la valeur de V, cest--dire U
1
, et V prend la valeur de U, cest--dire
U
2
. Au tour suivant, U va donc prendre la valeur de a U2 + b U1, qui est la valeur
de U
3
. Le mme processus reproduit plusieurs fois permet de calculer de proche en
proche la valeur U
n
pour n donn par lutilisateur.
3. Calcul de la valeur actuelle nette
La formule nancire qui donne la valeur actuelle nette (VAN) la date 0 est la
suivante :
F
i
(1 + t)
i
I
Livre 7608-VBA.indb 9 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
10 Introduction la programmation avec VBA
Elle dnit une somme pour i allant de 1 nb_annees, en mettant en jeu les lments
suivants :
F
i
dnit le ux net de trsorerie de la priode i : la variable ux reprsentera ces
quantits au sein du programme.
t est le taux dactualisation : la variable taux donnera sa valeur au sein de la somme
calculer.
I est le montant de linvestissement 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 ux 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'annes ?")
somme = -invest_init
For i = 1 To nb_annees
ux = InputBox("Flux de trsorerie anne " & i)
somme = somme + ux * (1 + taux) ^ -i
Next i
VAN = somme
MsgBox VAN
End Sub
Le programme permet lutilisateur de donner les valeurs de linvestissement initial,
du taux dactualisation et du nombre dannes prendre en compte.
Le calcul de la VAN se fait en initialisant la variable somme avec la valeur ngative
invest_init. Il se poursuit en ajoutant les quantits ux * (1 + taux) ^ i la somme
dj calcule, la valeur de la variable ux tant donne chaque fois par lutilisateur.
Au terme du calcul, la variable somme a pour valeur la valeur actuelle nette recherche.
Exemple : si linvestissement initial vaut 10000, le taux dactualisation 0,1, le nombre
dannes 4 et si les ux nets de trsorerie valent 3500, 3000, 3200 et 3400, le rsultat
vaut 387,610. La VAN est alors positive.
Livre 7608-VBA.indb 10 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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
suprieure ou gale celle de maxinf.
Le programme tudie chaque valeur x tire au hasard :
Si x est suprieure maxsup, deux mises jour sont ncessaires : maxinf doit prendre
la valeur de maxsup et maxsup doit prendre la valeur de x.
Sinon (x est infrieure ou gale maxsup) et si x est suprieure 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 dun mot
Le mot donn au clavier est enregistr par la variable ch. Ce mot contient Len(ch)
caractres.
Pour tudier si les caractres de la chane ch sont tous diffrents, il suft de comparer
le i
me
caractre de ch avec tous les autres caractres de la sous-chane commenant
en i + 1, en faisant ltude 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
12 Introduction la programmation avec VBA
Listing 14.13: lettresdiff()
Sub lettresdiff() 'premire 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 diffrentes")
Else
MsgBox ("lettres NON toutes diffrentes")
End If
End Sub
Une double boucle permet de structurer ltude des caractres : la boucle extrieure est
dnie par la variable i allant de 1 Len(ch) 1 et la boucle intrieure 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
caractre est gal ou non au j
ime
caractre de la chane ch. Si tous les
caractres sont diffrents, la variable nb garde sa valeur initiale qui vaut 0.
3. Palindrome
Soit ch la chane de caractres tudier. Soit i la variable qui donne la position des
caractres partir du dbut de la chane et j la variable qui donne la position des
caractres partir de la n de la chane. Pour dterminer si ch est un palindrome
ou non, il faut comparer le premier et le dernier caractre, puis le deuxime et
lavant-dernier, etc. Il suft donc de comparer le i
me
caractre et le j
ime
caractre
autant de fois que ncessaire en augmentant i de 1 et en diminuant j de 1 aprs
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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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 nest pas le cas du mot
radars (avec un s).
Chapitre 7
1. Valeurs cumules
Le premier tableau tab1 contient les dix valeurs numriques donnes par lutilisateur
et le second tableau tab2 enregistre les valeurs cumules. La i
me
valeur cumule est
calcule en faisant la somme de la i
me
valeur du tableau initial tab1(i) et de la valeur
cumule tab2(i 1) calcule prcdemment :
tab2(i) = tab1(i) + tab2(i - 1)
Il faut alors excuter cette instruction pour toutes les valeurs de i allant de 2 10. Pour
la valeur i = 1, il suft dattribuer 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
14 Introduction la programmation avec VBA
2. Deux valeurs successives gales?
Le tableau t est constitu de 15 lments. Chaque lment du tableau a pour valeur
un nombre tir au hasard.
La proprit recherche (existe-t-il deux valeurs successives gales ?) ne concerne
que quelques lments du tableau et non pas tous les lments. Il convient alors de
supposer a priori que la proprit nest pas vrie et daffecter la variable prop la
valeur 1. Mais ds 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
signier que la proprit recherche est vrie.
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
Linstruction itrative WhileWend 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 cest le cas, la variable prop prend la valeur 0, ce qui rend alors la condition
du While fausse, arrtant ainsi lexcution de cette instruction.
Le test nal 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 signie que le programme na pas constat lgalit recherche :
il ny a donc pas deux valeurs successives gales au sein du tableau.
Livre 7608-VBA.indb 14 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 15
Chapitre 8
1. Calcul de e
x

e
x
qui vaut 1 + x + x
2
/ 2! + x
3
/ 3!++ x
n
/ n peut scrire sous la forme 1 + x
k
/ k!,
pour k allant de 1 n.
En langage VBA, x
k
/ k! scrit (x ^ k) / facto(k), le caractre ^ signiant puissance,
et facto(k) tant une fonction qui calcule la factorielle de k.
Pour calculer e
x
, il suft donc de rpter n fois laffectation suivante :
res = res + (x ^ k) / facto(k)
dans laquelle res permet de calculer la somme totale aprs avoir t initialise 1.
Le code du programme est constitu dune procdure et dune fonction :
La procdure exp() permet lutilisateur de donner les valeurs de x et de n, puis
elle effectue le calcul en utilisant une boucle ForNext
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 rsultat vaut 7.38905609538414.
2. Gestion dun tableau de notes
Le programme gestion_notes() assure la gestion dun tableau de notes laide de
trois procdures :
ajout_note() : elle ajoute une note au tableau de notes.
afchage_notes() : elle afche toutes les notes.
moyenne_notes() : elle calcule la moyenne des notes.
Livre 7608-VBA.indb 15 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
16 Introduction la programmation avec VBA
Nous avons dni deux variables globales : tnotes qui dnit un tableau de 15 notes
et nbnotes qui donne le nombre de notes mises au sein du tableau. Ces deux variables
globales sont dclares en tte du texte et sont utilises par chacune des procdures.
Voici le texte complet des quatre procdures.
Listing 14.18: gestion_notes(), ajout_note(), afchage_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: afchage des notes" & vbCr _
& "3: moyenne des notes" & vbCr _
& "4: FIN")
If rep = 1 Then ajout_note
If rep = 2 Then afchage_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 afchage_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 procdure gestion_notes() propose quatre choix lutilisateur :
Sil tape 1, cest la procdure ajout_note() qui sexcute.
Sil tape 2, cest la procdure afchage_notes() qui sexcute.
Sil tape 3, cest la procdure moyenne_notes() qui sexcute.
En revanche, sil tape 4, aucune procdure nest appele, la condition du While
devient fausse et le programme met n son excution.
Livre 7608-VBA.indb 16 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 17
3. Une fonction personnalise
Le nombre de combinaisons calculer est dni laide de deux paramtres n et p,
et vaut n! / (p! * (n p)!).
En langage VBA, cette expression scrit 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 dj dni (voir listing 14.17), le texte de la
fonction personnalise 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 dune srie de nombres
Le programme est structur avec les variables suivantes :
p dsigne la plage B1:D10 qui contient la srie des nombres tudier (colonne B)
et les rsultats recherchs (colonnes C et D).
seuil enregistre la valeur donne par lutilisateur.
i dsigne la ligne du i
me
nombre de la srie des nombres.
j dsigne la ligne du j
ime
nombre ajouter dans la colonne C (nombres infrieurs
la valeur de seuil) ; k dsigne la ligne du k
ime
nombre ajouter dans la colonne
D (nombres suprieurs 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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
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 srie des nombres est donn par la variable p.Cells(i, 1).Value.
Si cette valeur est infrieure la valeur de seuil, ce nombre est recopi dans la deuxime
colonne de la plage au sein dune cellule de coordonnes (j, 2), puis j est augment
de 1. Sinon, ce nombre est recopi dans la troisime colonne de la plage au sein dune
cellule de coordonnes (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) Rsultats ---
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 dsigne la cellule A1.
Le programme excute les actions suivantes :
1. Valeurs de i. Les valeurs de i allant de 1 10 sont places 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 places au sein des cellules de
la plage B1:K1 (sur la ligne 1).
3. Rsultats. Les rsultats des calculs sont affects 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 affecte la cellule c.Offset(i, j).
3. Efectifs et frquences cumules
Voici le code du programme.
Livre 7608-VBA.indb 18 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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 cumuls ---
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) Frquences relatives ---
For i = 1 To nblig
pl.Cells(i).Offset(0, 2).Value = pl.Cells(i).Value / s
Next i
'---(3) Frquences relatives cumules ---
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 conu pour que lutilisateur slectionne tout dabord une plage de
cellules une seule colonne dans laquelle il va mettre les effectifs examiner. Cette
colonne est dsigne par la variable pl. Puis le programme calcule le nombre de lignes
de la plage pl en excutant nblig = pl.Rows.Count.
Le programme effectue ensuite les trois traitements demands.
1. Calcul des effectifs cumuls. La valeur initiale des effectifs cumuls est la premire
valeur des effectifs. Do la premire affectation :
pl.Cells(1).Offset(0, 1).Value = pl.Cells(1).Value.
Pour dterminer la i
me
valeur des effectifs cumuls, il faut faire la somme de la i
me

valeur de leffectif tudi et de la (i 1)
me
valeur de leffectif cumul dj calcule.
Le rsultat de la somme est affect la variable s. Le calcul est schmatis par la
gure 14.3.
ligne i
ligne i-1
pl.Cells(i-1).Offset(0,+1)
pl.Cells(i)
pl.Cells(i).Offset(0,+1)=s
+1
137 21
116
Figure 14.3 Le calcul du i
me
efectif cumul.
Livre 7608-VBA.indb 19 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
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 recherche. Elle est affecte la cellule dsigne par
pl.Cells(i).Offset(0, 1) car cest elle qui doit contenir la i
me
valeur des effectifs
cumuls. Le calcul ainsi dni est rpt 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 frquences relatives. Chaque valeur est le quotient de la i
me
valeur de
leffectif initial par la somme des effectifs s. Elle vaut donc pl.Cells(i).Value / s,
et sa valeur est affecte la i
me
cellule de la deuxime colonne des rsultats qui
est dnie par pl.Cells(i).Offset(0, 2). Do laffectation quil faut excuter
nblig fois :
pl.Cells(i).Offset(0, 2).Value = pl.Cells(i).Value / s
3. Calcul des frquences relatives cumules. Chaque valeur est le rsultat de la
division de la frquence cumule par la somme des effectifs. Elle vaut donc
pl.Cells(i).Offset(0, 1).Value / s. Sa valeur est ensuite affecte la i
me
cellule
de la troisime colonne des rsultats. Le code suivant doit alors tre excut 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 donne par la gure 14.4.
CALCUL
Btn_Calcul
TextBox1
TextBox2 Le deuxime nombre
Le troisime nombre
Le premier nombre
TextBox3
TextBox4
UF_3nbs
Figure 14.4 La maquette du formulaire.
La variable UF_3nbs dsigne lobjet formulaire et cet objet est afch par la procdure
trois_nbs() dont voici le code (on peut aussi dnir un bouton de commande).
Livre 7608-VBA.indb 20 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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 associe la procdure
Btn_Calcul_Click(). Celle-ci examine la valeur des trois nombres donns par luti-
lisateur et dtermine si lun dentre eux est gal ou non la somme des deux autres.
Voici le code de cette procdure.
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 srie des nombres tudier. Le bouton de commande
Btn_Calcul, intitul CALCUL , permet dafcher le formulaire UF_Nbproche lors
de lexcution du code suivant :
Private Sub Btn_Calcul_Click()
UF_Nbproche.Show
End Sub
Lorsque lutilisateur clique sur le bouton du formulaire intitul Nombre Proche ,
la procdure associe recherche alors le nombre le plus proche parmi les dix nombres
situs en B1:B10. La gure 14.5 donne un tat de la feuille de calcul aprs le traitement.
Figure 14.5 La feuille de calcul aprs le traitement.
Livre 7608-VBA.indb 21 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
22 Introduction la programmation avec VBA
Le bouton du formulaire intitul Nombre Proche est dsign par la variable
Btn_Proche, et la procdure associe 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 sagit dajouter un bouton de commande et un formulaire lapplication prsente
au paragraphe 3.2 du chapitre 10 an de pouvoir modier les informations donnes
lors dune inscription (nombre de personnes et formule retenue).
Le bouton, ajout sur la feuille de calcul, est intitul MODIFICATION , et il est
dsign par la variable Btn_Modif. Le formulaire associ est dsign par la variable
UF_Modif. Il a la mme structure que le formulaire UF_Inscription de lapplication
comme lindique la gure 14.6.
Figure 14.6 Le formulaire de modifcation.
Livre 7608-VBA.indb 22 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 23
Lutilisateur saisit dabord les informations au sein du formulaire : le nom de la
personne dj inscrite (sans le modier), puis le nombre de personnes et la formule
retenue (Week-End, Semaine ou Promotion) qui sont modies par rapport lenre-
gistrement dj effectu. Puis lutilisateur clique sur le bouton de commande intitul
VALIDATION .
Ce bouton est dsign par la variable Btn_OK_Modif. La procdure associe, appele
Btn_OK_Modif_Click(), est alors excute. 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 modication de " & TextBox1.Text & " est enregistre"
Unload Me
Else
MsgBox "Erreur sur le nom de la personne"
End If
End Sub
La procdure agit en deux temps :
1. Recherche du nom. Les noms des personnes dj inscrites gurent 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 nest pas le nom recherch, alors il faut examiner la cellule suivante de cette
colonne. Mais ds que la valeur de la i
me
cellule est le nom cherch, il convient
darrter ltude des noms. Il faut aussi arrter le processus lorsque la i
me
cellule
est vide et ne contient pas de nom.
Lorsque la boucle WhileWend termine son excution, la variable i dsigne la ligne
qui contient le nom cherch, ou bien qui ne contient aucun nom.
Livre 7608-VBA.indb 23 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
24 Introduction la programmation avec VBA
2. Enregistrement des modifications. Aprs avoir vrifi que la i
me
cellule
Range("B3").Offset(i, 0) nest pas vide (elle contient donc un nom), le programme
affecte la variable c ladresse de cette cellule, puis il ralise les mises jour relatives
au nom contenu par cette cellule.
Chapitre 11
1. Dessin
Le dessin reproduire se prsente comme la gure 14.7.
J 6: cellule
1
2
3
4
de dpart
Figure 14.7 La maquette du dessin.
Il convient tout dabord de donner un format carr chaque cellule concerne, en
choisissant par exemple 12,5 comme hauteur des lignes et 2 comme largeur des
colonnes.
Il sagit ensuite de colorier les cellules en partant dune cellule donne. Nous proposons
de commencer la cellule J6, positionne la ligne 6 et la colonne 10.
Voici le programme qui colorie quatre cellules dans chacun des quatre parcours
(parcours numrots 1, 2, 3 et 4 sur la gure).
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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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 n1
La premire frise est structure par la rptition de six cellules qui sont organises
partir de la cellule B3 comme lindique la gure 14.8.
c=cellule B3
=c.Offset(0,0)
c.Offset(-1,0) c.Offset(-1,+1)
c.Offset(+1,0)
c.Offset(+1,+1) c.Offset(0,+1)
Figure 14.8 La frise n1.
Voici le programme qui permet de raliser 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 ladresse de la cellule B3. Puis il colorie les cellules
en fonction de leur position par rapport cette cellule :
k vaut dabord 0 : le programme colorie les six premires cellules.
La valeur suivante de k vaut 2 car le pas de linstruction itrative est de 2. Les
cellules sont dcales de +2 vers la droite, et le mme traitement est appliqu aux
six cellules concernes.
Livre 7608-VBA.indb 25 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
26 Introduction la programmation avec VBA
Il en est de mme pour les valeurs suivantes de k : 4, 6, 8, 10 et 12. Linstruction
itrative dnie avec la variable k assure ainsi sept fois le coloriage des six cellules.
3. Frise n2
Pour raliser la seconde frise, il suft de la dcouper en une succession de croix comme
lindique la gure 14.9.
Cellule de dpart
Ligne i
Colonne j
0 1 2 3 4
0
1
2
3
4
Figure 14.9 La frise n2.
Chaque croix sinscrit dans un ensemble de 5 5 cellules o chaque cellule est repre
par son numro de ligne i et son numro de colonne j, i allant de 0 4 et j allant de 0
4. Les cellules sont colories lorsquelles appartiennent lune des deux diagonales :
premire diagonale lorsque i = j et deuxime 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 ladresse de la cellule B2 qui sert de cellule de
rfrence. Puis le programme excute trois boucles imbriques (triple boucle) :
Lorsque k = 0, le programme excute une premire fois la double boucle structure
par les valeurs de i et de j. Il colorie les cellules c.Offset(i, j + k) cest--dire
c.Offset(i, j) lorsquelles satisfont aux conditions sur i et j.
Livre 7608-VBA.indb 26 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 27
La valeur suivante de k vaut 5 puisque le pas de linstruction itrative est de 5.
Le programme excute alors une deuxime fois la double boucle dnie par i et
j. Les cellules c.Offset(i, j + k), cest--dire c.Offset(i, j + 5), sont situes
droite des prcdentes cellules, avec un dplacement de +5. Elles sont colories
lorsquelles satisfont aux conditions sur les variables i et j.
Puis le programme excute nouveau ce traitement pour k = 10 et pour k = 15.
Au terme du processus, le programme a colori quatre croix respectant les conditions
imposes aux variables i et j.
Chapitre 12
1. Calculs fnanciers
Nous proposons que le calcul du montant de lemprunt soit structur de la mme faon
que celui qui dtermine la mensualit dun emprunt : il faut alors ajouter un troisime
bouton de commande EMPRUNT Montant ? sur la feuille F_menu comme cela
est prsent sur la gure 14.10.
Figure 14.10 La feuille F_menu.
Le bouton de commande EMPRUNT Montant ? est dsign par la variable
Btn_Emprunt2. Voici le code de la procdure associe 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 dnir une nouvelle feuille de calcul F_montants_emprunt organise
comme lindique la gure 14.11.
Livre 7608-VBA.indb 27 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
28 Introduction la programmation avec VBA
Figure 14.11 La feuille de calcul F_montants_emprunt.
Au bouton de commande intitul CALCUL Montants et dsign par la variable
Btn_Calcul_Montants est associe la procdure Btn_Calcul_Montants_Click(), et au
bouton intitul Quitter est associe la procdure Btn_Quitter_Click(). Voici le
texte de la premire procdure.
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) Donnes 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 dures
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
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 29
La procdure effectue plusieurs calculs :
1. Donnes et calcul du montant. Elle calcule tout dabord la valeur du montant
partir des donnes fournies par lutilisateur au sein des cellules B3, B4 et B5. Le
calcul du montant m est fait en utilisant les variables mens (mensualit), t (taux
dintrt en valeur dcimale) et n (dure en annes de lemprunt) au sein de laffec-
tation suivante :
m = (mens * (1 - (1 + (t / 12)) ^ -(n * 12))) / (t / 12)
Cette formulation est la transcription informatique de la formule nancire qui
dnit la valeur du montant de lemprunt : M = (Me / T) (1 (1 + T)
N
), Me
tant la mensualit, T le taux dintrt mensuel et N le nombre de mois de la dure
de lemprunt.
2. Mise en place du tableau. La procdure met en place le tableau B8:G13 dsign
par la plage p. Sur la premire colonne (B9:B13), elle met les valeurs des dures qui
vont tre utilises. Sur la premire ligne (cellules C8:G8), elle met les valeurs des
diffrents taux qui encadrent le taux dintrt dj utilis pour le calcul prcdent.
3. Calcul des montants. La procdure calcule ensuite les valeurs des montants en
appliquant pour chaque couple de valeur (taux, dure) la formule nancire.
Toutes ces valeurs se mettent en place ds que lutilisateur a donn les valeurs
demandes, puis cliqu sur le bouton CALCUL Montants .
2. Gestion de prts
Il sagit de complter lapplication Gestion de prts en la dotant dun service suppl-
mentaire INFORMATIONS. Celui-ci doit permettre de donner des informations sur
ltat des prts.
Un bouton de commande intitul INFORMATIONS est ajout la feuille F_menu
comme lindique la gure 14.12.
Figure 14.12 La feuille F_menu.
Livre 7608-VBA.indb 29 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
30 Introduction la programmation avec VBA
Au bouton INFORMATIONS est associe la procdure suivante :
Listing 14.32: Btn_Infos_Click()
Private Sub Btn_Infos_Click()
UF_Infos.Show
End Sub
Voici le formulaire que nous proposons dajouter au sein de lapplication. Il est donn
par la gure 14.13.
Figure 14.13 Le formulaire UF_Infos.
Ce formulaire dsign par la variable UF_Infos contient deux boutons de commande.
Le premier, intitul CALCUL , est dni par la variable Btn_Nbpers. La procdure
associe Btn_Nbpers_Click() est conue pour effectuer les calculs demands. Le
second bouton est intitul Quitter et permet deffacer le formulaire de lcran sans
conserver dinformation. Le formulaire contient aussi six zones de texte dnies par
les variables TextBox1, TextBox2, , TextBox6. Celles-ci vont recevoir les informations
calcules par la procdure Btn_Nbpers_Click().
Pour calculer le nombre de personnes ayant emprunts 0 document, 1 document, 2
documents, , 5 documents, cette procdure doit consulter le nombre de documents
emprunts par chaque personne inscrite. Comment trouver cette information ?
Lapplication est munie de plusieurs variables globales dont la variable ci. Celle-ci
dsigne la premire cellule de la liste des noms de personnes du classeur Inscrits. La
variable ci.Offset(i, 0) dsigne donc la i
me
personne et ci.Offset(i, 3).Value
donne alors le nombre de documents emprunts par cette personne.
Le texte du programme est alors le suivant.
Livre 7608-VBA.indb 30 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs 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) Afchage des rsultats ---
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 procdure agit en trois temps :
1. Initialisation. Lappel la procdure init() permet de crer et dinitialiser toutes
les variables globales dont la variable ci. Puis les variables i, nb0, nb1, , nb5
sont initialises 0 (les : ajouts sur la ligne permettent de mettre plusieurs
instructions sur cette ligne).
2. Calculs. Tant que la i
me
cellule contient un nom, la procdure examine la valeur
de ci.Offset(i, 3) et met jour le nombre de documents emprunts selon les
rsultats aux tests.
3. Afchage des rsultats. Les valeurs de nb0, nb1, , nb5 tant calcules, elles sont
afches sous forme de chanes de caractres au sein des six zones de texte du
formulaire.
Livre 7608-VBA.indb 31 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
32 Introduction la programmation avec VBA
Chapitre 13
1. Comparaison de trois suites rcurrentes
Soit trois fonctions qui permettent de calculer la racine dordre 5 dun nombre a,
cest--dire a
1/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 dnissent une limite L qui vaut a
1/5
. Leurs coefcients 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 rsultat 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 'afchage colonne B
c.Offset(i, 1).Value = V 'afchage colonne C
c.Offset(i, 2).Value = W 'afchage colonne D
Next i
End Sub
Si lon donne la variable a la valeur 243 qui vaut en fait 3
5
(3 la puissance 5),
on vrie ainsi quelle vitesse on obtient la valeur 3 comme rsultat. Lorsque lon
donne 3,2 comme valeur initiale et que lon afche les rsultats avec 15 dcimales,
on obtient cette valeur 3 la soixante-dix-septime itration avec la fonction n 1,
la vingt-deuxime itration avec la fonction n 2 et la quatrime itration avec la
dernire fonction. Cest bien cette fonction qui permet dobtenir le programme le
plus performant.
Livre 7608-VBA.indb 32 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier
Corrigs des exercices 33
Les trois racines de x
3
3x+1=0
La premire racine 0.347296355333861 a t obtenue la cinquantime itration avec
le calcul par dichotomie et la quatrime itration avec la mthode de Newton (voir
paragraphe 3.1 du chapitre 13).
Pour calculer les deux autres racines, il faut dterminer des intervalles qui contiennent
les deux valeurs recherches :
Si x = 1, f(x) = x
3
3x + 1 vaut +3 et si x = -2, f(x) vaut 1 : la deuxime racine
est donc comprise entre 2 et 1.
Si x = +1, f(x) vaut 1 et si x=+2, f(x) vaut +3 : la troisime racine est donc comprise
entre +1 et +2.
Il suft alors de rutiliser les programmes dj prsents :
Dans le programme fx_dicho() (voir listing 13.5), il convient de donner aux
variables a et b les nouvelles valeurs. La deuxime racine tablie avec a = 2 et
b = 1 vaut 1.87938524157182 la quarante-neuvime itration. La troisime
racine calcule avec a = 1 et b = 2 vaut 1.53208888623796 la quarante-neuvime
itration elle aussi.
Dans le programme fx_newton() (voir listing 13.6), il faut initialiser le processus
en partant dune valeur proche. La deuxime racine calcule avec une valeur
initiale y = 2 donne le mme rsultat que prcdemment la quatrime itration.
La troisime racine calcule en donnant y la valeur +2 fournit la mme valeur
que celle qui a t dtermine par dichotomie, mais la sixime itration.
Livre 7608-VBA.indb 33 07/08/12 07:05
2012 Pearson France Introduction la programmation avec VBA Robert Chevallier

Vous aimerez peut-être aussi