Portée des variables VBA & Excel
Rappel Nous avons vu Fonctions récursives Procédures récursives
Plan Nous allons voir Généralisation des programmes VBA et Excel Portée des variables et des constantes VBA et Excel Manipulation de cellules Manipulation de plages
Problème Que fait cet algorithme ? Algorithme ex1 Variable i : entier Variable T: Tableau[6] d’entiers 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 l’utiliser avec des tableaux de taille 7 ?
Solution C’est facile quand il s’agit d’un petit algorithme Il faut remplacer le 6 par 7 partout Algorithme ex1 Variable i : entier Variable T: Tableau[7] d’entiers 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 C’est facile quand il s’agit d’un petit algorithme
Meilleure solution Utiliser une constante pour fixer la taille Algorithme ex1 Const n = 7 Variable i : entier Variable T: Tableau[n] d’entiers 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
Constantes 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 >= 1 MsgBox(T(i)) i = i-1 Wend EndSub
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 Integer M = 1 For i = 2 to n If T(M) < T(i) Then M = i EndIf Next MsgBox(M) End Sub
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 Integer M = 1 For i = 2 to n If T(M) < T(i) Then M = i EndIf Next MsgBox(M) End Sub
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
Solution n est une constante globale Const n = 7 Dim i, T(n) as Integer sub ex1() For i = 1 to n T(i)=InputBox(« ? ») Next i = n While i >= 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
Portée des variables : Exo Sub ex1() Dim i As Integer i = 3 End Sub Sub ex2() MsgBox (i) On exécute ex1 puis ex2, que va afficher ex2 ?
Portée des variables : Exo Dim i as integer Sub ex1() i = 3 End Sub Sub ex2() i = 5 Sub ex3() MsgBox(i) EndSub On exécute ex1, puis ex2, puis ex3. Que va afficher ex3 ?
Conclusion sur la portée Quand l’exécution d’un 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 d’une manière globale Auquel cas, il utilise la version globale 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
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(« ? ») Next i = n While i >= 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
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(« ? ») Next i = n While i >= 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.
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
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)
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
Les cellules Sub ex1() Dim i, j as integer For i = 1 to 3 For j = 1 to 3 Cells(i,j).value = i*j Next MsgBox( Cells(2, 3).Value) MsgBox( Cells(3).Value) End Sub
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
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
La 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 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 =3 Next End With End Sub Next Next EndSub
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)
Petit exo Que fait la partie de programme suivante ? i = 1 While IsEmpty(cells(i,1)) = False If cells(i,1).value <0 Then cells(i,1).value = 0 End If i = i + 1 Wend
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
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.
VBA et Excel En licence, vous verrez plus de choses sur la manipulation des fichiers Excel avec VBA
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
Merci et bonne réussite aux examens