programing

VBA 컬렉션에서 키/값 쌍을 루프할 수 있습니까?

starjava 2023. 5. 22. 20:05
반응형

VBA 컬렉션에서 키/값 쌍을 루프할 수 있습니까?

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

스크립팅으로 이 작업을 수행한다는 것도 알고 있습니다.Dictionary VBA object인데 컬렉션으로 가능한지 궁금합니다.

VBA 컬렉션에서 키/값 쌍을 통해 반복할 수 있습니까?

컬렉션에서 키 이름을 검색할 수 없습니다.대신 Dictionary Object:

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

이 대답은 컬렉션의 키를 통해 반복되지 않습니다. 불가능한 것처럼 보이지만 사전을 사용하지 않으려는 경우 추가 해결 방법을 제공합니다.

https://stackoverflow.com/a/9935108/586754 에 설명된 대로 KeyValues 컬렉션을 수행할 수 있습니다. (KeyValues 클래스를 만든 다음 해당 컬렉션에 넣습니다.)

내(Excel이 아닌 SSRS) 경우 클래스를 추가할 수 없었고 .net 참조를 추가하고 싶지 않았습니다.

키를 저장하는 데 1개, 값을 저장하는 데 1개의 컬렉션을 사용하여 추가하거나 삭제할 때 동기화를 유지했습니다.

다음은 문자열/int 키/값으로 제한되지만 SSRS에서 값을 집계하는 데 필요한 int 값이 저장되지 않고 이전 값에 추가되는 예로 add를 보여줍니다.값을 추가하지 않고 저장하기 위해 쉽게 수정할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/21432222/can-i-loop-through-key-value-pairs-in-a-vba-collection

반응형