干净取消长时间的API挂接过程很麻烦,而我正在尝试找出导航这种麻烦的最佳方法。
我使用的是excel 2016(具有手动计算功能,没有屏幕更新)-我可能需要一些时间来尝试在2010年运行该程序,以查看未来几天是否会解决任何问题(我知道速度会有所下降) 。
[随着时间的流逝,我的过程LongProcedure
失去了成功使用其取消功能的能力(可能是由于复杂性的增加)。它最初不一致,需要大量点击垃圾邮件才能取消,但现在完全失败了
这里是设置:首先,LongProcedure
在具有公共属性的类模块LongClass
中,该属性已针对早期取消检查,以使其可以清除。
Public Sub LongProcedure()
' [Set up some things] '
For Each ' [Item In Some Large Collection (Est. 300 Items)] '
' [Some Code (ETA 5 Seconds) Sprinkled with 3-4 DoEvents] '
' [Export workbook (ETA 10 Seconds)] '
If (cancelLongProcedure) Then Exit For
Next
' [Clean up some things] '
GeneratorForm.Reset ' Let the UserForm know we're finished
End Sub
其次,我从宏显示了一个UserForm,它实例化了过程类并运行过程。它包含一个运行按钮,一个状态标签和一个取消按钮。
Private MyLong As LongClass
Public Sub ButtonRunLongProcedure_Click()
Set myLong = New LongClass
myLong.LongProcedure()
End Sub
因此整个问题是双重的。ExportAsFixedFormat
调用打开一个“发布中...”进度条,该进度条将excel冻结大约十秒钟-很好。在我所有的努力中,我还没有找到一种在这种情况下处理用户输入的单一方法。最重要的是,DoEvents
调用似乎不再做任何事情来允许单击取消按钮。该过程会不一致地冻结excel,将选项卡冻结到其他打开的程序中,以及(当未冻结时)更新状态标签。
我已经尝试:
SetStatusLabel
方法上,而不是进行散布-尽管表单仍然经常冻结,否则它将一致地更新状态标签(尽管仍然不允许取消按钮)Sleep
代替DoEvents
,并且除了延迟1、5、10、50和250ms之外-[form]根本没有任何事件就停止了更新,并且冻结了更多时间。] >Do While
循环持续运行DoEvents
一秒钟(冻结)something
干净取消长时间的API挂接过程是一种地狱,我正在尝试找出导航地狱的最佳方法。我正在使用excel 2016(具有手动计算功能,没有屏幕...