【发布时间】:2015-12-04 21:49:28
【问题描述】:
我目前有代码可以让我查看工作表 1 和工作表 2 中具有匹配 ID 的行。当两个 ID 匹配时,工作表 2 信息将粘贴到具有相同 ID 的工作表 1 行。我的代码在不到 1,000 行上工作,当我测试它时,它在一分钟内给出了结果。
问题是,当我尝试运行它 1,000,000 行时,它会继续运行超过 20 分钟,并且从那时起就再也没有停止运行。我希望任何人都可以帮助我更改代码以允许我执行循环并将信息从表 2 复制粘贴到表 1 中 200,000 行。
Sub Sample()
Dim tracker As Worksheet
Dim master As Worksheet
Dim cell As Range
Dim cellFound As Range
Dim OutPut As Long
Set tracker = Workbooks("test.xlsm").Sheets("Sheet1")
Set master = Workbooks("test.xlsm").Sheets("Sheet2")
Application.ScreenUpdating = False
For Each cell In master.Range("A2:A200000")
Set cellFound = tracker.Range("A5:A43000").Find(What:=cell.Value, LookIn:=xlValues, LookAt:=xlWhole)
If Not cellFound Is Nothing Then
matching value
cellFound.Offset(ColumnOffset:=1).Value2 = cell.Offset(ColumnOffset:=2).Value2
Else
End If
Set cellFound = Nothing
Debug.Print cell.Address
Next
Application.ScreenUpdating = True
OutPut = MsgBox("Update over!", vbOKOnly, "Update Status")
End Sub
以上是我现在拥有的代码。
【问题讨论】:
-
对于初学者,通过
Debug.Print cell.Address将 200,000 个单元格地址写入 VBE 的即时窗口将对性能产生负面影响。实际上,在不重要的情况下将 200,000 个 anything 写入 anywhere 会对性能产生负面影响。 -
将跟踪表中的值加载到字典对象中,将值作为键,将行号作为值。将整个 A2:B200000 范围读入一个变体数组并循环遍历它,检查字典是否匹配:当您找到匹配项时,将数组的第二个“列”中的值复制到您从字典对象。
-
与@TimWilliams 的方法相同,但我会将两张表都复制到数组中
-
为了从你的叙述中看到数字,你说你可以在“不到一分钟”内运行 1000 个值。将其四舍五入一分钟。 1,000,000 行是 1000²,因此即使不考虑较大数据集的性能下降,这意味着 1,000,000 行将需要 1000 分钟或 16 小时 40 分钟。