【问题标题】:Compile error: expected list separator or ) excel VBA编译错误:预期的列表分隔符或)excel VBA
【发布时间】:2020-07-15 07:11:37
【问题描述】:

我在 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)...
  • '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)...

标签: excel vba windows cmd quotes


【解决方案1】:

引用错误,你必须在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)

【讨论】:

    【解决方案2】:

    请学习如何让您的生活变得轻松。仅仅因为您可以在 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} 不匹配,请提前道歉。

    【讨论】:

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

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

      【讨论】:

      • 也收到了:'C:\Program' 不是内部或外部命令、可运行程序或批处理文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多