VBAでVBSを実行し、VBSの実行結果(a,b,c)をVBAで取得したいです。
VBAを実行するとエラーは出ませんが、ret=0となります。
どのようにすればよいでしょうか。
よろしくお願いします。
VBS
1(aa.vbs) 2dim a,b,c 3' 4'計算処理でa,b,cの値を算出 5a=4 6b=5 7c=6 8' 9msgbox "値1: " & a & vbCrLf & "値2: " & b & vbCrLf & "値3: " & c 10WScript.Quit(a)
VBA
1Sub test1() 2 Dim vbsPath As String 3 Dim ret As Long 4 vbsPath = "C:\AAA\aa.vbs" 5 ret = CreateObject("Wscript.Shell").Run(vbsPath, True) 6End Sub 7
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答3件
1
ベストアンサー
VBAからVBSを実行して結果を受け取るのは色々できるとは思いますが
WScript.Stdout.WriteLine で出力して、
WScript.ShellのStdOut.ReadAllで受信するのがよくあるやり方ではないでしょうか。
具体的には
VBS
1'(aa.vbs) 2dim a,b,c 3' 4'計算処理でa,b,cの値を算出 5a=4 6b=5 7c=6 8' 9WScript.Stdout.WriteLine "値1:" & a & vbCrLf & "値2:" & b & vbCrLf & "値3:" & c 10WScript.Quit(0) 11
VBA
1Public Sub test() 2 Dim t_Wsh 'As IWshRuntimeLibrary.WshShell 3 Dim t_Exex 'As IWshRuntimeLibrary.WshExec 4 Dim t_StdOut As String 5 Dim t_Sp() As String 6 Dim t_Sp2() As String 7 Dim t_I As Long 8 Dim a 9 Dim b 10 Dim c 11 Dim t_VbsPath As String 12 t_VbsPath = "C:\AAA\aa.vbs" 13 14 Set t_Wsh = CreateObject("WScript.Shell") 15 16 Set t_Exex = t_Wsh.Exec("CScript //Nologo " & t_VbsPath) 17 Do While t_Exex.Status = 0 18 DoEvents 19 Loop 20 21 t_StdOut = t_Exex.StdOut.ReadAll 22 23 Debug.Print "ExitCode:" & t_Exex.ExitCode 24 25 Set t_Exex = Nothing 26 27 t_Sp = Split(t_StdOut, vbCrLf) 28 For t_I = 0 To UBound(t_Sp) 29 t_Sp2 = Split(t_Sp(t_I), ":") 30 If UBound(t_Sp2) > 0 Then 31 Select Case t_Sp2(0) 32 Case "値1": a = t_Sp2(1) 33 Case "値2": b = t_Sp2(1) 34 Case "値3": c = t_Sp2(1) 35 End Select 36 End If 37 Next 38 39 Debug.Print "値1:" & a & vbCrLf & "値2:" & b & vbCrLf & "値3:" & c 40 41End Sub 42
まぁ。結果の受け方は、てきとうですが…何となくやりかたはわかるのではないでしょうか。
受信できるのは文字列に限りますけどね…
Runについては、既に回答がなされているので省略します。
投稿2022/08/08 20:00
編集2022/08/08 20:20総合スコア1434
1
Run(vbsPath, True)
は、Run(vbsPath, -1)
ということですが、Run
の第二引数のintWindowStyle
には、-1
の値は定義されていません。おそらく、Run(vbsPath,,True)
と書くべき所をカンマを1つ漏らしたのでは?
投稿2022/08/08 12:09
総合スコア82871
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント
1
第三引数にTrueを指定する事でVBScriptの処理を待つことができます。
あなたのプログラムでは第ニ引数にTrueが指定されています。
Basic
1' ret = CreateObject("Wscript.Shell").Run(vbsPath, True) 2ret = CreateObject("Wscript.Shell").Run(vbsPath, , True) 3MsgBox (ret)
実行結果
また、WScript.Quitは終了コード(整数値)を指定する事が本当の意味です。
戻り値という意味ではありません。
戻り値として利用できるというだけです。
なので、あなたが期待するようなWScript.Quitを利用して複数の整数値をVBSからVBAに渡す事は不可能です。
VBSで一時的なファイルを作成して、VBAでファイルを読み取る事で値の受け渡しを実現するなどで回避する必要があります。
(このような方法は好まれるものでは無いのであくまでわかりやすい一例として挙げただけです。よく考えて実装する必要があります。)
投稿2022/08/08 12:02
編集2022/08/08 12:07総合スコア120
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
回答へのコメント
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/08/09 11:33