web-dev-qa-db-ja.com

Excel VBAを介したシェルオブジェクト/コマンドの実行エラー

VBコードを介してC++プログラムを実行していますが、コードを共有ドライブとローカルコンピューターで実行するのに問題があります。プログラムは一連の仮定を生成します。これらの仮定をC++モデルで実行し、モデル出力を取得して、VBワークブックで表示できるように準備します。

以下のコードは、Cドライブのローカルディレクトリにワークブックを保存すると問題なく動作しますが、会社の共有ドライブにアップロードすると、次のエラーが発生します。

「実行時エラー '-2147024894(80070002)':オブジェクト 'IWshShell3'のメソッド 'Run'が失敗しました」

コード:

'---------------------------------------------------------
' 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"

何かご意見は?

12
brentf

エラーdoesは、スペースを含むディレクトリから発生します。

_C:\Users\myname\this is my folder\myexe.exe
_

簡単な回避策はトリックを行います:

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

Chr(34)は二重引用符です。

_.Run_で2行のプロパティを取得するときに問題が発生しました。

Excel 2010/Win32でテストしました。

12
sobersoup

同じ問題、代替解決策がありました:

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

シェルのCurrentDirectoryプロパティを設定する重要なポイント

1
Jezz81

スペースを含むディレクトリ構造が原因で問題が完全に発生していると判断しました。ローカルディレクトリと共有ディレクトリに関連する問題はないようです。

誰かがその中にスペースがあるディレクトリを回避する簡単な修正を知っているなら、私に知らせてください!

0
brentf

この問題は、実行されるプログラム/スクリプトに複数の引数が渡された場合にのみ発生するようです。

2番目の引数にスペースを含むファイルパスが含まれている場合、必要な "" ""が存在していてもエラーが発生します。

この時点では解決策が見つかりません...

0
bnqprv

これが見つかりました 大きな参照 パスにスペースがある場合の三重引用符の説明。取り外されたり移動したりした場合の一部を次に示します。

ファイルを開きたい場合

_c:\My Files\Text File.txt_とシェルでは、これを_""_でラップする必要があり、次のような文字列を記述します。

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

実際のコマンド/スクリプト名に指定する必要のあるパスについても同じことが言えます。この例では、バッチファイル(Text 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"""_これらを削除すると_"_プログラム文字列自体が残ります。これは、パス\バッチファイル用とパス\ファイル用の2つの別個の文字列で構成されています。を使用します。

_""c:\My Scripts\Text Parser.bat"" ""c:\My Files\Text File.txt""_これがシェルに渡されると、ダブル_"_の1つが削除されるため、シェルに実際に表示されるのは

_"c:\My Scripts\Text Parser.bat" "c:\My Files\Text File.txt"_ 2つの通常区切られた文字列のように見えます。

0
Vrun