← コード一覧へ戻る
実務Excel・Windows連携

固定コマンドの標準出力を受け取る

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

図で見る操作の流れ

イメージ図

準備、実行する操作、確認する結果の順で示しています。

  1. 準備

    Windows版向けです。この例は文字列VBA sampleを表示するだけの固定コマンドです。セルの値や入力文字をコマンドへ連結しません。

  2. 操作

    cmd.exeのechoで出した短い文字列を、WshShell.ExecのStdOutから読み取ります。

  3. 結果

    標準出力のVBA sampleがメッセージに表示されます。/cにより固定コマンド終了後にcmdも終了します。

ReadAllは出力終了を待ちます。長時間の処理や大量の標準エラーを出すコマンドにそのまま流用すると、待ち続けることがあります。

コードの処理を説明する模式図です。実際の画面や実行結果を撮影したものではありません。

使い方・実行手順を確認する4つの手順で、コードの使い方を確認できます
  1. 1

    Windows版デスクトップExcelの練習用ブックを.xlsmで保存し、Alt+F11→[挿入]→[標準モジュール]へ、この例だけを貼り付けます。

  2. 2

    Windows版向けです。この例は文字列VBA sampleを表示するだけの固定コマンドです。セルの値や入力文字をコマンドへ連結しません。

  3. 3

    PracticeAdvanced8035を実行します。一瞬コマンドプロンプト画面が見えることがあります。

  4. 4

    標準出力のVBA sampleがメッセージに表示されます。/cにより固定コマンド終了後にcmdも終了します。

使っている機能の公式ドキュメント(Microsoft Learn)