公開日:5/17/2021  更新日:3/26/2022

  • twitter
  • facebook
  • line

【Excel VBA】VBAマクロからコマンドプロンプトを操作するTips

はじめに

本記事ではVBAマクロでCMDを操作する方法を備忘録として残します。
まずVBAでコマンドプロンプトを操作する方法は2種類あります。
1つ目は、標準出力から結果を取得する方法。2つ目は、標準出力から結果を取得しない方法です。
それぞれケースによって使い分けるのがよいかと思います。

1.標準出力から結果を取得するパターン

標準出力とは、コマンドプロンプトの画面に出力される結果です。
「exec」を使ってコマンドを実行します。
主にバッチファイル実行後の結果を取得したり、簡単なコマンドの実行結果をコンソールから取得するのに使用します。
下のソースの例では、DIRコマンドの結果を標準出力から取得しています。
ただし標準出力から受け取れるデータのバッファサイズは小さいので、
巨大サイズの出力結果が欲しい場合は結果を一度出力ファイルに書き出すのがよいです。

    Dim Path
    Dim command
    Path = "C:\Users\xxxx\Desktop"
    command = "dir /b" & " " & Path

    Dim sh As New IWshRuntimeLibrary.WshShell
    Dim ex As WshExec
    Set ex = sh.Exec("%ComSpec% /c " & command)
    Do While (ex.Status = WshRunning)
        DoEvents
    Loop
    Dim result
  '標準出力を読み込み
    result = ex.StdOut.ReadAll
    MsgBox (result)

IWshRuntimeLibrary.WshShell が使用できない場合
※「ツール→参照設定」を選択。「参照可能なライブラリファイル」から「Windows Script Host Object Model」にチェックを付けて、OKボタンを押下。
ダイアログ

2.標準出力を扱わないパターン

「run」を使ってコマンドを実行するやり方です。
実行のみで結果を必要としない場合に適しています。
もし実行結果をvbaでそのまま扱いたい場合、コンソール結果をコマンドでファイル出力した後に、Scripting.FileSystemObject のライブラリを使用してファイル読み込めを行えば良いです。

    Dim OutPutPath
    OutPutPath = ThisWorkbook.Path & "\" & "out.txt"
    Dim Path
    Path = "C:\Users\xxxx\Desktop"
    Dim command
  '実行結果をファイル出力
    command = "dir /b" & " " & Path & " >" & OutPutPath
    
    Dim wsh As New IWshRuntimeLibrary.WshShell
    wsh.Run command, 0, True
    Set wsh = Nothing
    
    '---------------------------------------------------------
    '出力ファイルから結果を取得する
    '---------------------------------------------------------
    '結果を格納する配列
    Dim res(100) As String
    
    Dim FSO
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Dim txtStream
    Set txtStream = FSO.OpenTextFile(OutPutPath)
    Dim Data
    With txtStream
        Data = .ReadAll
        .Close
    End With
    tmp = Split(Data, vbLf)
    For i = 0 To UBound(tmp)
        Dim Line
        Line = Replace(tmp(i), vbCr, "")
        Line = Replace(Line, vbLf, "")
        Line = Trim(Line)
        If Line <> "" Then
            res(i) = Line
        End If
    Next
    Kill OutPutPath

    '試しに一行目を出力
    MsgBox (res(0))

戻る