【发布时间】:2016-10-21 07:06:30
【问题描述】:
所以我目前的代码如下所示:我基本上是在尝试检查是否可以在另一张表的 C 列中找到一张表的 B 列,然后我会在另一张表的行中找到 B 值,取其 H 列值并将其复制到当前工作表的 AI 列。对于 B 列中的每一行都会重复此过程。
我遇到的问题是它的运行速度太慢了,即使关闭了屏幕更新等。这是有道理的,因为它必须循环遍历超过 50000 个值以及它必须查找的所有值。如果有人能够仔细研究并提出可以加快进程的潜在方法,我将不胜感激。谢谢。
Sub Calculation()
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
Dim i As Long, LastRow As Long
LastRow = Range("A" & Rows.Count).End(xlUp).Row
For i = 5 To LastRow
Set wb1 = ThisWorkbook
Dim anyRow As Long
For anyRow = 4 To 500
If wb1.Sheets("Total").Cells(anyRow, 2).Value = wb1.Sheets("Record").Cells(i, 3).Value Then
wb1.Sheets("Record").Cells(i, 35).Value = wb1.Sheets("Total").Cells(anyRow, 8).Value
End If
Next anyRow
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
End Sub
【问题讨论】:
-
为什么每次迭代都重置
wb1?我不确定,但那有多糟糕。Dim anyRow也一样。 -
您在哪个工作表中找到 A 列的最后一行?
-
@arcadeprecinct 是的。我应该把这些排除在外。不过它的运行速度仍然非常慢:(
-
@charrrrrrrrr 访问单元格最多可以浪费 99% 的时间...只需将它们加载到数组中,然后检查数组值...您也应该离开内部循环如果找到匹配项...也就是说,如果您只想检查该值是否存在于 B4:B500 范围内,请使用
isnumeric(application.match(...)),这非常快! -
@charrrrrrrrr 在将初始代码
...Sheets("Total").Cells(i, 8)...更改为...Sheets("Total").Cells(anyRow, 8)...之后是真的...但是运行它两次仍然比循环整个范围要快得多...match也是用于4 To 500范围,不会出错(已测试)
标签: excel vba performance loops