【发布时间】:2017-01-19 18:04:15
【问题描述】:
您好,我正在编写一个宏,用于比较 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 列中。
【问题讨论】:
-
找到匹配时需要退出内循环。因此,将您的 if 更改为:
If x = y Then : match = True : Exit For : End If其中:是新行。 -
@ScottCraner - 我认为你的评论应该是“你应该退出......”,而不是“你需要退出......”。如果没有
Exit For,代码仍然可以工作,只是效率不高。 -
不,如果没有退出匹配,将始终将 x 与数组中最后一个 y 的比较返回给 if 语句。 @YowE3K
-
@ScottCraner - 你病了 - Shai 累了 - 我厌倦了上班。
-
我高度建议看看@ShaiRado 的回答。这是一个很好的答案,可以帮助你在这么短的宏中学到很多东西。使用
Match()对代码的大小和速度有很大好处。如果您愿意,甚至可以标记为答案。至于其他人,去上班睡觉吧!耶!