Compile error: expected list separator or ) excel VBA

Compile error: expected list separator or ) excel VBA

我在 VBA 中有这个命令行:

Call Shell("cmd.exe /S /k " & ""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe" -jar " & DPath & "  """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & FilePath & """", vbNormalFocus)

当我删除引号时,错误出现在 VBA:

'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

当我添加引号时,错误出现在 VBA:

Compile error: expected list separator or )

如何解决错误?

Call Shell("cmd.exe /S /k ""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe"" -jar " & _
           DPath & "  """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & _
            FilePath & """ ", vbNormalFocus)

...取决于串联变量的各种值

引用错误,必须在 javaw.exe 路径两边加上另一对引号,因为在 VBA 中,文字 " 必须指定为 "" :

Call Shell("cmd.exe /S /K " & """C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe"" -jar " & DPath & "  """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & FilePath & """", vbNormalFocus)

但这仍然行不通,因为cmd删除了最外面的引号并留下了无效的命令行。因此,您必须在 /K 后面的整个表达式周围提供另一对(文字)引号,这可能会被 cmd:

删除
Call Shell("cmd.exe /S /K " & """""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe"" -jar " & DPath & "  """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & FilePath & """""", vbNormalFocus)

最后,我建议将 DPath 值也用(文字)引号引起来:

Call Shell("cmd.exe /S /K " & """""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe"" -jar """ & DPath & """ """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & FilePath & """""", vbNormalFocus)

请学习如何让您的生活更轻松。仅仅因为你可以在 VBA 字符串中使用 """ 表示 " 并不意味着你应该在最微不足道的情况下除外。

这是一种让生活更简单的原生 VBA 方法。

Dim qDPath As String
Dim qinp1 As String
Dim qinp2 As String
Dim qsPath As String
Dim qFilePath As String
Dim qCommand As String

qDPath = MakeQuotedString(Path)
qinp1 = MakeQuotedString(inp1)
qinp2 = MakeQuotedString(inp2)
qsPath = MakeQuotedString(sPath)
qFilePath = MakeQuotedString(FilePath)

qCommand = MakeQuotedString("C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe")
qCommand = MakeQuotedString("cmd.exe /S /k " & qCommand & "-Jar " & qDPath & qinp1 & qinp2 & qsPath & qFilePath)

Call Shell(qCommand, vbNormalFocus)

虽然上面的内容更加冗长,但它至少允许您通过 F8 使用单步执行在每个阶段检查您是否正确构建了最终命令字符串。

如您所见,上面的内容有点冗长,这就是为什么许多其他编程语言能够在字符串中嵌入变量和格式标记的原因。这也可以在 VBA 中使用模块隐藏相关代码来完成。请查看我的 VBA 布局模块中的 Fmt 方法。它在 GitHub from here 中可用。它是一个非常简单的库模块,允许在字符串中嵌入变量字段和格式化标记

这将允许您编写

Call Shell("cmd.exe /S /k " & ""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe" -jar " & DPath & "  """ & inp1 & """ """ & inp2 & """ """ & sPath & """ """ & FilePath & """", vbNormalFocus)

以更简洁的方式,对人眼也很友好。

Dim ShellCmd as String
ShellCmd = Fmt("cmd.exe /S /k {dq}{dq}C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe{dq} -jar {dq}{0}{dq}  {dq}{1}{dq} {dq}{2}{dq} {dq}{3}{dq} {dq}{4}{dq}{dq}", dpath, inp1, inp2, sPath, FilePath)

Call Shell(ShellCmd, vbNormalFocus)

如果我仍然设法让 {dq} 不匹配,请提前致歉。