Сравните два листа и скопируйте дубликаты данных на новый лист (сравните с 2 столбцами)

#excel #vba

Вопрос:

Я пытаюсь сравнить два столбца двух листов, а затем скопировать дубликаты данных на новый лист.

Ее код у меня сейчас есть.

 Sub CopyDuplicates()
    MsgBox "Process begin now. if you cannot see any result after processing, " amp; _
           "it means there is no duplicate data between two sheets."
    
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim lr1 As Long, lr2 As Long, r As Long, r3 As Long
    Dim ar As Variant, i As Long
    
    Set ws1 = Sheets("Sheet1")
    Set ws2 = Sheets("Sheet2")
    Set ws3 = Sheets("Sheet3")
    ws3.Cells.Clear

    lr1 = ws1.UsedRange.Rows.Count
    lr2 = ws2.UsedRange.Rows.Count
    ws1.UsedRange.Interior.ColorIndex = xlNone
    ws2.UsedRange.Interior.ColorIndex = xlNone

    ' build dictionary from sheet2 col B
    Dim dict, key As String
    Set dict = CreateObject("Scripting.Dictionary")
    
    For r = 1 To lr2
        key = Trim(ws2.Cells(r, "B"))
        If Len(key) > 0 Then
            If dict.exists(key) Then
                dict(key) = dict(key) amp; ";" amp; r
            Else
                dict.Add key, r
            End If
        End If
    Next

    Application.ScreenUpdating = False
    r3 = 1 ' sheet3
    ' scan sheet 1 looking for to match with sheet 2
    For r = 1 To lr1
        key = Trim(ws1.Cells(r, "B"))
        If dict.exists(key) Then
            ' copy multiple matches
            ar = Split(dict(key), ";")
            For i = LBound(ar) To UBound(ar)
                ws1.Range("A" amp; r).Resize(1, 6).Copy ws3.Range("A" amp; r3) ' A:F
                ws2.Range("A" amp; ar(i)).Resize(1, 17).Copy ws3.Range("G" amp; r3) ' A:Q
                r3 = r3   1
            Next
        End If
    Next
   
    Application.ScreenUpdating = True
    MsgBox "Process finished"
End Sub
 

Он может сравнивать только один столбец из 2 листов, то есть столбцы B. Но я хочу сравнить столбцы B и C, когда оба столбца B и C двух листов совпадают, скопируйте всю строку данных на новый лист(лист3).

 This is my expected return:

I assume that sheet1 and sheet2 only have column A B C


A     B     C     D     E    F
GRF HO1335 KKK   BLG HO1335 KKK
GRF HO1335 KKK   SKT HO1335 KKK
GRF HO1335 KKK   T1  HO1335 KKK
DWG HO1335 HHH   CLG HO1335 HHH
DWG HO1335 HHH   FNC HO1335 HHH
DWG HO1335 HHH   BYG HO1335 HHH

 

Могу я спросить, как я могу сравнить две колонки одновременно?
Я все еще новичок в VBA, поэтому я не так хорошо знаком с этим. Большое вам спасибо за вашу помощь.

Комментарии:

1. Объедините 2 столбца, чтобы получить ключ key = Trim(ws2.Cells(r, "B") amp; vbTab amp; Trim(ws2.Cells(r, "C")

2. В нем говорилось, что произошла ошибка компиляции: ожидается:: Разделитель списков или )

3. Добавить заключительные скобки key = Trim(ws2.Cells(r, "B")) amp; vbTab amp; Trim(ws2.Cells(r, "C"))