如何从Excel / VBA调用长时间运行的外部程序?

时间:2008-09-25 18:43:10

标签: windows excel excel-vba spreadsheet vba

从excel运行外部程序的最佳方法是什么?它可能会运行几分钟。关于如何做到这一点的最佳实践是什么?理想情况下,

  1. 一个模型对话框,让用户知道该进程正在执行。
  2. 如果可执行文件失败,则用户应收到通知。
  3. 应执行超时。
  4. 取消按钮应位于对话框中。
  5. 但欢迎任何最佳做法。我对调用.dll或.exe的解决方案感兴趣。最好是与Excel '03或更早版本一起使用的东西,但我也很想听到移动到更高版本的原因。

1 个答案:

答案 0 :(得分:5)

您应该查看这两篇Microsoft知识库文章

How to launch a Win32 Application from Visual Basic

How To Use a 32-Bit Application to Determine When a Shelled Process Ends

他们都快速为您提供启动流程的框架,然后检查其完成情况。每篇知识库文章都有一些可能相关的其他参考文献。

后一篇知识库文章假设您希望等待无限量的时间让shell进程结束。

您可以修改ret& = WaitForSingleObject(proc.hProcess,INFINITE)函数调用在以毫秒为单位的有限时间后返回 - 用表示毫秒的正值替换INFINITE并将整个事物包装在Do While循环中。返回值告诉您进程是否已完成或计时器是否已用完。如果过程结束,返回值将为零。

如果返回值非零,则进程仍在运行,但控制权将返回给您的应用程序。在此期间,当您对应用程序有正面控制权时,您可以确定是否更新某种UI状态,检查取消等。或者您可以再次循环并等待更多。

如果您正在炮击的程序是您编写的内容,甚至还有其他选项。您可以挂钩其中一个窗口并让程序发布消息,您可以将其附加到并用作状态反馈。如果您需要考虑它,最好留给单独的项目。

您可以使用流程结构从被调用进程获取返回值。您的进程需要返回一个值才有用。

我对这种需求的一般方法是:

  1. 在进程开始时使用取消按钮为用户提供非模态状态对话框,单击此按钮将设置稍后要检查的标记。向用户提供任何状态很可能是不可能的,因此给他们一个经过时间或其中一个动画GIF可能有助于管理期望。
  2. 启动流程
  3. 等待该过程完成,允许每500毫秒进行一次取消检查
  4. 如果该过程完成,请关闭对话框并继续。
  5. 如果进程未完成,请查看用户是否单击取消,如果是,则向进程窗口发送关闭消息。这可能不起作用,可能需要终止该过程 - 如果您这样做,请小心。如果它不能正常关闭,你最好的选择可能是放弃这个过程。您还可以检查此时的超时,并尝试采用与用户点击取消相同的路径。
  6. 希望这有帮助, 比尔。