1 portée des variables vba & excel. 2 rappel nous avons vu –fonctions récursives...
TRANSCRIPT
1
Portée des variablesVBA & Excel
2
Rappel
• Nous avons vu– Fonctions récursives– Procédures récursives
3
Plan
• Nous allons voir– Généralisation des programmes
• Portée des variables et des constantes
– VBA et Excel• Manipulation de cellules• Manipulation de plages
4
ProblèmeAlgorithme ex1
Variable i : entierVariable T: Tableau[6] d’entiers
DébutPour i = 1 à 6
Lire(T(i))Fin Pouri 6Tant que i 1 Faire
Ecrire (T(i))i i-1
FinTantQueFin
• Que fait cet algorithme ?
• Que doit-on changer pour l’utiliser avec des tableaux de taille 7 ?
5
Solution• Il faut remplacer le 6 par 7 partoutAlgorithme ex1
Variable i : entierVariable T: Tableau[7] d’entiers
DébutPour i = 1 à 7
Lire(T(i))Fin Pouri 7Tant que i 1 Faire
Ecrire (T(i))i i-1
FinTantQueFin
C’est facile quand il s’agit d’un petit algorithme
6
Meilleure solution• Utiliser une constante pour fixer la
tailleAlgorithme ex1
Const n = 7Variable i : entierVariable T: Tableau[n] d’entiers
DébutPour i = 1 à n
Lire(T(i))Fin Pouri nTant que i 1 Faire
Ecrire (T(i))i i-1
FinTantQueFin
Pour changer de taille, il suffit ensuite de changer la valeur de la constante n une seule fois
7
Constantes en VBSub ex1()
Const n = 7Dim i, T(n) as IntegerFor i = 1 to nT(i)=InputBox(« ? »)Nexti = nWhile i >= 1MsgBox(T(i))i = i-1Wend
EndSub
8
Autre problème• On veut afficher l’indice de la valeur maximale
se trouvant dans le tableau saisi avec ex1• On pourrait penser à la solution suivante :
Sub ex2()Dim M as IntegerM = 1For i = 2 to n
If T(M) < T(i) ThenM = i
EndIfNextMsgBox(M)
End Sub
9
Le problème (suite)• Cette solution
ne va pas marcher car ex2() ne connaît pas– La constante
n– Le tableau T– La variable i
Sub ex2()Dim M as IntegerM = 1For i = 2 to n
If T(M) < T(i) ThenM = i
EndIfNextMsgBox(M)
End Sub
10
Portée des variables et des constantes : Locale ou globale
• Toute variable déclarée au sein d’un programme n’est visible qu’au sein de ce même programme (Variable locale)
• La même remarque est valable pour les constantes (Constante locale)
• Pour qu’une variable ou constante soit globale, il faut la déclarer en dehors de tout programme
11
SolutionConst n = 7Dim i, T(n) as Integer
sub ex1()For i = 1 to n
T(i)=InputBox(« ? »)Nexti = nWhile i >= 1
MsgBox(T(i))i = i-1
WendEnd sub
sub ex2()…
End Sub
n est une constante globale
T et i sont des variables globales
12
Portée des variables : Exo
Sub ex1()
Dim i As Integer
i = 3
End Sub
Sub ex2()
MsgBox (i)
End Sub
On exécute ex1 puis ex2, que va afficher ex2 ?
13
Portée des variables : Exo Dim i as integer
Sub ex1()i = 3
End Sub
Sub ex2()Dim i as integeri = 5
End Sub
Sub ex3()MsgBox(i)
EndSub
On exécute ex1, puis ex2, puis ex3.
Que va afficher ex3 ?
14
Conclusion sur la portée• Quand l’exécution d’un programme
rencontre une variable1. Le système regarde si la variable est définie
localement• Auquel cas, il utilise la version locale
2. Sinon, il regarde si la variable est définie d’une manière globale• Auquel cas, il utilise la version globale
3. Sinon, c’est à dire la variable n’est déclarée nulle part et dans ce cas VB a deux solutions• Option Explicit : dans ce cas, il déclare une
erreur• Sinon, il essaye de créer instantanément la
variable en l’initialisant à 0
15
Autre problème• Notre programme ex1() qui saisit les éléments
d’un tableau à n cases n’est applicable que sur le tableau T
Sub ex1()For i = 1 to n
T(i)=InputBox(« ? »)Nexti = nWhile i >= 1
MsgBox(T(i))i = i-1
WendEndSub
Si on doit saisir un autre tableau T’, on ne peut pas utiliser ce programme sauf si on le modifie
16
Solution• Pour faire en sorte que ex1() soit directement
utilisable avec n’importe quel tableau, il faut mettre le tableau comme paramètre
Sub ex1(T() as Integer, n as integer)For i = 1 to n
T(i)=InputBox(« ? »)Nexti = nWhile i >= 1
MsgBox(T(i))i = i-1
WendEndSub
Dorénavant, je peux faire
Call ex1(T)
Call ex1(T’)
Call ex1(M)
Si T, T’, M sont des variables de type tableau à une dimension.
17
Remarques• Soient les déclarations suivantes
– Dim n as integer– Dim T(7) as integer– Dim T1(n) as integer– Dim T2(5) as integer– Dim T3(10) as Integer
• Call ex1(T, 7) et Call ex1(T1, n) vont remplir les tableaux T et T1
• Call ex1(T2, 5) va engendrer une erreur car on dépasse la taille du tableau T2
• Call ex1(T3, 10) ne va remplir que les 7 premières cases
18
VBA et Excel : Cellules• A partir des programmes VBA, on peut accéder aux
cellules des feuilles de calcul
• Le mot réservé Cells désigne une cellule
• Une feuille de calcul peut être vue comme une matrice– Cells(i , j) désigne alors la cellule se trouvant à
• Ligne i et colonne j
• Une feuille de calcul peut être vue comme un vecteur– Cells(i) désigne la cellule se trouvant à la ième position en
parcourant les lignes • de gauche à droite et• Haut en bas
– Une ligne contient 256 colonnes A2 = Cells(257)
19
Les cellules
• Chaque cellule possède plusieurs propriétés– Valeur– Couleur de la valeur– Couleur du contour– …
• Cells(i , j).Value désigne la valeur de la cellule se trouvant à la ième ligne et jème colonne
20
Les cellules
Sub ex1()Dim i, j as integerFor i = 1 to 3
For j = 1 to 3Cells(i,j).value = i*j
NextNextMsgBox( Cells(2, 3).Value)MsgBox( Cells(3).Value)
End Sub
21
Les feuilles
• Les cellules modifiées par le programme précédent sont celles de la feuille à laquelle il est associé
Ce programme est associé à Feuil1
22
Les feuilles
• Le mot réservé Sheets désigne une feuille de calcul
• Sheets(i) désigne la ième feuille
• Sheets(3).Cells(1,2) désigne la cellule se trouvant à la ligne 1 et colonne 2 de la feuille 3.
• Sheets("Feuil3").Cells(1,2) désigne la même cellule
• On peut donc faire référence aux feuilles soit– Par leur numéro– Par leur nom
23
La commande With• Pour ne pas avoir à retaper plusieurs fois la
même chose, on peut utiliser la commande withSub ex1() Sub ex1()Dim i,j as integer Dim i, j as IntegerFor i = 1 to 3 For i=1 to 3 For j = 1 to 3 For j = 1 to 3
sheets(3).cells(i,j).value=1 with sheets(3).cells(i,j) sheets(3).cells(i,j).Interior.colorIndex=3 .Value=1 Next .Interior.ColorIndex =3Next End WithEnd Sub Next
Next EndSub
24
Fonction Utile : IsEmpty
• Cette fonction prend comme paramètre une cellule et retourne True ou False selon que la cellule est vide ou non.
• Syntaxe : IsEmpty(cellule)
25
Petit exo
• Que fait la partie de programme suivante ?i = 1While IsEmpty(cells(i,1)) = False
If cells(i,1).value <0 Thencells(i,1).value = 0
End Ifi = i + 1
Wend
26
Plages de valeurs
• Les plages de valeurs sont introduites avec la clause Range
• Exemple : Range("A1: C3") désigne la plage de cellules se trouvant entre A1 et C3
• Range ("A1: C3").cells(4) désigne la quatrième cellule dans la plage A1:C3– C’est donc A2
27
Plages et feuilles
• Tout comme les cellules, les plages sont associées à des feuilles.
• Sheets(1).Range("A1:B3").cells(2)– Désigne la 2ème cellule de la plage A1:B3 de
la première feuille.
28
VBA et Excel
• En licence, vous verrez plus de choses sur la manipulation des fichiers Excel avec VBA
29
Conclusion du cours
• A retenir :– Algorithmique = première étape de la programmation
• Une fois qu’on a trouvé l’algorithme, il est facile de passer au programme
• Pour l’examen :– Rédaction d’algorithmes– Connaissances de la syntaxe VB– Connaissances des notions vues pour Excel
• Fonctions ( Si, RechercheV, …)• Listes• Tableaux croisés dynamiques• Adressage relatif, absolu, mixte
30
Merci et bonne réussite aux examens