Сравнение данных между двумя словарями в VBA - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь сравнить данные в двух словарях, чтобы определить ключи, которые имеют разные элементы.У меня возникают трудности при записи цикла и оператора if, чтобы это произошло.

В приведенном ниже примере создается два словаря - BeginningData и EndingData .Ключ "Джейн Джонс" имеет разные пункты в каждом словаре.

Вывод, который я ищу в этой ситуации: "Джейн Джонс 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

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

вам не нужны ни вложенные циклы, ни функция GetKey(), просто используйте Exists() метод объекта Dictionary, чтобы проверить наличие в словаре заданного ключа:

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
0 голосов
/ 23 мая 2018

Полный рабочий код для сравнения двух словарей и получения нужного мне результата:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...