您好,我正在编写一个宏,用于比较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()
并声明所有变量。