Windowsには、コマンドプロンプトという機能があります。 コマンドプロンプトは、MS-DOSなどのコマンドを実行するための機能で、ネットワークを管理する状況などでも、よく使われます。 コマンドプロンプトで実行できるコマンドには、Windowsにはない便利なものも少なくありません。 たとえばTreeコマンドは、サブフォルダの状況を次のようなツリー構造のテキストで返してくれます。このコマンドプロンプトをVBAから利用するには、2つの問題があります。 1つは、Shell関数ではコマンドプロンプトを起動できないということです。 また、一般的なMS-DOSコマンドは、実行した結果もコマンドプロンプトの画面に表示されます。 この結果をVBAでは取得できないというのが2つめの問題です。 VBAだけでは解決できませんが、WSH(Windows Scripting Host)を使うことで2つの問題を解決できます。 WSHのWshScriptExecオブジェクトが持つExecメソッドは、command.comやcmd.exeなどのコマンドシェルを実行できます。 さらに実行結果の標準出力を取得することも可能です。 さっそくやってみましょう。次のコードはC:\のファイル一覧を表示します。
Sub Sample1() Dim WSH As Object, wExec As Object, Cmd As String, Result As String Set WSH = CreateObject("Wscript.Shell") Cmd = "dir C:\" Set wExec = WSH.Exec("%ComSpec% /c " & Cmd) Do While wExec.Status = 0 DoEvents Loop Result = wExec.StdOut.ReadAll MsgBox Result Set wExec = Nothing Set WSH = Nothing End Subマクロを実行すると、一瞬コマンドプロンプトが起動しますが「/c」スイッチを指定しますので、コマンド終了後にコマンドプロンプトも閉じます。 上記で紹介したTreeコマンドでしたら、「Cmd = "dir C:\"」の部分を、たとえば「Cmd = "tree /f C:\Sample"」のように書き換えます。 コマンドプロンプトには、便利な命令がたくさん用意されています。Cmd = "fc data1.txt data2.txt"とすれば、data1.txtとdata2.txtの相違が表示されます。 またCmd = "copy data1.txt+data2.txt total.txt"とすれば、data1.txtとdata2.txtを合体させたtotal.txtを作成できます。 使いこなすには、それなりに知識や経験が必要ですが、興味のある方は、ぜひチャレンジしてください。