加速VBA循环并避免状态栏冻结
我写了这封信:加速VBA循环并避免状态栏冻结,vba,excel,Vba,Excel,我写了这封信: ReDim TempTableID(1 To records, 1 To 1) As Variant ReDim TempID(1 To lastrow + 13, 1 To 1) As Variant TempID = OppsClosed.Range("A14:A" & lastrow + 13).Value2 k = 1 For i = 1 To records 'Progress bar Applicati
ReDim TempTableID(1 To records, 1 To 1) As Variant
ReDim TempID(1 To lastrow + 13, 1 To 1) As Variant
TempID = OppsClosed.Range("A14:A" & lastrow + 13).Value2
k = 1
For i = 1 To records
'Progress bar
Application.StatusBar = "Progress: " & i & " of " & records + 1 & ": " & Format(i / (records + 1), "0%")
DoEvents 'Used to prevent Progress bar freezing
TempTableID(i, 1) = TempID(k, 1)
'TempTableID(i, 1) = OppsClosed.Range("A13").Offset(k, 0).Value2
variable = i / nHeader
If Fix(variable) = variable Then
k = k + 1
End If
Next i
其中记录
=1'000'000。循环需要大量的时间(1.5小时),因此我需要加快速度。当记录数
约为40000时,我添加了DoEvents以避免状态栏冻结,并让用户感觉循环正在运行。当然,我明白这会减慢进程
问题是:“我怎样才能加快速度避免冻结?”
p.s在简单的英语中,代码只需从第一个向量数组
[lastrow x 1]
中获取lastrow
元素,并复制第一个数组中的nHeader times
每个lastrow
元素。生成的数组是[lastrow*nHeader x 1]
您可以通过这一行来加速它:tentableid(i,1)=OppsClosed.Range(“A13”).Offset(k,0)。Value2
。你能在一次命中中将整个所需范围(A13:A100000-或最终范围是什么)移动到阵列中,然后在阵列中循环吗。将比每次迭代时引用电子表格快得多。谢谢。我尝试将第一个范围(大约14'000)放入一个数组,然后避免引用电子表格,但速度几乎相同…你可以将其作为穷人解决方案,在i
上使用一些模运算和if
来执行DoEvents
的次数较少,无需在循环的每一次循环中更新状态栏-只需每隔1000次左右更新一次(查看您的记录总数并制定适当的间隔)在一百万次循环中每100次DoEvents就太多了(百分比显示为10000个doevents)因此,仅每10000个进行一次。此外,仅在doevents的同时刷新状态栏。Doest TempID真的需要是二维的并声明为变体吗?只是想…您可能可以通过以下行加快速度:TentableId(i,1)=OppsClosed.Range(“A13”).Offset(k,0).Value2
。能否移动整个所需范围(A13:A100000-或最终范围的任何值)一次命中一个数组,然后在数组中循环。这比每次迭代时引用电子表格快得多。谢谢。我尝试将第一个范围(几乎为14'000)放入一个数组,然后避免引用电子表格,但速度几乎相同…作为穷人解决方案,可以对I使用一些模
和如果要执行DoEvents
的次数较少,则无需在循环的每一次过程中更新状态栏-只需每隔1000次左右更新一次(查看您的记录总数并设定适当的间隔)在一百万次循环中,每100次DoEvents太多(百分比显示为10000个doevents)因此,仅每10000个进行一次。此外,仅在doevents的同时刷新状态栏。Doest TempID真的需要是二维的并声明为变体吗?只是想。。。