从VBA shell启动应用程序

时间:2015-01-24 11:06:02

标签: excel vba shell

在excel中,我试图插入一个按钮来将所选单元格的内容解析为新的电子邮件。由于我使用Mozilla Thunderbird,我必须通过Shell解析。 到目前为止我的代码:

    Dim dr As String
    If dir("C:\Program Files (x64)", vbDirectory) = "" Then
        dr = "C:\Program Files (x86)"
    Else
        dr = "C:\Program Files"
    End If
    dr = dr & "\Mozilla Thunderbird\thunderbird.exe"

    Dim args As String
    args = "to='" & MailTo & "',cc='" & MailCC & "',bcc='" & MailBCC & "'"
    args = args & ",subject='" & MailSubject & "',body='" & strbody & "'"
    If MailBijlage <> "" Then args = args & ",attachment='" & TempFilePath & TempFileName & ".pdf"

    Dim Command As String

    Command = "cmd.exe /S /K " & """" & dr & """" & " -compose " & """" & args & """"

    conf = MsgBox(Command, vbOKCancel, "Confirm command")

    If conf = vbOK Then
        Shell (Command)
        MsgBox "Email sent.", , "Info"
    ElseIf conf = vbCancel Then
        MsgBox "Canceled.", , "Info"
    End If

创建命令处理得很好,但Shell不会启动Thunderbird。它只是说:

  

&#39; C:\程序&#39;不被视为内部或外部命令,   可操作程序或批处理文件。

我不知道错误,显示代码的消息框清楚地显示了路径旁边的双引号。

提前致谢。

== EDIT ==

现在尝试使用批处理文件(正如S O所示)... 我打开了一个bat文件(已创建)并让VBA输出命令到bat文件。 当我到达要求发送邮件的msgbox时,当我在记事本中打开bat文件时,它是空的。 VBA调用空批处理文件,没有任何反应(邮件未发送)。当我在宏结束后重新打开文件时,所有输出都在批处理文件中,当我运行它时,邮件按原样组成。

        Open Environ("userprofile") & "\desktop\tbmail.bat" For Output As #1
    If dir("C:\Program Files (x64)", vbDirectory) = "" Then
        Print #1, "cd ""%programfiles(x86)%"""
    Else
        Print #1, "cd ""%programfiles%"""
    End If
    Print #1, "cd ""Mozilla Thunderbird"""

        Print #1, "thunderbird.exe -compose """ & args & """"
    Close #1

    If conf = vbOK Then
        Call Shell(Environ("userprofile") & "\desktop\tbmail.bat")
        MsgBox "De mail is verstuurd.", , "Informatie"
    ElseIf conf = vbCancel Then
        MsgBox "Versturen geannuleerd.", , "Informatie"
    End If

出了什么问题?

1 个答案:

答案 0 :(得分:0)

尝试将cmd.exe更改为CMD

如果仍然无效,您可以尝试尝试:

CreateObject("WScript.Shell").Run Command, 1, False

如果要隐藏控制台,请将1更改为0, 如果要在控制台中等待用户返回,请将False更改为True。

或者你可以这样:

Open Environ("USERPROFILE") & "\desktop\test.bat" For Output As #1
Print #1, Command
Close #1
Shell Environ("USERPROFILE") & "\desktop\test.bat"
Kill Environ("USERPROFILE") & "\desktop\test.bat"

将命令写入批处理文件并使用Shell命令调用批处理文件。

我通常更喜欢使用WScript.Shell对象,因为它允许读取StdOut等非常有用的内容。