291 votes

VBA a-t-il une structure de dictionnaire ?

VBA a-t-il une structure de dictionnaire ? Comme un tableau clé<>valeur ?

366voto

Mitch Wheat Points 169614

Oui.

Définir une référence au runtime de MS Scripting

Set dict = CreateObject("Scripting.Dictionary")

ou

Dim dict As New Scripting.Dictionary 

Exemple d'utilisation :

If Not dict.Exists(key) Then 
    dict.Add key, value
End If 

N'oubliez pas de régler le dictionnaire sur Nothing lorsque vous avez fini de l'utiliser.

Set dict = Nothing

207voto

cjrh Points 3960

VBA dispose de l'objet collection :

    Dim c As Collection
    Set c = New Collection
    c.Add "Data1", "Key1"
    c.Add "Data2", "Key2"
    c.Add "Data3", "Key3"
    'Insert data via key into cell A1
    Range("A1").Value = c.Item("Key2")

Le site Collection effectue des recherches basées sur des clés en utilisant un hachage, ce qui est rapide.


Vous pouvez utiliser un Contains() (tirée de ici ) pour vérifier si une collection particulière contient une clé :

Public Function Contains(col As Collection, key As Variant) As Boolean
    Dim obj As Variant
    On Error GoTo err
        Contains = True
        obj = col(key)
        Exit Function
    err:
        Contains = False
End Function

48voto

Jarmo Points 396

VBA ne dispose pas d'une implémentation interne d'un dictionnaire, mais à partir de VBA, vous pouvez toujours utiliser l'objet dictionnaire de la MS Scripting Runtime Library.

Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "aaa"
d.Add "b", "bbb"
d.Add "c", "ccc"

If d.Exists("c") Then
    MsgBox d("c")
End If

33voto

John M Points 2933

Un exemple supplémentaire de dictionnaire qui est utile pour contenir la fréquence d'apparition.

En dehors de la boucle :

Dim dict As New Scripting.dictionary
Dim MyVar as String

Dans une boucle :

'dictionary
If dict.Exists(MyVar) Then
    dict.Item(MyVar) = dict.Item(MyVar) + 1 'increment
Else
    dict.Item(MyVar) = 1 'set as 1st occurence
End If

Pour vérifier la fréquence :

Dim i As Integer
For i = 0 To dict.Count - 1 ' lower index 0 (instead of 1)
    Debug.Print dict.Items(i) & " " & dict.Keys(i)
Next i

7voto

Kalidas Points 51

Le dictionnaire d'exécution des scripts semble avoir un bug qui peut ruiner votre conception à des stades avancés.

Si la valeur du dictionnaire est un tableau, vous ne pouvez pas mettre à jour les valeurs des éléments contenus dans le tableau par le biais d'une référence au dictionnaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X