
Nous allons voir dans ce chapitre la gestion des collections. Ce sont comme des tableaux de variables, mais plus puissants.
Allez dans un nouveau Module VBA, et créez la procédure suivante :
Sub MonTest()
Dim Ville
Ville = "Genève"
MsgBox Ville
End Sub
Cette procédure déclare juste une variable Ville, et y installe une seule Ville : Genève. Ensuite il l'affiche.
Maintenant, admettons que nous désirions plus qu'une ville : Disons 3 villes :
Sub MonTest()
Dim Ville1, Ville2, Ville3
Ville1 = "Genève"
Ville2 = "Paris"
Ville3 = "Moscou"
MsgBox Ville1
MsgBox Ville2
MsgBox Ville3
End Sub
Nous constatons immédiatement le manque de souplesse et l'inélégance de cette manière de procéder : Le code est lourd. Et je ne vous raconte pasle malaise si on a pas 3 villes, mais 250 !
Alors, nous allons simplifier ceci : Nous allons créer un tableau de Villes, comme ceci :
Sub MonTest2()
Dim Ville(3)
Ville(1) = "Genève"
Ville(2) = "Paris"
Ville(3) = "Moscou"
MsgBox Ville(1)
MsgBox Ville(2)
MsgBox Ville(3)
End Sub
Ce qui donne le même résultat, et visiblement pas grand chose n'a changé concernant la clarté du code, mais si ce n'est pas 3 villes, mais 250 qu'il faut afficher, on peut alors faire comme ceci :
Sub MonTest2()
Dim Ville(250)
Ville(1) = "Genève"
Ville(2) = "Paris"
' Ville(4,5,6,7.... etc.
Ville(250) = "Melbourne"
' Maintenant, 250 lignes de codes sont nécessaires :
MsgBox Ville(1)
MsgBox Ville(2)
MsgBox Ville(3)
' Msgbox Ville(4,5,6,7... etc.
Msgbox Ville(250)
End Sub
Concernant la partie VBA en Rose, on ne peut pas changer grand chose, par contre, pour l'affichage des messages, on peut cette fois optimiser complètement :
Sub MonTest2()
Dim Ville(250)
Ville(1)
= "Genève"
Ville(2) = "Paris"
' Ville(4,5,6,7.... etc.
Ville(250)
= "Melbourne"
' De 250 lignes nécessaires, on en
a plus que 3 :
For Compteur = 1 to 250
MsgBox Ville(Compteur)
Next
End Sub
Maintenant, on a la possiblité de modifier le nombre de villes contenues dans ce tableau : Le code suivant déclare un tableu de villes dont la dimension n'est pas connue :
Sub MonTest3()
Dim Ville()
End Sub
A présent, on ne peut rien mettre dans ce tableau, car il a une dimension inconnue, donc zéro pour l'instant. Le code suivant génère une erreur . Essayez !
Sub MonTest3()
Dim Ville()
Ville(1) = "Genève"
End Sub
Avant d'y mettre quelque chose, il faut qu'on lui donne sa dimension :
Sub MonTest3()
Dim Ville()
ReDim Ville(1)
Ville(1) = "Genève"
End Sub
Ce code marche, lui.
L'intérêt de ce ReDim est qu'on peut demander dynamiquement à l'utilisateur combien de villes il veut mettre, et lui demander le nom des villes voulues :.
Sub MonTest4()
Dim NombreVille
Dim Ville()
NombreVille = InputBox("Combien de villes désirez-vous ?")
ReDim Ville(NombreVille)
End Sub
Le nombre de villes va varier à chaque fois que vous lancez la procédure. Essayez (Vous ne verrez toutefois pas grand chose, mais un tableau de X villes va être créé)
Maintenant, on va demander à l'utilisateur d'entrer le nom de toutes les villes qu'il veut :
Sub MonTest4()
' Déclaration des variables et tableau
Dim NombreVille, Compteur
Dim Ville()
' Déterminatiuon du nombre de villes :
NombreVille = InputBox("Combien de villes désirez-vous ?")
ReDim Ville(NombreVille)
' Entrée des villes désirées :
For Compteur = 1 To NombreVille
Ville(Compteur) = InputBox("Entrez la ville numéro" & Compteur)
Next
End Sub
Ce code va d'abord vous demander combien de villes vous désirez. Essayez : Dites 3, et ensuite, il va vous demander lesquelles sont-elles : Milan, Vienne et Sydney. C'est tout. Il ne les affichera pas. Il va juste les stocker en mémoire.
Maintenant, une boucle toute aussi simple est à rajouter en dessous, et nous avons maintenant l'affichage de nos villes, une par une :
Sub MonTest4()
' Déclaration des variables et tableau
Dim NombreVille, Compteur
Dim Ville()
' Déterminatiuon du nombre de villes
:
NombreVille = InputBox("Combien de villes désirez-vous
?")
ReDim Ville(NombreVille)
' Entrée des villes désirées
:
For Compteur = 1 To NombreVille
Ville(Compteur) = InputBox("Entrez la ville numéro"
& Compteur)
Next
For Compteur = 1 To NombreVille
MsgBox Ville(Compteur)
Next
End Sub
Les tableaux sont limités en ce sens que les nouveaux éléments sont rajoutés systématiquement après le dernier élément existant (Si on voulait rajouter une nouvelle ville après toutes celles qu'on a déjà entrées, pas de problème, mais si la nouvelle ville devait être placée entre la première et la 2ème, il faudrait déplacer toutes les villes d'un cran vers le haut, augmenter la taille du tableau d'une unité - une ville de plus)
Dans le cas de l'effacement d'une ville, pareil : ça laisse un trou : Une ville vide, alors que ce serait plus élégant de ramener les villes d'une case vers le bas, et de déminuer d'une unité la taille du tableau des villes...
Tout ceci fait que, bien que les tableaux soient utilisés depuis fort longtemps dans l'histoire de la programmation, il existe une notion plus puissante qui est d'ailleurs le thème de ce chapitre : Ce sont les COLLECTIONS. Nous allons voir maintenant de quoi il en retourne, et pourquoi elles sont si proche du concept des tableaux.
D'un point de vue théorique, une collection de Villes est équivalente à un tableau de Villes.
Essayez le code suivant :
Sub MonTest5()
Dim Ville As New Collection
End Sub
C'est un peu comme un tableau de villes Ville(). Mais par contre, c'est nettement plus facile à gérer : La méthode Add ajoute une ville à la fin de la collection : Essayez :
Sub MonTest5()
Dim Ville As New Collection
Ville.Add "Genève"
End Sub
Et pour l'afficher, il suffit de demander son numéro : On ne peut pas se tromper : Il n'y a qu'un élément :
Sub MonTest5()
Dim Ville As New Collection
Ville.Add "Genève"
MsgBox Ville(1) ' Affiche "Genève"
End Sub
Faisons l'expérience d'ajouter 3 villes, et affichons les avec une boucle For ::
Sub MonTest5()
Dim Ville As New Collection
' Ajout de villes :
Ville.Add "Genève"
Ville.Add "Milan"
Ville.Add "San Fransisco"
' Affichage de ces villes :
For Compteur = 1 to 3
Msgbox Ville(Compteur)
Next
End Sub
Maintenant, comme vous l'avez constaté dans le chapitre "For Each", on peut utiliser la méthode Count de la collection Ville :
Remplacez :
For Compteur = 1 To 3
Par
For Compteur = 1 To Ville.Count
J'aurais pensé qu'on pouvait utiliser une boucle For Each également pour les collections définies par nous même, mais le code suivant, qui me parait en tout point correct, ne fonctionne pas :
Sub MonTest6()
Dim Ville As New Collection
Dim superville As Object
' Ajout de villes :
Ville.Add "Genève"
Ville.Add "Milan"
Ville.Add "San Fransisco"
' Affichage de ces villes :
For Each superville In Ville
MsgBox superville
Next
End Sub
Pour le faire fonctionner, il suffit de changer
Dim superville As Object
en
Dim superville As Variant
Par contre, voici quelque chose qui fonctionne : La possibilité de facilement intercaler une ville au milieu d'autres villes déjà existantes : L'exemple qui suite ajoute une nouvelle ville (New-York) avant la ville numéro 2, à savoir Milan. L'ordre des villes sera alors : Genève, New-York, Milan, San Fransisco.
Sub MonTest5()
Dim Ville As New Collection
' Ajout de villes :
Ville.Add "Genève"
Ville.Add "Milan"
Ville.Add "San Fransisco"
Ville.Add "New-York", , Before:=2
' Affichage de ces villes :
For Compteur = 1 To Ville.Count
MsgBox Ville(Compteur)
Next
End Sub
Et si on avait voulu la placer APRES Milan, on aurait pu écrire
Ville.Add "New-York", , , After:=2
Toujours pour parler des paramètres possibles de add, il est possible d'attribuer un Index, c'est à dire une sorte d'identificateur unique à chaque élément. Imaginons une listre de clients dont plusieurs pourraient porter le même nom : On ajoute une identification : LePremier, LeDeuxieme, LeTroisieme
Sub MonTest7()
Dim Client As New Collection
' Ajout de Clients :
Client.Add "Dupont", "LePremier"
Client.Add "Martin", "LeDeuxieme"
Client.Add "Dupont", "LeTroisieme"
MsgBox Client("LeTroisieme") ' Affiche : Dupont
End Sub
Cette syntaxe est strictement équivalente à Client(3).
La méthode Remove va nous permettre d'enlever des enregistrements. L'exemple suivant va d'abord entrer 3 clients : andré, Bernard, Christine, et ensuite enlever le 2ème (Bernard). L'affichage donnera donc Bernard, Christine.
Sub MonTest8()
Dim Client As New Collection, compteur
' Ajout de Clients :
Client.Add "André"
Client.Add "Bernard"
Client.Add "Christine"
Client.Remove 2
For compteur = 1 To Client.Count
MsgBox Client(compteur)
Next
End Sub