Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在VBA集合中循环键/值对吗?_Vba_Excel_Collections - Fatal编程技术网

我可以在VBA集合中循环键/值对吗?

我可以在VBA集合中循环键/值对吗?,vba,excel,collections,Vba,Excel,Collections,在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: " +

在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]);
}
我还知道我是通过Scripting.Dictionary VBA对象来实现这一点的,但我想知道这是否适用于集合


我可以迭代VBA集合中的键/值对吗?

无法从集合中检索键的名称。相反,您需要使用Dictionary对象:

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

这个answwer不是迭代集合的键,这似乎是不可能的,但是如果您不想使用字典,它会提供更多的解决方法

您可以按照中所述收集键值。(创建keyvalue类并将其放入集合。)

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

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

下面以add为例—尽管它仅限于string/int key/value,并且int值不是存储的,而是添加到以前的值中,这是我在SSR中聚合值所需要的。这可以很容易地修改,但不添加值,而是存储值

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
Private Sub-StoreAdd(ck作为集合,cv作为集合,k作为字符串,v作为整数)
作为整数的Dim i
发现Dim为布尔值=false
Dim val为整数=v
对于i=1到ck.Count
如果k=ck(i)
“存在,价值存在
val=val+cv(i)
'删除,稍后将再次添加
ck.删除(i)
cv.移除(i)
如果结束

如果我知道的话,你不能..如果你想遍历键/值对,你应该使用
字典
。.感谢早期绑定,新字典不起作用。但是新的脚本。字典又做了:D Thx。在我的VBA脚本中不起作用。我需要一个lib还是什么?@JohnsonJason:是的,到Microsoft脚本运行时,如注释代码中所述,或者使用注释的后期绑定代码,这是一个很好的答案,因为你展示了这个例子,包括早期绑定和后期绑定,让它变得清晰,同时也让其他人知道了其中的区别。但愿我能加上10个你!
 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