質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

3回答

6915閲覧

Excel VBA から VBS を実行し結果を取得する

nekoyama771

総合スコア29

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2022/08/08 11:52

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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
xail2222

総合スコア1499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama771

2022/08/09 11:33

ありがとうございます。 VBS終了までの待ち、VBS実行結果・終了コードの取得、文字列の分割 など詳しくありがとうございました。
guest

0

Run(vbsPath, True)

は、Run(vbsPath, -1)ということですが、Runの第二引数のintWindowStyleには、-1の値は定義されていません。おそらく、Run(vbsPath,,True)と書くべき所をカンマを1つ漏らしたのでは?

投稿2022/08/08 12:09

otn

総合スコア85607

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama771

2022/08/09 11:36

ありがとうございます。 その通りでした。
guest

0

第三引数に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
slemntqe

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama771

2022/08/09 12:00

ありがとうございます。 WScript.Quit を利用するのは本来用途から外れているのですね。 一時ファイルを利用する方式を考えます。 dim a,b,c dim fs dim f ' '計算処理でa,b,cの値を算出 a=14 b=25 c=6 ' Set fs=CreateObject("Scripting.FileSystemObject") Set f=fs.OpenTextFile("aa.txt", 2, true) f.Write a & "," & b WScript.Quit
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問