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 并且不适合整数。在我的测试中,您的计算公式出现溢出运行时错误。
因此我认为
- 您将
i
和 x
声明为 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
我在 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 并且不适合整数。在我的测试中,您的计算公式出现溢出运行时错误。
因此我认为
- 您将
i
和x
声明为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