Коллекция VBA: список ключей
После добавления некоторых значений в коллекцию VBA можно ли сохранить список всех ключей?
Например
Dim coll as new Collection
Dim str1, str2, str3
str1="first string"
str2="second string"
str3="third string"
coll.add str1, "first key"
coll.add str2, "second key"
coll.add str3, "third key"
Я знаю, как сохранить список строк:
first string
second string
third string
Еще раз: есть ли способ сохранить ключи?
first key
second key
third key
Примечание. Я использую VBA через AutoCAD 2007
Ответы
Ответ 1
Я не думаю, что это возможно с коллекцией ванили, не сохраняя значения ключа в независимом массиве. Самая простая альтернатива для этого - добавить ссылку на исполняемый файл Microsoft Scripting Runtime и вместо этого использовать более удобный словарь;
Dim coll As New Dictionary
...
Dim K As Variant
For Each K In coll.Keys
debug.print "Key: " & K , "Value: " & coll.Item(K)
Next
Ответ 2
Если вы намереваетесь использовать VB6 Collection
по умолчанию, то проще всего сделать это:
col1.add array("first key", "first string"), "first key"
col1.add array("second key", "second string"), "second key"
col1.add array("third key", "third string"), "third key"
Затем вы можете перечислить все значения:
Dim i As Variant
For Each i In col1
Debug.Print i(1)
Next
Или все клавиши:
Dim i As Variant
For Each i In col1
Debug.Print i(0)
Next
Ответ 3
Альтернативным решением является сохранение ключей в отдельной коллекции:
'Initialise these somewhere.
Dim Keys As Collection, Values As Collection
'Add types for K and V as necessary.
Sub Add(K, V)
Keys.Add K
Values.Add V, K
End Sub
Вы можете сохранить отдельный порядок сортировки для ключей и значений, которые иногда могут быть полезны.
Ответ 4
Вы можете создать небольшой класс для хранения ключа и значения, а затем сохранить объекты этого класса в коллекции.
Класс KeyValue:
Public key As String
Public value As String
Public Sub Init(k As String, v As String)
key = k
value = v
End Sub
Затем, чтобы использовать его:
Public Sub Test()
Dim col As Collection, kv As KeyValue
Set col = New Collection
Store col, "first key", "first string"
Store col, "second key", "second string"
Store col, "third key", "third string"
For Each kv In col
Debug.Print kv.key, kv.value
Next kv
End Sub
Private Sub Store(col As Collection, k As String, v As String)
If (Contains(col, k)) Then
Set kv = col(k)
kv.value = v
Else
Set kv = New KeyValue
kv.Init k, v
col.Add kv, k
End If
End Sub
Private Function Contains(col As Collection, key As String) As Boolean
On Error GoTo NotFound
Dim itm As Object
Set itm = col(key)
Contains = True
MyExit:
Exit Function
NotFound:
Contains = False
Resume MyExit
End Function
Это, конечно, похоже на предложение словаря, за исключением любых внешних зависимостей. Если вы хотите сохранить дополнительную информацию, класс можно сделать более сложным.