Excel VBA调用cmd执行A-PDF数据提取程序失败及等待完成求助
问题1:VBA调用CMD命令失效原因及修复
失效的核心原因是命令字符串拼接不符合VBA和CMD的语法规则:
- 包含空格的可执行文件路径、参数值没有用英文双引号完整包裹
cmd.exe /S /C参数后缺少空格,和后续命令直接拼接会导致CMD识别参数失败- VBA中字符串内的英文双引号需要用两个双引号转义,原代码没有做转义处理,命令字符串拼接逻辑错误
你直接在CMD粘贴命令能正常运行,是因为CMD会自动识别带空格的路径边界,但是VBA拼接后传给CMD的命令会被拆分为多个无效参数,因此运行失败。
修复后的命令拼接代码如下:
Dim sCommandToRun As String ' 字符串内的双引号用两个双引号转义,所有带空格的路径/参数都用双引号包裹 sCommandToRun = """C:\Program Files (x86)\A-PDF Data Extractor\PDECMD.exe"" -R""Accord new"" -F""C:\Users\phill\Desktop\Test.pdf"" -O""C:\Users\phill\Desktop\results.xlsx"" -Txlsx -PA" ' 注意/C后面补充了空格 Call Shell("cmd.exe /S /C " & sCommandToRun, vbHide)
问题2:等待CMD命令执行完毕再运行后续代码的方案
不要使用VBA自带的Shell函数(默认异步执行,调用后直接走后续代码),改用WScript.Shell对象的Run方法,第三个参数设置为True即可实现等待命令执行完成后再向下运行:
Dim wsh As Object Dim sCommandToRun As String Dim exitCode As Integer ' 拼接命令和上述修复后的逻辑一致 sCommandToRun = """C:\Program Files (x86)\A-PDF Data Extractor\PDECMD.exe"" -R""Accord new"" -F""C:\Users\phill\Desktop\Test.pdf"" -O""C:\Users\phill\Desktop\results.xlsx"" -Txlsx -PA" Set wsh = CreateObject("WScript.Shell") ' 第二个参数0表示隐藏运行窗口,等价于vbHide;第三个参数True表示等待命令执行完成再返回 exitCode = wsh.Run("cmd.exe /S /C " & sCommandToRun, 0, True) Set wsh = Nothing ' 命令执行完成后才会运行后续代码,可通过exitCode判断执行结果 If exitCode = 0 Then MsgBox "PDF数据提取完成" Else MsgBox "提取失败,错误码:" & exitCode End If
内容的提问来源于stack exchange,提问作者phill cook
相关产品推荐
相关产品推荐

