固定コマンドの標準出力を受け取る
cmd.exeのechoで出した短い文字列を、WshShell.ExecのStdOutから読み取ります。
実行前に確認
- ReadAllは出力終了を待ちます。長時間の処理や大量の標準エラーを出すコマンドにそのまま流用すると、待ち続けることがあります。
- /dはcmdのAutoRunを実行させないための指定です。任意入力の連結はコマンド注入につながるので行いません。
- Windows Script Hostやコマンド実行が管理されているPCでは、制限を変更せず管理者へ確認してください。
- 公式仕様とコードを照合した例です。Excel実機での実行は未検証です。業務ブックではなくコピーで試してください。
1サンプルコード
Option Explicit
Sub PracticeAdvanced8035()
Dim sh As Object, process As Object
Dim cmdPath As String, output As String
cmdPath = Environ$("SystemRoot") & "\System32\cmd.exe"
If Len(Environ$("SystemRoot")) = 0 Or Dir$(cmdPath) = "" Then
MsgBox "cmd.exeが見つかりません。": Exit Sub
End If
On Error GoTo Failed
Set sh = CreateObject("WScript.Shell")
Set process = sh.Exec("""" & cmdPath & """ /d /c echo VBA sample")
process.StdIn.Close
output = process.StdOut.ReadAll
MsgBox output
Exit Sub
Failed:
MsgBox "標準出力を取得できません: " & Err.Description
End Sub図で見る操作の流れ
イメージ図準備、実行する操作、確認する結果の順で示しています。
準備
Windows版向けです。この例は文字列VBA sampleを表示するだけの固定コマンドです。セルの値や入力文字をコマンドへ連結しません。
操作
cmd.exeのechoで出した短い文字列を、WshShell.ExecのStdOutから読み取ります。
結果
標準出力のVBA sampleがメッセージに表示されます。/cにより固定コマンド終了後にcmdも終了します。
ReadAllは出力終了を待ちます。長時間の処理や大量の標準エラーを出すコマンドにそのまま流用すると、待ち続けることがあります。
コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。
使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
- 1
Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。
- 2
Windows版向けです。この例は文字列VBA sampleを表示するだけの固定コマンドです。セルの値や入力文字をコマンドへ連結しません。
- 3
PracticeAdvanced8035を実行します。一瞬コマンドプロンプト画面が見えることがあります。
- 4
標準出力のVBA sampleがメッセージに表示されます。/cにより固定コマンド終了後にcmdも終了します。