【发布时间】:2017-11-14 18:06:43
【问题描述】:
所以我有一个包含 1000 多行的主工作表和另一个“应该”具有相同数据的工作表。但是,实际上有时主服务器中缺少一些,有时查询运行中缺少一些。
为简单起见,假设唯一 ID 在 B 列中。这是我的代码,但它非常慢,而且只进行单向比较。
我的理想代码应该是运行得更流畅一些,并为我提供主数据和查询中缺失的数据。
我提问的方式有问题吗,请告诉我。
Sub FindMissing()
Dim lastRowE As Integer
Dim lastRowF As Integer
Dim lastRowM As Integer
Dim foundTrue As Boolean
lastRowE = Sheets("Master").Cells(Sheets("Master").Rows.Count, "B").End(xlUp).Row
lastRowF = Sheets("Qry").Cells(Sheets("Qry").Rows.Count, "B").End(xlUp).Row
lastRowM = Sheets("Mismatch").Cells(Sheets("Mismatch").Rows.Count, "B").End(xlUp).Row
For i = 1 To lastRowE
foundTrue = False
For j = 1 To lastRowF
If Sheets("Master").Cells(i, 2).Value = Sheets("Qry").Cells(j, 2).Value Then
foundTrue = True
Exit For
End If
Next j
If Not foundTrue Then
Sheets("Master").Rows(i).Copy Destination:= _
Sheets("Mismatch").Rows(lastRowM + 1)
lastRowM = lastRowM + 1
End If
Next i
End Sub
【问题讨论】:
-
两件事可以帮助您加快代码速度;首先在代码的开头添加
Application.ScreenUpdating = False,然后在最后一个For循环的末尾重新应用Application.ScreenUpdating = True。最后,不要使用.Copy,而是尝试使用Range("A1").Value = Range("B1").Value仅提取从位置到目的地的值 -
您为什么使用
Sheets("E Dump").Rows.Count来帮助定位主工作表上的最后一行? -
哎呀,试图简化遗漏的工作表名称
-
@Maldred 神圣的蝙蝠侠,application.screenupdate 太棒了。速度提高了 10 倍。我在第二部分仍然遇到问题
-
永远不要将任何东西声明为 Integer,始终声明为 Long。 Integer 的限制为 32767,并且无论如何都会转换为 Long。将 i 和 j 声明为 Long,现在它们是未声明的,因此它们默认具有 Variant 类型。如果数据量很大,它会影响速度,但如果整数适用于这个数据集,应该不会有任何明显的改进。