【问题标题】:Can I loop through key/value pairs in a VBA collection?我可以遍历 VBA 集合中的键/值对吗?
【发布时间】:2014-01-29 13:15:09
【问题描述】:

在 VB.NET 中,我可以遍历字典的键/值对:

Dictionary<string, string> collection = new Dictionary<string, string>();
collection.Add("key1", "value1");
collection.Add("key2", "value2");

foreach (string key in collection.Keys)
{
    MessageBox.Show("Key: " + key + ".  Value: " + collection[key]);
}

我知道在 VBA 中我可以遍历 Collection 对象的 值:

Dim Col As Collection
Set Col = New Collection
Dim i As Integer
Col.Add "value1", "key1"
Col.Add "value2", "key2"

For i = 1 To Col.Count
    MsgBox (Col.Item(i))
Next I

我也知道我使用 Scripting.Dictionary VBA 对象执行此操作,但我想知道这是否可以使用集合。

我可以遍历 VBA 集合中的键/值对吗?

【问题讨论】:

  • 据我所知,你不能......如果你想遍历键/值对,你应该使用Dictionary......

标签: vba excel collections


【解决方案1】:

您无法从集合中检索密钥的名称。相反,您需要使用字典对象:

Sub LoopKeys()
    Dim key As Variant

    'Early binding: add reference to MS Scripting Runtime
    Dim dic As Scripting.Dictionary
    Set dic = New Scripting.Dictionary

    'Use this for late binding instead:
    'Dim dic As Object
    'Set dic = CreateObject("Scripting.Dictionary")

    dic.Add "Key1", "Value1"
    dic.Add "Key2", "Value2"

    For Each key In dic.Keys
        Debug.Print "Key: " & key & " Value: " & dic(key)
    Next
End Sub

【讨论】:

  • 感谢早期绑定,新字典不起作用。但是 New Scripting.Dictionary 又做了 :D Thx。
  • 在我的 VBA 脚本中不起作用。我需要一个库还是什么?
  • @JohnsonJason:是的,在注释代码中提到的 Microsoft 脚本运行时 - 或使用注释后期绑定代码,则不需要参考
  • 这是一个很好的答案,因为您展示了早期和后期绑定的示例 - 使其清晰并告知其他人不同之处。希望我能加你 10 个!
【解决方案2】:

此答案不会迭代集合的键 - 这似乎是不可能的,但如果您不想使用字典,则提供了更多解决方法。

您可以按照https://stackoverflow.com/a/9935108/586754 中的说明收集 KeyValues。 (创建键值类并将它们放入集合中。)

在我(非 Excel,但 SSRS)的情况下,我无法添加类并且不想添加 .net 引用。

我使用了 2 个集合,1 个用于存储键,1 个用于存储值,然后在添加或删除时保持它们同步。

下面以 add 为例 - 虽然它仅限于 string/int 键/值,并且 int 值没有存储但添加到以前的值,这是我在 SSRS 中聚合值所需要的。这可以很容易地修改为不添加但存储值。

ck键集合,cv值集合。

 Private Sub StoreAdd(ck As Collection, cv As Collection, k As String, v As Integer)
    Dim i As Integer
    Dim found As Boolean = false
    Dim val As Integer = v
    For i = 1 to ck.Count
        if k = ck(i)
            ' existing, value is present
            val = val + cv(i)
            ' remove, will be added later again
            ck.Remove(i)
            cv.Remove(i)
        End If
        if i <= ck.Count
            ' relevant for ordering
            If k > ck(i)
                ' insert at appropriate place
                ck.Add(k, k, i)
                cv.Add(val, k, i)
                found = true
                Exit For
            End If
        End If
    Next i
    if not found
        ' insert at end
         ck.Add(k, k)
        cv.Add(val, k)
    End If
 End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2012-11-03
    • 2013-12-04
    • 2019-08-30
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多