当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何从Excel/VBA调用长时间运行的外部程序?》经验,为你挑选了1个好方法。

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

    一个模型对话框,让用户知道进程正在执行.

    如果可执行文件失败,则用户应收到通知.

    应该强制执行超时.

    取消按钮应位于对话框中.

但欢迎任何最佳做法.我对调用.dll或.exe的解决方案感兴趣.最好是与Excel '03或更早版本一起使用的东西,但我也很想听到移动到更高版本的原因.



1> Bill..:

您应该查看这两篇Microsoft KB文章

如何从Visual Basic 和Visual Basic启动Win32应用程序

如何使用32位应用程序来确定外壳进程何时结束

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

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

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

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

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

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

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

    使用取消按钮在进程开始时为用户提供非模态状态对话框,单击该按钮将设置稍后要检查的标志.向用户提供任何状态很可能是不可能的,因此给他们一个经过时间或其中一个动画GIF可能有助于管理期望.

    开始这个过程

    等待该过程完成,每500ms进行一次取消检查

    如果该过程完成,请关闭对话框并继续.

    如果进程未完成,请查看用户是否单击取消,如果是,则向进程窗口发送关闭消息.这可能不起作用,可能需要终止该过程 - 如果您这样做,请小心.如果它不能正常关闭,你最好的选择可能是放弃这个过程.您还可以检查此时的超时,并尝试采用与用户点击取消相同的路径.

比尔希望这有帮助.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有