编译错误:应为列表分隔符或excel VBA

编译错误:应为列表分隔符或excel VBA,excel,vba,windows,cmd,quotes,Excel,Vba,Windows,Cmd,Quotes,我在VBA中获得了以下命令行: Call Shell("cmd.exe /S /k " & ""C:\Program Files\Java\jre1.8.0_171\bin\javaw.exe" -jar " & DPath & " """ & inp1 & """ """ & inp2

我在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中会出现错误:

添加报价时,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)

…根据串联变量的不同值,引号是错误的,您必须在
javaw.exe
路径周围加上另一对引号,因为在VBA中,必须将文本
指定为

调用Shell(“cmd.exe/S/K”和“C:\Program Files\Java\jre1.8.0\u 171\bin\javaw.exe”-jar”&DPath&&inp1&&inp2&&sPath&&FilePath&&vbNormalFocus)
但这仍然不起作用,因为
cmd
删除了最外层的引号,并留下了无效的命令行。因此,您必须在
/K
后面的整个表达式周围提供另一对(文字)引号,可以通过
cmd
删除:

调用Shell(“cmd.exe/S/K”和“C:\Program Files\Java\jre1.8.0\u 171\bin\javaw.exe”“-jar”&DPath&&inp1&&inp2&&sPath&&FilePath&&vbNormalFocus)
最后,我建议将
DPath
值也用(文字)引号括起来:

调用Shell(“cmd.exe/S/K”和“C:\Program Files\Java\jre1.8.0\u 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中可用。这是一个非常简单的方法brary模块,允许在字符串中嵌入变量字段和格式标记

这将允许你写作

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

您有奇怪的引号,我想它应该是
调用Shell(“cmd.exe/S/k”和“C:\Program Files\Java\jre1.8.0\u 171\bin\javaw.exe”“-jar”&DPath&&inp1&&inp2&&sPath&&FilePath&&vbNormalFocus)
…“C:\Program”未被识别为内部或外部命令、可操作程序或批处理文件。也出现了此错误:/Try this:
调用Shell(“cmd.exe/S/k”和“C:\Program Files\Java\jre1.8.0\u 171\bin\javaw.exe”“-jar”&DPath&“&inp1&&inp2&&sPath&&FilePath&&vbNormalFocus)
…还收到以下信息:“C:\Program”不被识别为内部或外部命令、可操作程序或批处理文件。
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)