#725 DOSコマンドを使ったファイル一覧の取得方法 VBA

DOSコマンドを利用すると、VBAでは複雑になってしまう処理も簡単に実行させられることがあります。ここではその一例を紹介します。

この例では、DOSコマンドのひとつである「Dir」コマンドに「/s」と「/b」オプションを付けることでサブフォルダも含めたファイル名のみの探索を行い、さらに「> ファイルパス名」によるリダイレクトを行うことでその結果をテキストファイルに出力します(ここまでがひとつのDOSコマンドになります)。

そして、そのテキストファイルをVBAで読み込むことによって、見つかった1つ1つのファイル名に対していろいろな処理を行うことができます(ここでは単にフルパスをイミディエイトウィンドウに出力するだけですが)。

サンプルプロシージャ:

Sub DosCmdSample()

  Dim objShell As Object
  Dim strCommand As String
  Dim lngFileNum As Long
  Dim strInData As String
  Const strDirFile As String = "D:\Dir.txt"   '出力先ファイルのパス

  'DOSコマンドの組み立て
  strCommand = "Dir D:\HomePage\tips\*_70* /s /b > " & strDirFile

  'DOSコマンドの実行
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run "cmd.exe /c " & strCommand, 0, True


  '出力先ファイルの読み込み
  lngFileNum = FreeFile()
  Open strDirFile For Input As #lngFileNum
  '全行を読み込むループ
  Do Until EOF(lngFileNum)
    '1行読み込み
    Line Input #lngFileNum, strInData
    'イミディエイトウィンドウに出力
    Debug.Print strInData
  Loop
  Close #lngFileNum

End Sub

  • 上記サンプルでは、「D:\HomePage\tipsフォルダ(およびそのサブフォルダ)の下にある、ファイル名に”_70”という文字を含むファイル」をリストアップし、「D:\Dir.txt」ファイルにその結果を出力しています。
  • 「cmd.exe」はDOSコマンドの実行ファイルです。Dirコマンド自体は実行ファイルではなくコマンドプロンプトから実行するものなので、VBAからcmd.exeを呼び出し、さらにそこからDirコマンドを実行させるという処理になっています。
  • cmd.exeの「/c」スイッチは、処理が終了したらコマンドプロンプトを閉じるというものです。コマンドプロンプトは下記の通り”非表示”ですので、これがないとそれを閉じるすべがなくなり、VBAは”実行中”のままになってしまいますので注意が必要です。
  • DOSコマンドを実行する方法としてはVBAの「Shell」関数を使う方法もありますが、その実行とともにプログラムが次へ進んでしまうという問題があります。今回の場合であればテキストファイルへの出力が完了する前に読み込みが実行されてしまう可能性があります。それを回避するため、ここでは「WScript.Shell」オブジェクトを使っています。使い方としては、「CreateObject」でオブジェクトを生成し、「Run」メソッドでDOSコマンドを実行するだけです。
  • 「WScript.Shell」オブジェクトの「Run」メソッドの引数には、1つめにコマンド、2つめにウィンドウ(DOS窓)のサイズを指定します。「0」を指定することでそれを”非表示”としています。
  • また3つめの引数に「True」を指定することで”同期モード”、つまりDOSコマンドの処理が完了したらプログラムを次に進めるようにしています。

実行例:
■実行後のテキストファイルの内容


■実行後のイミディエイトウィンドウ
| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします


Copyright © T'sWare All rights reserved