VBA : test d'égalité de deux collections?
Choupette
-
eriiic Messages postés 25847 Statut Contributeur -
eriiic Messages postés 25847 Statut Contributeur -
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.
A voir également:
- VBA : test d'égalité de deux collections?
- Excel compter cellule couleur sans vba - Guide
- Incompatibilité de type vba ✓ - Forum VB / VBA
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Erreur 13 incompatibilité de type VBA excel ✓ - Forum Excel
- Vba range avec variable ✓ - Forum VB / VBA
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
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 :
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.
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.
et je voulais insister sur le fait que CollectList est une collection de collections.