2015-04-07 3 views
0

Existe-t-il une structure dans VBA qui permette d'utiliser des tuples comme des clés, comme Python? Je cherche à stocker une grande matrice de valeurs dans un tableau associatif, indexé par des noms de clé dans les deux dimensions.Dictionnaire VBA avec touches composées

EDIT:

Voici un exemple d'une table de données simple:

 

+--------+--------+--------+--------+--------+ 
|  | City 1 | City 2 | City 3 | City 4 | 
+--------+--------+--------+--------+--------+ 
| City 1 | 0 | 7 | 8 | 6 | 
| City 2 |  | 0 | 1 | 6 | 
| City 3 |  |  | 0 | 5 | 
| City 4 |  |  |  | 0 | 
+--------+--------+--------+--------+--------+ 

Je veux être en mesure de stocker ces valeurs dans un tableau associatif (dictionnaire), car ils seront lus millions de fois tout au long de l'exécution de mon script. J'aimerais pouvoir avoir les clés du dictionnaire en tuples. Ainsi, le je voudrais créer un dictionnaire (nous l'appellerons distance), où les clés et les valeurs sont les suivantes:

(City 1, City 2) = 7 
(City 1, City 3) = 8 
(City 1, City 4) = 6 
(City 2, City 3) = 1 
(City 2, City 4) = 6 
(City 3, City 4) = 5 

J'accéderiez la distance entre la ville et la ville 1 2 avec quelque chose comme ceci:

Distance("City 1", "City 2") 
+1

AFAIK, non. Chaque 'item' pour une' key' particulière peut être un tableau mais pas la clé elle-même. Ou peut-être ai-je mal compris votre question? – L42

+0

Non, vous ne l'avez pas fait. En fait, j'ai seulement besoin d'un long ou double pour l'article, mais j'aimerais avoir une clé composite. Je sais que je peux utiliser un tableau bidimensionnel et utiliser des indices entiers, mais j'espérais utiliser des chaînes. Essentiellement, j'ai une matrice géante de distances entre les villes que je voudrais stocker dans une structure de type tableau. Ainsi, j'aimerais pouvoir accéder, disons, à Distance ("Seattle", "Chicago"). –

+0

Je suis confus maintenant. :) Pouvez-vous l'illustrer? Ces données que vous devez transmettre dans le dictionnaire? Ce qui va au 'Item' et qui va comme' Keys'. – L42

Répondre

0

Si vous utilisez Excel, je vous suggère d'utiliser une fonction dans une cellule, vous pouvez trouver votre valueBy simple fornula comme =Distance("ct1","ct2"):

et la fonction est:

Public Function Distance(RowCity As String, ColCity As String) As String 
    Dim RowNo As Long, ColNo As Long 
    RowNo = 0: ColNo = 0 

    On Error Resume Next 
    With ActiveSheet 
     RowNo = .Columns("A").Find(What:=RowCity).Row 
     ColNo = .Rows(1).Find(What:=ColCity).Column 

     If RowNo <> 0 And ColNo <> 0 Then 
      Distance = Trim(.Cells(RowNo, ColNo).Value & " ") 
     Else 
      Distance = "#N/A" 
     End If 
    End With 
End Function 

Note: Lorsque vous utilisez Excel, des feuilles de calcul Excel sont des tableaux en deux dimensions avec de nombreuses options que vous avez besoin.


Il y a une sorte de dictionnaire que vous pouvez utiliser (à partir d'objets COM):

Dim dict As Object 
Dim key As Variant 

Set dict = CreateObject("Scripting.Dictionary") 

dict.Add "City 1", "City 2" 

For Each key In dict.Keys 
    If key = condiction Then 
     'use dict.Item(key) 
    End If 
Next key 
+0

Merci pour votre réponse! En fait, je ne cherche pas à l'utiliser dans une feuille de calcul. Ma principale préoccupation est en fait la vitesse de lecture ici, car cette matrice de valeurs sera accessible quelques millions de fois au cours de mon script. –

+0

@AustinWismer Je ne sais pas où est ta matrice ou comment tu la remplis, Mais comme je l'ai noté: Si tu stocke ta matrice dans une feuille Excel ça peut te donner une très bonne vitesse;). –

+1

Fondamentalement, j'ai une matrice de valeurs stockées dans une feuille de calcul. Pour la vitesse d'accès, je voudrais lire cette matrice à partir de la feuille de calcul et la stocker sous forme de tableau. Puisque les valeurs de cette matrice seront consultées des millions de fois pendant l'exécution du script, il est beaucoup plus rapide de lire ces valeurs à partir d'un tableau qu'à partir de la feuille de calcul à chaque fois.Ma question est de savoir s'il existe un moyen de les stocker dans un tableau associatif où chaque valeur (item) peut avoir des clés composées de plusieurs valeurs (un tuple, par exemple). –