Подтвердить что ты не робот

Коллекция 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

4b9b3361

Ответ 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

Это, конечно, похоже на предложение словаря, за исключением любых внешних зависимостей. Если вы хотите сохранить дополнительную информацию, класс можно сделать более сложным.