【VBA】コマンドプロンプト(DOSコマンド)を実行する方法 (WScript.Shell)

目次

はじめに

VBAマクロから、ファイルの一覧をテキストに出力する dir コマンドや、ネットワーク設定を確認する ipconfig コマンドといった、古くからある**コマンドプロンプト(DOSコマンド)**を実行したい場面があります。

VBAから WScript.Shell オブジェクトを利用することで、これらのコマンドラインツールを呼び出し、その機能を活用することが可能です。この記事では、VBAからコマンドプロンプトのコマンドを実行するための、基本的で確実な方法を解説します。


コマンドプロンプトのコマンドを実行するVBAサンプルコード

このマクロは、ipconfig コマンドを実行し、その結果をデスクトップ上の ip_config.txt という名前のテキストファイルに出力します。

完成コード

' コマンドプロンプトのコマンドを実行し、結果をファイルに出力する
Sub RunDosCommand()
    Dim shellObj As Object
    Dim commandText As String
    Dim outputPath As String
    
    '--- 1. WScript.Shellオブジェクトを作成 ---
    Set shellObj = CreateObject("WScript.Shell")
    
    '--- 2. 出力先のパスと、実行したいコマンドを準備 ---
    ' SpecialFolders("Desktop")で、デスクトップのパスを動的に取得
    outputPath = shellObj.SpecialFolders("Desktop") & "\ip_config.txt"
    
    ' ipconfigの結果をリダイレクト(>)でテキストファイルに出力するコマンド
    commandText = "ipconfig > " & outputPath
    
    '--- 3. コマンドを実行 ---
    ' 第2引数 0 で、コマンドプロンプトのウィンドウを非表示にする
    ' 第3引数 True で、コマンドの完了を待つ
    shellObj.Run "%ComSpec% /c " & commandText, 0, True
    
    '--- 4. 後片付けと通知 ---
    Set shellObj = Nothing
    MsgBox "コマンドを実行し、結果をデスクトップに出力しました。"

End Sub

実行結果

マクロを実行すると、デスクトップに ip_config.txt ファイルが作成され、中に ipconfig の実行結果が書き込まれます。


コードの解説

Set shellObj = CreateObject("WScript.Shell")

Windowsのシェル機能(プログラムの実行など)をVBAから操作するための WScript.Shell オブジェクトを生成しています。

shellObj.Run "%ComSpec% /c " & commandText, 0, True

この一行が、コマンドを実行する核心部分です。

  • .Run: プログラムやコマンドを実行するメソッドです。
  • "%ComSpec% /c ": これはおまじないとして覚えておくと便利です。
    • %ComSpec%: コマンドプロンプトの実行ファイル(cmd.exe)の場所を示す環境変数です。
    • /c: 後ろに続くコマンドを実行した後に、コマンドプロンプトのウィンドウを閉じるためのスイッチです。
  • commandText: 実際に実行したいコマンドラインの文字列("ipconfig > C:\...)を渡します。
  • 第2引数 (0): ウィンドウの表示スタイルです。0 を指定すると、コマンドプロンプトの黒い画面が非表示のまま実行されます。
  • 第3引数 (True): コマンドの実行が完了するまで、VBAの処理を待機させるかどうかを指定します。True にすると、ファイルへの書き込みが終わるまで待ってから、次の MsgBox の行に進みます。

まとめ

今回は、WScript.Shell オブジェクトを使って、VBAからコマンドプロンプトのコマンドを実行する方法を解説しました。

  • WScript.Shell オブジェクトの .Run メソッドを使う。
  • コマンドの前に "%ComSpec% /c " を付けるのが定石。
  • .Run の第2、第3引数を指定することで、ウィンドウを非表示にしたり、処理の完了を待ったりできる。

この方法を使えば、VBAだけでは実装が難しい、あるいは面倒な処理(ファイルシステムの高度な操作、ネットワークコマンドの実行など)を、既存のコマンドラインツールを呼び出すことで、手軽に実現できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次