繁体   English   中英

编译错误:预期列表分隔符或) 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 )

我该如何解决这个错误?

引用错误,必须在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 。 它是一个非常简单的库模块,允许在字符串中嵌入变量字段和格式化标记

这将允许您编写

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} 不匹配,请提前道歉。

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

...取决于您的连接变量的各种值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM