Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

3 réponses
Avatar
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

3 réponses

Avatar
isabelle
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")
Avatar
News.aioe.org
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
Avatar
HD
Merci pour votre aide
HD