我想编写一个使用 shell 命令打开某个外部应用程序的宏,等待确切的时间,然后关闭该应用程序并打开新的,也是从命令行,我的问题是代码在 shell 命令 taskkill 后不执行。我检查了如果在调试模式下运行宏是否可以正常工作,有人知道出了什么问题吗?
Retval = Shell("C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe -I -R C:UsersPavelDocumentsAnsys_importbasic_1.wbjn")
Application.Wait (Now + TimeValue("00:02:00"))
Retval = Shell("taskkill /f /im AnsysFww.exe")
newpar = Shell("C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe -I -R C:UsersMARCINDocumentsAnsys_importbasic_2.wbjn")
围绕系统的边缘和接缝进行调试总是不平凡的,这正是这里发生的事情:就VBA 而言,您的代码没有任何问题,除了您不需要捕获函数的返回值(例如RetVal
),如果您以后不打算使用它。
问题在于提供给Shell
命令的参数。
获取整个命令字符串(不带分隔引号),然后复制它。
C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe -I -R C:UsersMARCINDocumentsAnsys_importbasic_2.wbjn
如果字符串是从字符串文字和变量值构建/连接起来的,则将命令字符串放入剪贴板的最简单方法是通过引入局部变量来分离提出命令字符串和执行shell 命令的责任:
Dim cmd As String
cmd = "..." & "..." & "..."
Shell cmd ' place breakpoint here (F9)
在运行时命中断点时,打开即时窗格(Ctrl+G) 并输出cmd
变量的值:
?cmd
C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe -I -R C:UsersMARCINDocumentsAnsys_importbasic_2.wbjn
现在您可以从那里复制它。
接下来,启动cmd.exe
并粘贴命令字符串;预计会出现错误消息。
正如 Tim Williams 之前所暗示的那样,错误与路径中的空格有关:您需要引用它:
"C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe" -I -R C:UsersMARCINDocumentsAnsys_importbasic_2.wbjn
如果这在cmd.exe
中有效,那么您知道如何修复您的 VBA 代码 - 请记住,由于"
双引号分隔字符串文字,因此您需要将它们加倍才能转义它们:
cmd = """C:Program FilesANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe"" -I -R C:UsersMARCINDocumentsAnsys_importbasic_2.wbjn"
最后,路径的C:UsersMARCINDocuments
部分可能应该替换为%USERPROFILE%Documents
,并用%PROGRAMFILES%
C:Program Files
:
cmd = """%PROGRAMFILES%ANSYS IncANSYS Studentv192FrameworkbinWin64runwb2.exe"" -I -R %USERPROFILE%DocumentsAnsys_importbasic_2.wbjn"
或者,如果您希望 VBA 执行变量查找而不是cmd.exe
,则可以在 VBA 中使用Environ$("USERPROFILE")
和Environ$("PROGRAMFILES")
来获取这些环境变量的字符串值。