2015-04-07 14 views
0

Есть ли в VBA структура, которая позволит использовать кортежи в качестве ключей, аналогичные Python? Я ищу для хранения большой матрицы значений в ассоциативном массиве, индексированном по именам ключей в обоих измерениях.Словарь VBA с составными ключами

EDIT:

Вот пример простой таблицы данных:

 

+--------+--------+--------+--------+--------+ 
|  | 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 | 
+--------+--------+--------+--------+--------+ 

Я хочу, чтобы иметь возможность хранить эти значения в ассоциативном массиве (словарь), так как они будут читать миллионы раз во время выполнения моего скрипта. Я хотел бы иметь ключи словаря, например, кортежи. Таким образом, я хотел бы создать словарь (мы будем называть его Distance), где ключи и значения:

(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 

Я бы доступ расстояние между городом 1 и 2 города с чем-то вроде этого:

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

AFAIK, нет. Каждый «элемент» для определенного «ключа» может быть массивом, но не самим ключом. Или, может быть, я неправильно понял ваш вопрос? – L42

+0

Нет, вы этого не сделали. Мне действительно нужен только длинный или двойной элемент, но я хотел бы иметь составной ключ. Я знаю, что могу использовать двумерный массив и использовать целочисленные индексы, но я надеялся использовать строки. По сути, у меня есть гигантская матрица расстояний между городами, которые я хотел бы хранить в массивной структуре. Таким образом, я хотел бы получить доступ, скажем, «Расстояние» («Сиэтл», «Чикаго»). –

+0

Я сейчас смущен. :) Вы можете это проиллюстрировать? Какие данные вам нужно перевести в словарь? Который идет в «Элемент» и идет как «Ключи». – L42

ответ

0

Если вы используете Excel, я предлагаю вам использовать функцию, которая в любой клетке вы можете найти ваш valueby простой fornula как =Distance("ct1","ct2"):

И функция является:

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 

Примечание: При использовании Excel, Excel листы двумерные массивы с большим количеством опций, которые вам нужны.


Существует своего рода словарь, который вы можете использовать (от объектов 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

Спасибо за ваш ответ! Я на самом деле не хочу использовать это на листе. Моя главная проблема - это скорость чтения здесь, так как эта матрица значений будет доступна несколько миллионов раз в течение всего моего сценария. –

+0

@AustinWismer Я не знаю, где ваша матрица или как вы ее заполняете, но, как я заметил: если вы храните свою матрицу в листе Excel, она может дать вам очень хорошую скорость;). –

+1

В принципе, у меня есть матрица значений, хранящихся на листе. Для скорости доступа я хотел бы прочитать эту матрицу из электронной таблицы и сохранить ее как массив. Поскольку значения этой матрицы будут доступны в миллионы раз на протяжении всего сценария, гораздо быстрее читать эти значения из массива, чем из таблицы каждый раз.Мой вопрос заключается в том, есть ли способ сохранить их в ассоциативном массиве, где каждое значение (элемент) может иметь ключи, состоящие из нескольких значений (например, кортеж). –