在Excel中使用VBA进行匹配

3

我需要比较表格1和表格2中的两列。

如果表格1和表格2中的这两列都匹配,那么它们将会显示在表格3中,显示匹配结果。不幸的是,我只能匹配其中一列,然后将其显示在表格3中。

以下是我的代码:

Sub FindMatches()

    Dim Sht1Rng As Range
    Dim Sht2Rng As Range

    Set Sht1Rng = Worksheets("Sheet1").Range("B1", Worksheets("Sheet1").Range("B65536").End(xlUp))
    Set Sht2Rng = Worksheets("Sheet2").Range("H1", Worksheets("Sheet2").Range("H65536").End(xlUp))

    For Each c In Sht1Rng
        Set d = Sht2Rng.Find(c.Value, LookIn:=xlValues)

        If Not d Is Nothing Then
            Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).Value = c.Value
            Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(0, 1).Value = c.Offset(0, 2).Value
            Set d = Nothing
        End If
    Next c

End Sub

1
如果您想要检查2列,您可以做与此处相同的事情...类似于D变量,创建一个新变量并添加第二列的查找函数...然后在if语句中添加and条件。 - Sivaprasath Vadivel
如果您使用“B65536”来表示列中的最后一个单元格,请不要这样做。相反,使用Worksheet.Rows.Count,因为它将提供正确的最后一个单元格,并且不依赖于Excel的版本。 - SteveES
2个回答

3
为了将结果显示在“Sheet3”中,需要确保“Sheet1”和“Sheet2”中的两列具有相同的值。
因此,您可以使用Application.Match,它可以简化和缩短您的代码很多:
Option Explicit

Sub FindMatches()

    Dim Sht1Rng As Range
    Dim Sht2Rng As Range
    Dim C As Range

    With Worksheets("Sheet1")
        Set Sht1Rng = .Range("B1", .Range("B65536").End(xlUp))
    End With
    With Worksheets("Sheet2")
        Set Sht2Rng = .Range("H1", .Range("H65536").End(xlUp))
    End With

    For Each C In Sht1Rng
        If Not IsError(Application.Match(C.Value, Sht2Rng, 0)) Then ' <-- successful match in both columns
            Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0).Value = C.Value
            Worksheets("Sheet3").Range("A65536").End(xlUp).Offset(0, 1).Value = C.Offset(0, 2).Value
        End If
    Next C

End Sub

当仅比较一列时,它可以正常工作。我的数据如下:表1:列1: 列2: ID 金额 123 32 132 45 1234 50表2: 列1: 列2: ID 金额 123 0 132 45 1234 50我在表3上的显示应该是: 132 45 1234 50 - Janelle Koh Hui Juan

1
我已经在你的代码中添加了一个虚构的 Sht2Rng2。现在,如果在Sht2Rng中找到匹配项,则会在Sht2Rng2中进行第二次搜索,只有在第二个也被找到时才会将值写入Sheet3。根据需要调整Sht2Rng2的定义。
Sub FindMatches()

    Dim Sht1Rng As Range
    Dim Sht2Rng As Range, Sht2Rng2 As Range
    Dim C As Range, D As Range
    Dim R As Long

    With Worksheets("Sheet1")
        Set Sht1Rng = .Range("B1", .Range("B65536").End(xlUp))
    End With
    With Worksheets("Sheet2")
        Set Sht2Rng = .Range("H1", .Range("H65536").End(xlUp))
        Set Sht2Rng2 = .Range("J1", .Range("H65536").End(xlUp))
    End With


    For Each C In Sht1Rng
        Set D = Sht2Rng.Find(C.Value, LookIn:=xlValues)
        If Not D Is Nothing Then
            Set D = Sht2Rng2.Find(C.Value, LookIn:=xlValues)
            If Not D Is Nothing Then
                With Worksheets("Sheet3")
                    R = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                    .Cells(R, 1).Value = C.Value
                    .Cells(R + 1, 1).Value = C.Offset(0, 2).Value
                End With
            End If
        End If
    Next C
End Sub

你应该在代码表的顶部添加Option Explicit并声明所有变量。这将在某一天为你节省许多许多时间,避免你抓狂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接