公開日:5/17/2021 更新日:3/26/2022
本記事ではVBAマクロでCMDを操作する方法を備忘録として残します。
まずVBAでコマンドプロンプトを操作する方法は2種類あります。
1つ目は、標準出力から結果を取得する方法。2つ目は、標準出力から結果を取得しない方法です。
それぞれケースによって使い分けるのがよいかと思います。
標準出力とは、コマンドプロンプトの画面に出力される結果です。
「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ボタンを押下。
「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))