我正在尝试维护一个使用 AnalystCave 的 ProgressBar
的旧工具正在运行的代码是示例:
Sub ExampleProgressBar()
Dim pb As ProgressBar
Set pb = New ProgressBar
pb.Initialize "My title", 100
'Add 10% progress
pb.AddProgress 10
'...
'Hide and remove the Progress Bar
pb.Hide
Set pb = Nothing
End Sub
尽管 VBA 实际上并没有冻结,但该代码永远不会停止。当我进入 VBA 开发工具并点击暂停时,很明显它正在处理下面的 DoEvents:
Public Sub AddProgress(Optional inc As Long = 1)
'Increase progress by an increment
Dim tl As Double, tlMin As Long, tlSec As Long, tlHour As Long, tlTotal As Long, tlTotalSec, tlTotalMin, tlTotalHour
progress = progress + inc
If progress > maxProgress Then progress = maxProgress
lBar.Width = CLng(CDbl(progress) / maxProgress * maxWidth)
' #################################################
DoEvents '<<<<<<< ########### VBA Can't get passed here ###########
' #################################################
tl = Time - startTime
tlSec = Second(tl) + Minute(tl) * 60 + Hour(tl) * 3600
tlTotal = tlSec
If progress = 0 Then
tlSec = 0
Else
tlSec = (tlSec / progress) * (maxProgress - progress)
End If
...
End Sub
为什么会出现这种情况?
我尝试的第一件事是重新编译整个工作簿(删除所有 vba 模块,保存并重新导入所有模块)。这并没有削减它。
事实证明我的场景非常具体。我大约 6 年前开发了这个工具,之前它有一个 OfficeJS 画布插件,可以显示用户在地理空间地图上选择的位置。此后,由于 IT 安全等原因,该加载项已变得无法访问。因此,以下加载项错误已经存在了一段时间,但之前并未影响工作簿的操作。
完全删除画布插件并保存后,DoEvents 终于完成了。我假设 Microsoft Office 团队最近更改了有关 OfficeJS Canvas 错误的一些内容,这导致
Application.DoEvents
永远“冻结”(加载项必须始终生成事件......也许是轮询?)
最终,如果将来有人遇到同样的问题,请考虑删除 OfficeJS 画布加载项,看看是否可以解决问题。