30
1 Portée des variables VBA & Excel

1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

Embed Size (px)

Citation preview

Page 1: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

1

Portée des variablesVBA & Excel

Page 2: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

2

Rappel

• Nous avons vu– Fonctions récursives– Procédures récursives

Page 3: 1 Portée des variables VBA & 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

Page 4: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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 ?

Page 5: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 6: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 7: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 8: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 9: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 10: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 11: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 12: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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 ?

Page 13: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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 ?

Page 14: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 15: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 16: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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.

Page 17: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 18: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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)

Page 19: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 20: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 21: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 22: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 23: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 24: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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)

Page 25: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 26: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 27: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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.

Page 28: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

28

VBA et Excel

• En licence, vous verrez plus de choses sur la manipulation des fichiers Excel avec VBA

Page 29: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

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

Page 30: 1 Portée des variables VBA & Excel. 2 Rappel Nous avons vu –Fonctions récursives –Procédures récursives

30

Merci et bonne réussite aux examens