我正在审查旧版VBA代码以提高性能。
我想将单元格赋值改为区域和数组赋值。
如何将单元格引用转换为区域?
Sheets("Model").Activate
YearRange = Range("C7:EZ7").value
loopvar = 1
Do While YearRange(1, loopvar) <> "" And Right(Trim(YearRange(1, loopvar)), 1) <> "E"
strValue = Trim(YearRange(1, loopvar))
Year = CInt(strValue)
GetSpecificData Year, RptPe, RptAvg
If (RptPe <> 0) Then Cells(508, loopvar + 2).value = RptPe
If (RptAvg <> 0) Then Cells(509, loopvar + 2).value = RptAvg
loopvar = loopvar + 1
Loop
单元格赋值大约是15。我放了两个供参考。通常有30年或更长时间,所以运行这段代码通常需要大约20秒或更长时间。
我在另一个地方有一个类似的循环,但不是使用单元格,而是使用范围,我能够创建一个数组,然后将数组赋值给范围,并将时间减少到不到一秒。GetSpecificData
从一年中获取数据,并用这些数据填充变量,因此执行此操作所需的时间可以忽略不计。
瓶颈似乎是数据到单元格的分配。
1条答案
按热度按时间dvtswwa31#
由于信息有限,很难说可能的原因。
但可能的罪魁祸首是XL中的自动重新计算?您的工作表现在在每个
Cells(508, loopvar + 2).value = RptPe
之后重新计算整个工作表,这可能是执行缓慢的原因。也许你可以像下面这样用
Application.Calculation = xlCalculationManual
来修饰While ... Loop
,但是要确保一些错误处理,否则如果出现错误或者代码中断,你的应用程序会“卡”在非计算模式中。