[VBA] Connaitre le numéro d'élément d'un élément d'une collection

Le
HD
Bonjour,
J'utilise une collection pour avoir un tableau à accès direct. Ainsi:

Dim Col As Collection
Set Col = New Collection
With Col
.Add 15.5, "Pomme"
.Add 28.95, "Pêche"
.Add 12, "Abricot"
End With
MsgBox Col("Pêche")

va m'afficher 28.95
par contre je voudrais connaitre directement le numéro d'un élément
donné dans la collection. Dans l'exemple que j'ai donné pour l'élément
"Pêche" je devrais alors avoir 2 (car en 2e position dans la
collection).

Comment puis je m'y prendre ? Je n'ai pas trouvé la solution en
dehors de parcourir la collection avec une boucle mais je préférerai
une solution qui me donnerait un accès directe pour optimiser le temps
de ma macro (qui ne contient bien sûr pas seulement 3 éléments mais bien
plus).

Merci d'avance pour votre aide,

Cordialement,
HD
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
isabelle
Le #26440160
bonjour HD,
ce n'est pas possible avec l'objet New Collection, celle-ci contrairement aux
objets
"Collections.ArrayList"
"Collections.Queue"
"Collections.Stack"
ne possède pas la propriété .Toarray()
à moins de faire une boucle et de vérifier si la valeur de l'Item est égal à "Pêche"
mais c'est possible avec Scripting.Dictionary,
Sub TestDico()
'activer la référence "Microsoft Scripting Runtime"
Dim Dico As New Scripting.Dictionary
With Dico
.Add 15.5, "Pomme"
.Add 28.95, "Pêche"
.Add 12, "Abricot"
End With
Debug.Print Application.Match("Pêche", Dico.Items, 0)
Debug.Print Application.Match(12, Dico.Keys, 0)
Set Dico = Nothing
End Sub
ou par exemple avec Collections.ArrayList
Sub testAL()
Dim AL1 As Object
Set AL1 = CreateObject("System.Collections.ArrayList")
With AL1
.Add 15.5 & "Pomme"
.Add 28.95 & "Pêche"
.Add 12 & "Abricot"
End With
Debug.Print Application.Match(28.95 & "Pêche", AL1.Toarray(), 0)
Set AL1 = Nothing
End Sub
isabelle
Le 2017-07-26 à 06:38, HD a écrit :
Dim Col As Collection
Set Col = New Collection
With Col
.Add 15.5, "Pomme"
.Add 28.95, "Pêche"
.Add 12, "Abricot"
End With
MsgBox Col("Pêche")
News.aioe.org
Le #26440161
Bonjour,
Voici une manière de procéder en utilisant un objet "Dictionary"
La procédure exige que la référence suivante soit cochée
menu outils / références / : "Microsoft Scripting Runtime"
'-----------------------------------------------------------------------------
Sub test()
Dim X(), V As Double
Dim R As String, No As Variant
Dim Col As Dictionary
Set Col = New Dictionary
'Le premier item (Key) de chaque élément
'du dictionnaire nommé "Col" doit avoir
'une valeur unique, sinon une erreur est
'généré.
With Col
.Add 15.5, "Pomme"
.Add 28.95, "Pêche"
.Add 12, "Abricot"
End With
'Tu places les "items" (pomme, pêche, abricot)
'dans une variable tableau comme ceci
X = Col.Items
'La variable R représente la valeur recherchée dans
'les items
R = "Pêche"
'Retourne le numéro (le rang) que tu cherches : 2
No = Application.Match(R, X, 0)
'Retourne la valeur de la "Key" pour pêche : 28.95
'No - 1 car le tableau X est de base 0
V = Col.Keys(No - 1)
End Sub
'-----------------------------------------------------------------------------
MichD
HD
Le #26444665
Merci pour votre aide
HD
Publicité
Poster une réponse
Anonyme