簡體   English   中英

在VBA中比較兩個詞典之間的數據

[英]Comparing data between two dictionaries in VBA

我正在嘗試比較兩個字典中的數據,以識別具有不同項目的鍵。 我很難寫出循環和if語句來實現它。

在下面的例子中,它提出了兩個dictionaries-- BeginningDataEndingData。 鍵“簡·瓊斯”在每個詞典中都有不同的項目。

在這種情況下,我正在尋找的輸出是: “簡·瓊斯在第一本詞典中是222222222,而在第二本詞典中是444444444”

關於如何完成此代碼的任何想法? 我正在嘗試避免在此特定項目中使用數組。 謝謝!

Sub MainProcess()

Dim BeginningData As Dictionary, EndingData As Dictionary

Dim StartItem As Variant, EndItem As Variant

Set BeginningData = New Dictionary
Set EndingData = New Dictionary

With BeginningData
    .Add "John Smith", 111111111
    .Add "Jane Jones", 222222222
    .Add "Jim Brown", 333333333
End With

With EndingData
    .Add "John Smith", 111111111
    .Add "Jane Jones", 444444444
    .Add "Jim Brown", 333333333
End With

For Each StartItem In BeginningData.Keys
    For Each EndItem In EndingData.Keys

        'Some sort of if statement here
            Debug.Print _
            GetKey(BeginningData, BeginningData.Item(EndItem)) & _
            " is " & _
            BeginningData.Item(StartItem) & _
            " in the first dictionary, but is " & _
            EndingData.Item(StartItem) & _
            " in the second dictionary."
        End If

    Next
Next

End Sub

Function GetKey(Dic As Dictionary, strItem As String) As String
    Dim key As Variant
    For Each key In Dic.Keys
        If Dic.Item(key) = strItem Then
            GetKey = CStr(key)
            Exit Function
        End If
    Next
End Function

您既不需要嵌套循環,也不需要GetKey()函數,只需使用Dictionary對象的Exists()方法來檢查包含給定鍵的字典:

Option Explicit

Sub WorkingProcess()
    Dim BeginningData As Dictionary, EndingData As Dictionary

    Dim BeginningItem As Variant

    Set BeginningData = New Dictionary
    Set EndingData = New Dictionary

    With BeginningData
        .Add "John Smith", 111111111
        .Add "Jane Jones", 222222222
        .Add "Jim Brown", 333333333
    End With

    With EndingData
        .Add "John Smith", 111111111
        .Add "Jane Jones", 444444444
        .Add "Jim Brown", 333333333
    End With

    For Each BeginningItem In BeginningData.Keys
        If EndingData.Exists(BeginningItem) Then ' if current "beginning" dict key is in "ending" dict
            If BeginningData.Item(BeginningItem) <> EndingData.Item(BeginningItem) Then ' if items don't match
                Debug.Print _
                BeginningItem & _
                " is " & _
                BeginningData.Item(BeginningItem) & _
                " in the first dictionary, but is " & _
                EndingData.Item(BeginningItem) & _
                " in the second dictionary."
            End If
        End If
    Next
End Sub

用來比較兩個字典並產生所需輸出的完整工作代碼是:

Sub WorkingProcess()

Dim BeginningData As Dictionary, EndingData As Dictionary

Dim StartItem As Variant, EndItem As Variant

Set BeginningData = New Dictionary
Set EndingData = New Dictionary

With BeginningData
    .Add "John Smith", 111111111
    .Add "Jane Jones", 222222222
    .Add "Jim Brown", 333333333
End With

With EndingData
    .Add "John Smith", 111111111
    .Add "Jane Jones", 444444444
    .Add "Jim Brown", 333333333
End With

For Each StartItem In BeginningData.Keys
    For Each EndItem In EndingData.Keys

        If GetKey(BeginningData, BeginningData.Item(StartItem)) = _
        GetKey(BeginningData, BeginningData.Item(EndItem)) And _
        BeginningData.Item(StartItem) <> EndingData.Item(StartItem) Then
            Debug.Print _
            GetKey(BeginningData, BeginningData.Item(EndItem)) & _
            " is " & _
            BeginningData.Item(StartItem) & _
            " in the first dictionary, but is " & _
            EndingData.Item(StartItem) & _
            " in the second dictionary."
        End If

    Next
Next

End Sub

Function GetKey(Dic As Dictionary, strItem As String) As String
    Dim key As Variant
    For Each key In Dic.Keys
        If Dic.Item(key) = strItem Then
            GetKey = CStr(key)
            Exit Function
        End If
    Next
End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM