みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでファイルやフォルダを操作する方法についてお伝えしています。
前回の記事はコチラでした。
FileDialogオブジェクトを使ってユーザーにファイル選択をさせる方法についてお伝えしましたね。
今回からちょっと趣向を変えまして、フォルダの中のファイルを全部開く、という別のツールを作っていきたいと思います。
その布石として、手始めにエクセルVBAでフォルダ内のファイル一覧を出力する方法についてお伝えします。
後日追記:FileSystemオブジェクトを使う方法も
以下記事にてDir関数ではなく、FileSystemオブジェクトを使う方法を紹介しています。FileSystemオブジェクトを使うほうが安全かつスマートにできますので、そちらもご参考ください。
Dir関数の一般的に表記の方法
Dir関数ですが、その使い方は覚えていらっしゃいますか?
以前の記事では、ファイルが存在するかどうかをチェックするために
として、その返り値によって
- ファイルのフルパス:指定したファイルが存在する
- 長さ0の文字列:指定したファイルが存在しない
というように判断をすることができるんだよ、という方法についてお伝えしました。
そんなDir関数ですが、一般的にはこのような書き方になります。
パターンには先ほどの例のようにファイルのフルパスを指定することもできますし、「*」や「?」などのワイルドカードも使用することができます。だから、パターンというわけですね。
属性については次回の記事で解説します。
Dir関数でワイルドカードを使った場合
Dir関数はパターンにマッチした中で最初のファイルを返すという特性があるので、それについてお伝えします。
ワイルドカードを使用して、複数のファイルがそのパターンと一致する場合、例えば「C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル」というフォルダの中に
- エクセル-1.xlsx
- エクセル-2.xlsx
- テキストファイル.txt
- ページ.html
- ワード.docx
という5つのファイルが格納されているとします。
その場合に以下プログラムを実行すると
Sub Dir関数の使い方()
Dim strPattern As String
strPattern = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\*"
Debug.Print Dir(strPattern)
End Sub
Dir関数はパターンにマッチした中で最初のファイル、つまりフォルダ内の最初のファイル「エクセル-1.xlsx」を返します。
フォルダの指定時はワイルドカードの省略可能
ちなみに、フォルダ自体をパターンに指定して、フォルダ内のファイルを取得したい場合は最後のワイルドカード「*」は省略できます。
ですから、以下のように書くことができます。
Sub Dir関数の使い方()
Dim strPattern As String
strPattern = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\"
Debug.Print Dir(strPattern)
End Sub
Dir関数でパターンを省略すると次のファイル
じゃあ、二つ目以降のファイルはどうすれば出せるんだ?ということなんですが、その場合は、パターンを省略して単に
とすることで、Dir関数は前回指定したパターンマッチに対して次のファイルを返します。
前述のプログラムであれば一行追加して
Sub Dir関数の使い方()
Dim strPattern As String
strPattern = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\"
Debug.Print Dir(strPattern)
Debug.Print Dir()
End Sub
として実行すると
このように「エクセル-1.xlsx 」「エクセル-2.xlsx 」と2番目のファイルまで出力することができます。
Dir関数でフォルダ内のファイル一覧を出力
フォルダ内のファイルを全て出力したいんだけど…というときは、Do While~Loopを使います。
繰り返しを抜ける条件として、「Dir関数の返り値の文字の長さが0より大きいかどうか」を判定すれば良いわけですね。
Sub ファイル一覧を出力()
Dim strPattern As String, strFile As String
strPattern = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-file-dir\開くファイル\"
strFile = Dir(strPattern) ’初回の検索
Do While Len(strFile) > 0 '文字列長が0より大きい間のみ繰り返す
Debug.Print strFile
strFile = Dir()
Loop
End Sub
このプログラムを実行しますと
このように全てのファイルが出力されます。
まとめ
エクセルVBAでフォルダ内のファイル一覧を取得する方法についてお伝えしました。
Dir関数…便利じゃないですか!?
これ一つで色々な動作をさせることが可能です。
ということで、次回も引き続きDir関数についてですが、フォルダ一覧を出力する方法です。
どうぞお楽しみに!