通过长时间运行的过程(DoEvents或其他方式持续接收用户输入)

问题描述 投票:0回答:1

干净取消长时间的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,将选项卡冻结到其他打开的程序中,以及(当未冻结时)更新状态标签。

我已经尝试:

  • 将DoEvents附加到SetStatusLabel方法上,而不是进行散布-尽管表单仍然经常冻结,否则它将一致地更新状态标签(尽管仍然不允许取消按钮)
  • 使用winAPI Sleep代替DoEvents,并且除了延迟1、5、10、50和250ms之外-[form]根本没有任何事件就停止了更新,并且冻结了更多时间。] >
  • 使用Do While循环持续运行DoEvents一秒钟(冻结)
  • 覆盖QueryClose以取消该表单。这一帮助很大。由于某些原因,关闭[x]按钮的频率可以比用户窗体按钮更连续地单击[[far
  • -仍然不如我所愿。问题?在发布过程中,Excel停止响应,因此,如果您单击两次关闭按钮,则现代窗口将终止该过程...而无需清理。使用Application.OnTime定期调用DoEvents。总体上似乎并没有改善状况
  • 按住Alt键。不完全是。由于某种原因,虽然有时使用alt键制表会使用户窗体更难冻结,但有时却使其停止冻结和更新。
  • 这是我愿意做的大量重构工作,包括将长过程的想法分解为单独的方法,首先执行设置,并在类终止时进行清理,这是一个问题。我正在寻找提供一致结果的

    something

。 -我将接受从excel版本到excel设置再到winAPI调用重构的所有内容。感谢您对此有任何见识。

干净取消长时间的API挂接过程是一种地狱,我正在尝试找出导航地狱的最佳方法。我正在使用excel 2016(具有手动计算功能,没有屏幕...

excel vba userform
1个回答
0
投票
事实证明,将一些有用的改进与新的改进简单地组合在一起,就可以带来很大的不同。
© www.soinside.com 2019 - 2024. All rights reserved.