VBA 状态栏中的进度更新每次都恰好在第 327 行停止更新

VBA Progress update in Status bar stops updating at exactly row 327 every time

我在 vba 中创建了 for 循环,它通过循环整数的值更新状态栏中的进度。 有2个循环;一个循环中的进度非常好,而在另一个循环中却卡住了,尽管两者几乎都是副本。尝试了不同的文件,重新启动,关闭 excel 等,每次它 卡在第 327 行。 不知道为什么,第 327 行并不特殊,在不同的文件中也是如此 它总是第 327 行。 它也没有工作得那么快以至于它可能会被遗忘。 循环经过数千行并且随着时间的推移变得非常缓慢,所以它移动就像一秒一行;同时更新状态栏不应该太快。 更奇怪的行为是当它在完成一个文件后转到下一个工作簿时,第一个循环仍然再次更新进度条,但是第二个循环再次得到卡在第 327 行。

我无法在这里附上完整的代码,它超过了 800 行,甚至这个模块也有 320 行,所以我在这里附上了一个示例。

(整体代码运行完美,只是进度条卡住了)

for i = 2 to lastrow
Application.StatusBar = Round((i * 100) / lastrow, 0) & "% row " & i & " of " & lastrow

    if i mod 2 = 0 then
       'my code here
    else
       'my code here
    end if
next 

for x = 2 to lastrow
Application.StatusBar = Round((x * 100) / lastrow, 0) & "% row " & x & " of " & lastrow

    if x mod 2 = 0 then
       'my code here
    else
       'my code here
    end if
next 

我强烈认为您是数值溢出的受害者。 327 * 100 = 32700,该值适合 16 位整数。 328 * 100 = 32800 并且不适合整数。在我的测试中,您的计算公式出现溢出运行时错误。

因此我认为

  • 您将 ix 声明为 Integer。最好的办法是忘记 VBA 中存在的数据类型,改用 Long,请参阅 Integer Vs Long Confusion
  • 你在某个地方有一个错误处理例程,它隐藏了应该弹出的溢出错误。

将变量声明为 Long 应该可以解决问题:

Option Explicit

Const lastrow = 500
Sub test1()
    Dim x As Integer
    For x = 1 To lastrow
        ' Throws runtime error when x >= 328
        Application.StatusBar = Round((x * 100) / lastrow, 0) & "% row " & x & " of " & lastrow
    Next
End Sub

Sub test2()
    Dim x As Long
    For x = 1 To lastrow
        ' No runtime error
        Application.StatusBar = Round((x * 100) / lastrow, 0) & "% row " & x & " of " & lastrow
    Next
End Sub