从Access运行外部脚本

3
我希望我的Access应用程序在用户点击按钮后运行一个外部程序(在这种情况下是一个R脚本)。我使用以下代码:
Dim RetVal
RetVal = Shell("""C:\Program Files\R\R-2.10.1\bin\R.exe"" CMD BATCH --no-environ --silent --no-restore --no-save ""c:\test.R"" ""c:\test-result.txt""", vbHide)
MsgBox RetVal

这个方法可以正常工作,但是VBA代码在我的脚本执行时仍然在运行。我该如何让Access等待脚本完成?有没有人对如何将脚本的错误消息返回给Access有建议?


可能感兴趣的内容:http://www.tek-tips.com/viewthread.cfm?qid=1152885 - Fionnuala
谢谢。我有点不愿意使用低级别的kernel32代码,但也许我应该试一试。那么,从外部程序/脚本返回消息给调用Access代码怎么样? - waanders
我是指PHV的建议,其中返回时wit被设置为true: http://msdn.microsoft.com/en-us/library/d5fk67ky(VS.85).aspx - Fionnuala
也许你可以将输出重定向到一个可读的文件中?http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true - Fionnuala
你为什么会有任何不愿意使用Windows API的犹豫呢?你应该知道VBA Shell()命令只是一些Windows API的包装器,对吧? - David-W-Fenton
显示剩余2条评论
1个回答

1

OpenProcess和WaitForSingleObject组合,是@Remou提供的最佳解决方案。你应该看一下这个链接:this,它是一个好用的外部模块,可以用于Shell和等待。

如果要从脚本中返回消息,你可以尝试操作重定向脚本的输入和输出。但这并不简单。作为替代方案,我建议将脚本的输出重定向到一个文本文件,然后在脚本退出后读取该文件。


@Remou 的意思是第二个选项,即 CreateObject("WScript.Shell").Run 代码。那只是一句代码,而 Shell And Wait 代码在 cpearson.com 上有大约 250 句话。我不是懒惰,但是... ;-) - waanders
马克:谢谢,我会考虑不同的选择。 - waanders
我试图运行 http://www.cpearson.com/excel/ShellAndWait.aspx 上的代码。但我认为它是专门为 Excel 编写的 VBA 代码。我正在使用 Access VBA,它开始抱怨 XlEnableCancelKey(“类型未定义”)。 - waanders
@waanders,说得好,我应该再仔细阅读一些,你是正确的,里面有很多Excel特定的常量。这里有一个“简化”版本,没有所有的花哨功能(和Excel相关的东西):http://www.mvps.org/access/api/api0004.htm - Mark
谢谢。不幸的是,这个ShellWait例程没有返回一个值来指示进程是否成功完成。我需要稍微改一下它。 - waanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接