XL 2013 comment lire les éléments d'une collection dans une boucle

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
je me sert d'une collection pour memoriser une valeur et sa clé
pour lire un element je l'appelle par sa clé
mais dans une boucle incrémentée comment fait on pour chopper la valeur et la clé ?

VB:
Dim matos As New Collection

Sub test()
   'matos.Add  valeur, clé
    matos.Add "bleue", "voiture"
    matos.Add "rouge", "velo"
    matos.Add "verte", "trotinnette"

    MsgBox matos("velo")

    For i = 1 To matos.Count
        'ici debug.print la valeur et la clé
    Next

End Sub
 
Solution
allez je reviens la dessus pour cloturer
j'ai trouvé en effet Arkham46 sur DVP avait trouvé une solution avec l'api rtlmemory
dans un module
VB:
Option Explicit
 
' API pour déplacement de zone mémoire
Private Declare Sub RtlMoveMemory Lib "kernel32" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
 
' --------------------------------------------------------------------
' Renvoit la clé d'un item d'indice pItem d'une collection pColl
' --------------------------------------------------------------------
Function CollGetKey(pColl As Collection, pItem As Long) As String
Dim lBuffer(1 To 8) As Long ' Buffer pour information sur la collection
Dim lItem(1 To 7) As Long ' Buffer pour information sur l'Item
Dim lKey() As Byte ' Buffer pour...

dysorthographie

XLDnaute Accro
Bonjour,
La clé d'une collection est inaccessible !
Code:
Dim matos As New Collection,Keys as New collection

Sub test()
   'matos.Add  valeur, clé
    Keys.add "bleu"
    matos.Add "bleue", "voiture"
    Keys.add "rouge"
    matos.Add "rouge", "velo"
    Keys.add "verte"
    matos.Add "verte", "trotinnette"

    For i = 1 To matos.Count

        debug.print matos(Keys(i)),Keys(i)
    Next

End Sub
 

dysorthographie

XLDnaute Accro
Personnellement, vu que je ne m'adresse jamais aux Macintoshien, j'utilise des dictionary.

si je veux plaire au plus grand nombre je fais ça!
VB:
Sub test()
Dim k As String, matos As New Collection, ks() As String
If Not Exist(k, "bleu") Then Add matos, k, "bleu", "voiture"
If Not Exist(k, "rouge") Then Add matos, k, "rouge", "velo"
If Not Exist(k, "verte") Then Add matos, k, "verte", "trotinnette"
 ks() = Split(k, "©")
 For i = 1 To matos.Count
    Debug.Print matos(i), ks(i)
 Next
 Clear matos, k
 If Not Exist(k, "bleu") Then Add matos, k, "bleu", "voiture"
If Not Exist(k, "rouge") Then Add matos, k, "rouge", "velo"
If Not Exist(k, "verte") Then Add matos, k, "verte", "trotinnette"
Remove matos, k, "rouge"
If Not Exist(k, "rouge") Then Add matos, k, "rouge", "velo"
End Sub
Function Exist(k As String, v As String) As Boolean
Exist = InStr("©" & k & "©", "©" & v & "©")
End Function
Sub Add(c As Collection, ks As String, k As String, v As Variant)
c.Add v, k
ks = ks & "©" & k
End Sub
Sub Clear(c As Collection, ks As String)
Set c = New Collection: ks = ""
End Sub
Sub Remove(c As Collection, ks As String, k As String)
c.Remove k
ks = Replace(ks & "©", "©" & k & "©", "©")
If Right(ks, 1) = "©" Then Mid(ks, Len(ks), 1) = " "
ks = Trim(ks)
End Sub
 
Dernière édition:

laurent950

XLDnaute Barbatruc
Bonsoir @patricktoulon , @Dranreb , @dysorthographie

J'ai une Astuce Patrick
'matos.Add "valeur clé", "clé"
il suffit de concaténer la valeur et la clé avec un espace, et plus besoin
de boucle pour un accès directe a la clé ou la valeur avec l'astuce split.

C'est assez simple et efficace, mais le code a @Dranreb est le meilleur de loin.

Dim matos As New Collection

VB:
Sub test()
    matos.Add "bleue voiture", "voiture"
    matos.Add "rouge velo", "velo"
    matos.Add "verte trotinnette", "trotinnette"
'
    MsgBox Split(matos("velo"), " ")(0)
    MsgBox Split(matos("velo"), " ")(1)
'
    Dim x() As Variant
    For i = 1 To matos.Count
        'ici debug.print la valeur et la clé
        Debug.Print "la valeur   "; Split(matos(i), " ")(0) & "   et la clé    " & Split(matos(i), " ")(1)
    Next
'
End Sub

Laurent
 

Dranreb

XLDnaute Barbatruc
Suggestion: Écrivez un module de classe Dictionary pour MAC, à 95% compatible avec celui de Scripting coté utilisation.
Le petit 5% d'incompatibilité ne consisterait qu'en l'absence de la propriété par défaut qui est Item.
Encore qu'en Microsoft on peut l'installer, non depuis VBE mais par un moyen tordu qui n'existe probable pas sur Mac.
Il devra donc être muni des membres CompareMode, Count, Item, Key, Add, Exists, Items, Keys, Remove et RemoveAll.
Facile avec une Collection, traitée comme proposé, non ?
 

patricktoulon

XLDnaute Barbatruc
Bonjour ryu
je connais bien la classe de MarcL pour lire une collection ça fait un peu toomutch
d'ailleurs pour être honnête avec toi
je ne vois vraiment pas le besoin d'un tel engin pour imiter un dictionnaire
je te l'ai prouvé me semble t il

une fonction "exists" prendrait au max 5/6 lignes
et pourquoi pas ajouter une fonction sort allez 10/15 lignes de plus

de plus je ne suis même pas sur qu'il y ai vraiment besoins d'une classe

un dictionnaire c'est des keys et items
une collection c'est des items et keys

pas difficile de faire l'entourloupette
 

RyuAutodidacte

XLDnaute Impliqué
Re
Une classe dictionnaire fais avec une collection est là pour la simplicité d'utilisation comme le Dictionnaire qui est utilisé sur Windows …
L'avantage de cette classe en plus de la simplicité permet la transportabilité entre les 2 plateformes Mac/PC
Ce qui est bien pratique
Il n y a pas que ceux qui sont sur PC qui font du VBA ;)
 

Statistiques des forums

Discussions
315 127
Messages
2 116 504
Membres
112 765
dernier inscrit
SIDIANW