Title: Porte des variables VBA
1Portée des variablesVBA Excel
2Rappel
- Nous avons vu
- Fonctions récursives
- Procédures récursives
3Plan
- Nous allons voir
- Généralisation des programmes
- Portée des variables et des constantes
- VBA et Excel
- Manipulation de cellules
- Manipulation de plages
4Problème
- Algorithme ex1
- Variable i entier
- Variable T Tableau6 dentiers
- Début
- Pour i 1 à 6
- Lire(T(i))
- Fin Pour
- i ?6
- Tant que i ? 1 Faire
- Ecrire (T(i))
- i ? i-1
- FinTantQue
- Fin
- Que fait cet algorithme ?
- Que doit-on changer pour lutiliser avec des
tableaux de taille 7 ?
5Solution
- Il faut remplacer le 6 par 7 partout
- Algorithme ex1
- Variable i entier
- Variable T Tableau7 dentiers
- Début
- Pour i 1 à 7
- Lire(T(i))
- Fin Pour
- i ? 7
- Tant que i ? 1 Faire
- Ecrire (T(i))
- i ? i-1
- FinTantQue
- Fin
Cest facile quand il sagit dun petit
algorithme
6Meilleure solution
- Utiliser une constante pour fixer la taille
- Algorithme ex1
- Const n 7
- Variable i entier
- Variable T Tableaun dentiers
- Début
- Pour i 1 à n
- Lire(T(i))
- Fin Pour
- i ? n
- Tant que i ? 1 Faire
- Ecrire (T(i))
- i? i-1
- FinTantQue
- Fin
Pour changer de taille, il suffit ensuite de
changer la valeur de la constante n une seule fois
7Constantes en VB
- Sub ex1()
- Const n 7
- Dim i, T(n) as Integer
- For i 1 to n
- T(i)InputBox( ? )
- Next
- i n
- While i gt 1
- MsgBox(T(i))
- i i-1
- Wend
- EndSub
-
8Autre problème
- On veut afficher lindice de la valeur maximale
se trouvant dans le tableau saisi avec ex1 - On pourrait penser à la solution suivante
- Sub ex2()
- Dim M as Integer
- M 1
- For i 2 to n
- If T(M) lt T(i) Then
- M i
- EndIf
- Next
- MsgBox(M)
- End Sub
9Le 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 Integer M 1 For i 2 to
n If T(M) lt T(i) Then M i EndIf Next Ms
gBox(M) End Sub
10Portée des variables et des constantes Locale
ou globale
- Toute variable déclarée au sein dun programme
nest visible quau sein de ce même programme
(Variable locale) - La même remarque est valable pour les constantes
(Constante locale) - Pour quune variable ou constante soit globale,
il faut la déclarer en dehors de tout programme -
-
11Solution
- Const n 7
- Dim i, T(n) as Integer
- sub ex1()
- For i 1 to n
- T(i)InputBox( ? )
- Next
- i n
- While i gt 1
- MsgBox(T(i))
- i i-1
- Wend
- End sub
- sub ex2()
-
- End Sub
n est une constante globale T et i sont des
variables globales
12Porté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 ?
13Portée des variables Exo
- Dim i as integer
- Sub ex1()
- i 3
- End Sub
- Sub ex2()
- Dim i as integer
- i 5
- End Sub
- Sub ex3()
- MsgBox(i)
- EndSub
On exécute ex1, puis ex2, puis ex3. Que va
afficher ex3 ?
14Conclusion sur la portée
- Quand lexécution dun programme rencontre une
variable - Le système regarde si la variable est définie
localement - Auquel cas, il utilise la version locale
- Sinon, il regarde si la variable est définie
dune manière globale - Auquel cas, il utilise la version globale
- Sinon, cest à dire la variable nest 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 linitialisant à 0
15Autre problème
- Notre programme ex1() qui saisit les éléments
dun tableau à n cases nest applicable que sur
le tableau T - Sub ex1()
- For i 1 to n
- T(i)InputBox( ? )
- Next
- i n
- While i gt 1
- MsgBox(T(i))
- i i-1
- Wend
- EndSub
Si on doit saisir un autre tableau T, on ne peut
pas utiliser ce programme sauf si on le modifie
16Solution
- Pour faire en sorte que ex1() soit directement
utilisable avec nimporte 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( ? )
- Next
- i n
- While i gt 1
- MsgBox(T(i))
- i i-1
- Wend
- EndSub
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.
17Remarques
- 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
18VBA 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)
19Les 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
20Les cellules
- Sub ex1()
- Dim i, j as integer
- For i 1 to 3
- For j 1 to 3
- Cells(i,j).value ij
- Next
- Next
- MsgBox( Cells(2, 3).Value)
- MsgBox( Cells(3).Value)
- End Sub
21Les 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
22Les 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
23La commande With
- Pour ne pas avoir à retaper plusieurs fois la
même chose, on peut utiliser la commande with - Sub ex1() Sub ex1()
- Dim i,j as integer Dim i, j as Integer
- For i 1 to 3 For i1 to 3
- For j 1 to 3 For j 1
to 3 - sheets(3).cells(i,j).value1 with
sheets(3).cells(i,j) - sheets(3).cells(i,j).Interior.colorIndex3 .Va
lue1 - Next .Interior.ColorIndex 3
- Next End With
- End Sub Next
- Next
- EndSub
24Fonction 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)
25Petit exo
- Que fait la partie de programme suivante ?
- i 1
- While IsEmpty(cells(i,1)) False
- If cells(i,1).value lt0 Then
- cells(i,1).value 0
- End If
- i i 1
- Wend
26Plages 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 A1C3 - Cest donc A2
27Plages et feuilles
- Tout comme les cellules, les plages sont
associées à des feuilles. - Sheets(1).Range("A1B3").cells(2)
- Désigne la 2ème cellule de la plage A1B3 de la
première feuille.
28VBA et Excel
- En licence, vous verrez plus de choses sur la
manipulation des fichiers Excel avec VBA
29Conclusion du cours
- A retenir
- Algorithmique première étape de la
programmation - Une fois quon a trouvé lalgorithme, il est
facile de passer au programme - Pour lexamen
- Rédaction dalgorithmes
- Connaissances de la syntaxe VB
- Connaissances des notions vues pour Excel
- Fonctions ( Si, RechercheV, )
- Listes
- Tableaux croisés dynamiques
- Adressage relatif, absolu, mixte
30Merci et bonne réussite aux examens