如何从Excel / VBA调用长时间运行的外部程序?
时间:2020-03-06 14:44:27 来源:igfitidea点击:
从excel运行外部程序的最佳方法是什么。它可能会运行几分钟。如何做到这一点的最佳实践是什么。理想情况下,
- 让用户知道流程正在执行的模型对话框。
- 如果可执行文件失败,则用户应收到通知。
- 应该执行超时。
- 取消按钮应位于对话框上。
但是任何最佳做法都是值得欢迎的。我对调用.dll或者.exe的解决方案感兴趣。最好是与Excel '03或者更早版本兼容的产品,但我也希望听到一个理由也需要升级到更高版本。
解决方案
我们应该查看这两篇Microsoft KB文章
如何从Visual Basic启动Win32应用程序
和
如何使用32位应用程序确定Shelled进程何时结束
它们都可以快速为我们提供启动流程的框架,然后检查其是否完成。每个知识库文章都有一些其他可能相关的参考。
后面的知识库文章假定我们要等待无数时间才能结束Shell进程。
我们可以修改ret&= WaitForSingleObject(proc.hProcess,INFINITE)函数调用,以在经过有限的时间(以毫秒为单位)后返回-将INFINITE替换为代表毫秒的正值,然后将整个内容包装在Do While循环中。返回值告诉我们过程是否已完成或者计时器已用完。如果过程结束,则返回值为零。
如果返回值不为零,则该进程仍在运行,但控制权交还给应用程序。在这段时间内,当我们对应用程序有积极的控制权时,我们可以确定是否更新某种UI状态,检查取消等。或者我们可以再次循环并等待更多。
如果要编写的程序是我们编写的程序,甚至还有其他选项。我们可以插入其窗口之一,并让程序发布消息,我们可以将其添加并用作状态反馈。如果需要考虑,最好将其留给单独的物品。
我们可以使用流程结构从被调用的流程中获取返回值。流程确实需要返回一个值,此值才有用。
对于这种需求,我的一般方法是:
- 在过程开始时为用户提供一个非模式状态对话框,并带有一个"取消"按钮,单击该按钮将设置一个标志,以便以后检查。为用户提供任何状态很可能是不可能的,因此给他们一个经过的时间或者其中一个动画GIF可能有助于管理期望。
- 开始过程
- 等待过程完成,允许每500毫秒执行一次取消检查
- 如果该过程完成,请关闭对话框并继续。
- 如果该过程未完成,请查看用户是否单击了取消,如果是,则向该过程的窗口发送关闭消息。这可能行不通,并且可能需要终止该过程-如果这样做,请务必小心。最好的选择是,如果无法正常关闭,则放弃该过程。我们还可以在此时检查是否有超时,并尝试采用与用户单击"取消"相同的路径。
希望这可以帮助,
账单。