加速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真的需要是二维的并声明为变体吗?只是想。。。