【发布时间】:2018-03-15 11:46:15
【问题描述】:
很抱歉,如果已经有人问过这类问题,我找不到所需的答案,而且我对 VBA 还是很陌生。
我正在尝试通过在两个工作簿之间移动的索引匹配将一个表中的一些值匹配到另一个表。为了正确地做到这一点,我使用了两个循环 For To。但是当涉及到几千行时,我的代码真的很慢。我可以用数组或其他东西改进它吗?
Dim mainWB As Workbook
Dim mainWS As Worksheet
Set mainWB = ActiveWorkbook
Set mainWS = mainWB.Sheets(1)
Dim RowsToProcess As Long
RowsToProcess = mainWS.Range("C" & Rows.Count).End(xlUp).Row
Dim lastCol As Long
lastCol = mainWS.Cells(10, Columns.Count).End(xlToLeft).Column
Range(Cells(11, 8), Cells(RowsToProcess, lastCol)).Select
Selection.NumberFormat = "General"
For i = 1 To lastCol
For a = 1 To RowsToProcess
If Workbooks("template.xls").Sheets("#").Cells(10 + a, 7 + i).Value <> vbNullString Then
Cells(10 + a, 7 + i).Select
ActiveCell.FormulaR1C1 = _
"= "Long Formula" "
End If
Next
Next
对于我的长公式。它基本上是在做 2 Index(Match. between this Workbook and 2 others,但我想我会把它拿出来让它更清楚
非常感谢您的帮助!
【问题讨论】:
-
第一件事是你应该摆脱
.Select这是一个非常糟糕的做法,总是会减慢你的代码。有很多教程如何避免使用.Select。另请查看Application.ScreenUpdating Property (Excel),并考虑在代码开头切换到手动计算模式,最后切换回自动,请参见Application.Calculation Property (Excel)。 -
避免。选择例如Cells(10 + a, 7 + i).Select ActiveCell.FormulaR1C1 可以写成 Cells(10 + a, 7 + i).FormulaR1C1。此外,在处理对象时使用 With 语句,例如ozgrid.com/VBA/SpeedingUpVBACode.htm
-
没有 .select 我从 166 处理时间下降到 41 秒,然后是手动计算的 26 秒谢谢!