您好,我正在编写一个宏,用于比较excel中不同工作表上的两列。
宏如下:

Sub Main()
Application.ScreenUpdating = False

    Dim stNow As Date
    stNow = Now

    Dim arr As Variant
    arr = Worksheets("Sheet2").Range("W3:W" & Range("W" & Rows.Count).End(xlUp).Row).Value

    Dim varr As Variant
    varr = Worksheets("Sheet3").Range("P3:P" & Range("P" & Rows.Count).End(xlUp).Row).Value

    Dim x, y, match As Boolean
    For Each x In arr
        match = False
        For Each y In varr
            If x = y Then match = True
        Next y
        If Not match Then
            Worksheets("Sheet1").Range("L" & Range("L" & Rows.Count).End(xlUp).Row + 1) = x
        End If
    Next

    Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub


如果列在同一张纸上,并且代码中没有工作表引用,则可以完美地工作。但是现在,它仅从Sheet3列W复制第一个单元格,尽管此值已经存在于Sheet3的P列中。

最佳答案

如您所见,没有工作表引用时,它可以正常工作。

您需要始终限定Range()Rows.Columns.,否则它将使用任何ActiveSheet

以下应为您工作。

Sub Main()
Application.ScreenUpdating = False

Dim stNow   As Date
stNow = Now

Dim arr     As Variant
With Worksheets("Sheet2")
    arr = .Range("W3:W" & .Range("W" & .Rows.Count).End(xlUp).Row).Value
End With

Dim varr    As Variant
With Worksheets("Sheet3")
    varr = .Range("P3:P" & .Range("P" & .Rows.Count).End(xlUp).Row).Value
End With

Dim x, y, match As Boolean
For Each x In arr
    match = False
    For Each y In varr
        If x = y Then
            match = True
            Exit For
        End If
    Next y
    If Not match Then
        With Worksheets("Sheet1")
            .Range("L" & .Range("L" & .Rows.Count).End(xlUp).Row + 1) = x
        End With
    End If
Next

Debug.Print DateDiff("s", stNow, Now)
Application.ScreenUpdating = True
End Sub


注意:我添加了With语句以减少使用Worksheets("Sheetx").的重复性。此外,根据@ScottCraner的评论,更新了If x = y语句。

我也看到您有一些未声明的变量。我建议在开始时(在Option Explicit之前)添加Sub Main()并声明所有变量。

10-08 01:03