我可以在VBA集合中循环键/值对吗?
在VB.NET中,我可以遍历字典的键/值对:我可以在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: " +
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