[VBA] Connaitre le numéro d'élément d'un élément d'une collection
3 réponses
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).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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")
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
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
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
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
'-----------------------------------------------------------------------------
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