通过Excel VBA运行Shell对象/命令时出错

时间:2014-01-21 19:26:01

标签: excel shell vba

我正在通过我的VB代码运行C ++程序,而我无法让我的代码在共享驱动器上运行而不是在本地计算机上运行。我的程序生成一组假设,然后通过C ++模型运行这些假设,然后获取模型输出并准备在VB工作簿中查看。

当我将工作簿保存在我的C驱动器上的本地目录中时,下面的代码工作正常,但当我将其上传到我公司的共享驱动器时,我收到以下错误:

“运行时错误'-2147024894(80070002)':对象'IWshShell3'的方法'运行'失败”

代码:

'---------------------------------------------------------
' SECTION III - RUN THE MODEL AS C++ EXECUTABLE
'---------------------------------------------------------
Dim ModelDirectoryPath As String
Dim ModelExecutableName As String
Dim ModelFullString As String

' First build the command string
Application.StatusBar = "Running C++ Model..."

ModelDirectoryPath = Range("ModelFilePath").value
ModelExecutableName = Range("ModelFileName").value
ModelFullString = ModelDirectoryPath & ModelExecutableName
ModelFullString = ModelFullString & " " & ScenarioCounter & " " & NumDeals _
                  & " " & ModelRunTimeStamp & " " & Settle_YYMMDD

' Run the program
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Dim errorCode As Integer

errorCode = wsh.Run(ModelFullString, windowStyle, waitOnReturn)

If errorCode = 0 Then
    ' MsgBox "C++ Model Completed without Errors."
Else
    MsgBox "Program exited with error code " & errorCode & "."
End If

Application.StatusBar = "C++ Model Complete"

有什么想法吗?

5 个答案:

答案 0 :(得分:12)

错误 来自其中有空格的目录:

C:\Users\myname\this is my folder\myexe.exe

一个简单的解决方法就是诀窍:

wsh.Run(Chr(34) & YourFullPathDirectoryWithSpaces & "\myexe.exe" & Chr(34))

Chr(34)是双引号。

.Run有两行属性存在问题。

在Excel 2010 / Win32上测试。

答案 1 :(得分:1)

有同样的问题,替代解决方案:

wsh.CurrentDirectory = exePath
wsh.Run(exeName & " " & cmdArgs, windowStyle, waitOnReturn)

关键是要设置shell的CurrentDirectory属性

答案 2 :(得分:0)

我已确定问题完全是由于包含空格的目录结构而出现的。似乎没有任何与本地与共享目录相关的问题。

如果有人知道一个简单的方法来解决其中有空格的目录,请告诉我!

答案 3 :(得分:0)

我注意到,当多个参数传递给运行的程序/脚本时,似乎只会出现问题。

如果第二个参数包含带空格的文件路径,即使存在必要的“”“”,也会发生错误。

此时找不到任何解决方案......

答案 4 :(得分:0)

找到此great reference,解释了路径中有空格时的三引号。这是它的一部分,以防它被摔倒或移动:

  

如果您想打开文件

     

c:\My Files\Text File.txt和您的shell要求将其包装   在""中,那么您将像这样写字符串

     

PID = Shell("notepad ""c:\My Files\Text File.txt""", vbNormalFocus)

     

对于需要为实际路径指定的任何路径也是如此   命令/脚本名称。在此示例中,我称为批处理文件(文本   Parser.bat)以处理文本文件(Text File.txt):

     

PID = Shell("""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt""", vbNormalFocus)

     

所有这些"""看起来都有些奇怪,但让我解释一下。第一和   最后"标记指定字符串的开头和结尾   被调用的程序,包括任何参数,开关和文件   它将使用:

     

"""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt"""如果   我们将剩下的"留给Program字符串本身,即   由两个单独的字符串组成,一个用于path \ batch文件,   另一个用于该批处理文件将使用的path \ file。

     

""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt""何时   这被传递给Shell删除了双"之一,所以   在Shell中实际看到的是

     

"c:\My Scripts\Text Parser.bat" "c:\My Files\Text File.txt"哪个   看起来像两个通常定界的字符串。