VBA : test d'égalité de deux collections?
Choupette
-
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
eriiic Messages postés 24581 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je souhaiterai tester l'égalité de deux collections sous VBA :
j'ai une collection, appelée List, dont les éléments sont des vecteurs de taille 2, et une seconde collection, appelée CollectList, dont les éléments sont des collections contenant eux aussi des vecteurs de taille 2.
Je souhaiterai ajouter List à CollectList mais en ayant vérifier au préalable que CollectList ne contient pas déjà une collection égale à List.
J'ai donc essaer de créer une fonction qui teste si il existe une collection dans CollectList qui est égale à List. Voici le code de ma fonction :
1 Function EgaliteListes(CollectList As Collection, List As Collection) As Boolean
2 EgaliteListes = False
3 Dim cl As Variant
4 For Each cl In CollectList
5 If cl = List Then EgaliteListes = True
6 End If
7 Next cl
8 End Function
J'ai ensuite créé une procédure pour tester si ma fonction fonctionne ou pas :
Sub test()
Dim collect As Collection
Dim coltest As Collection
Set collect = New Collection
Set coltest = New Collection
Dim j As Integer
For j = 1 To 5
Dim x(2) As Integer
x(1) = j
x(2) = j + 5
collect.Add x
Next j
Dim test(2) As Integer
test(1) = 1
test(2) = 1
coltest.Add test
Dim res As Boolean
res = EgaliteListes(collect, coltest)
MsgBox "Résultat du test d'égalité : " & res
End Sub
Lorsque je lance cette procédure de test, un message d'erreur apparaît :
"Erreur de compilation : Argument non facultatif" et la variable "List" de la ligne dans la fonction EgaliteListes est soulignée.
Si quelqu'un peut m'aider à trouver la solution à mon problème, ça serait super sympa!
Merci.
Je souhaiterai tester l'égalité de deux collections sous VBA :
j'ai une collection, appelée List, dont les éléments sont des vecteurs de taille 2, et une seconde collection, appelée CollectList, dont les éléments sont des collections contenant eux aussi des vecteurs de taille 2.
Je souhaiterai ajouter List à CollectList mais en ayant vérifier au préalable que CollectList ne contient pas déjà une collection égale à List.
J'ai donc essaer de créer une fonction qui teste si il existe une collection dans CollectList qui est égale à List. Voici le code de ma fonction :
1 Function EgaliteListes(CollectList As Collection, List As Collection) As Boolean
2 EgaliteListes = False
3 Dim cl As Variant
4 For Each cl In CollectList
5 If cl = List Then EgaliteListes = True
6 End If
7 Next cl
8 End Function
J'ai ensuite créé une procédure pour tester si ma fonction fonctionne ou pas :
Sub test()
Dim collect As Collection
Dim coltest As Collection
Set collect = New Collection
Set coltest = New Collection
Dim j As Integer
For j = 1 To 5
Dim x(2) As Integer
x(1) = j
x(2) = j + 5
collect.Add x
Next j
Dim test(2) As Integer
test(1) = 1
test(2) = 1
coltest.Add test
Dim res As Boolean
res = EgaliteListes(collect, coltest)
MsgBox "Résultat du test d'égalité : " & res
End Sub
Lorsque je lance cette procédure de test, un message d'erreur apparaît :
"Erreur de compilation : Argument non facultatif" et la variable "List" de la ligne dans la fonction EgaliteListes est soulignée.
Si quelqu'un peut m'aider à trouver la solution à mon problème, ça serait super sympa!
Merci.
2 réponses
-
Bonjour
Qu'appelles tu "vecteur de taille 2" ?
..."CollectList ne contient pas déjà une collection égale à List."...
peut-^tre veux tu dire
CollectList ne contient pas déjà un membre égal à List.
????
Michel -
Bonjour,
1) Tu as déjà une erreur dans le 1er code.
Si ton then est sur la même ligne que le if il ne faut pas mettre end if
Et tant qu'à faire, met EgaliteListes = True sur la ligne suivante et ajoute exit for (si tu as trouvé, inutile de continuer) et garde le endif,
2) tu compares cl de dimension 1 avec List de dimension 2.
3) j'ai l'impression qu'on est obligé de comparer tous les éléments 1 par 1, et le as Collection en paramètre de la fonction passe mal, j'ai mis en variant en attendant mieux.
Proposition :Function EgaliteListes(CollectList, List) As Boolean Dim i As Long EgaliteListes = False Dim cl As Variant For Each cl In CollectList For i = 0 To 2 If cl(i) <> List(1)(i) Then Exit For Next i If i = 3 Then EgaliteListes = True Exit For End If Next cl End Function
Ajoute la fenêtre Espions (menu Affichage) et fais glisser tes variables dedans pour voir à quoi elles ressemblent (cl et List entre autres)
eric
Jamais tu ne répondras à un mp non sollicité...
Bon, ça c'est fait.