マクロでフォルダ内のファイル名を取得する
「フォルダ内の棚卸をしたいのでファイル名を簡単に取得出来ませんか?」という問い合わせをいただきました。
もちろんVBAであれば一瞬で作業完了です。加えてマクロを構築する事で一緒にできる事を提示します。
- 対象ファイルのチェックができる(存在確認など)
- ファイル名と一緒に拡張子も取得できる
- エクセル以外の拡張子についても一括でファイル名を取得できる(拡張子を指定する事も可能)
フォルダ関連の仕事はDir関数を使えば高い確率で解決します。
Excel以外の拡張子でも簡単にファイル名を取得する事ができますよ。
Dir関数はDo ~ Loopを用いたステートメント群と相性が良いです。今回はDo While ~ Loopステートメントを使います。
コードの中でループを続けるための条件を2つ用意しました。合わせてコードと解説も2つ用意する事にしました。
記事後半では「フォルダの中にフォルダ」の様な階層構造を持ったフォルダ群に対応する記事も紹介しています。
関連記事
For Each ~ Nextステートメントやオブジェクト変数を用いたコードでフォルダやファイルへアプローチしています。
関連記事VBAはフォルダ内の複数ブック×全部のシート名をセットで取得できる
拡張子を指定してファイル名を取り出したい時はFindメソッドは使わずにLike演算子を使いましょう。
今回の記事では詳細を書いてないので興味がある方はこちらの記事をご覧ください。
部分一致と完全一致で文字列を検索するVBAのFindメソッドは変数が難しい|文字列検索はLike演算子!
関連書籍
フォルダやファイルを扱う為のコードはこちらの書籍で勉強しました。
電子書籍はこちらです。
Dir関数とは
Dir関数の使い方と具体例を紹介しています。
Microsoftさんのドキュメントはこちらですが以下リンク記事の方がおすすめです。具体例を使って説明しています。
Dir関数の使い方VBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する
Dir関数は使用感が非常に分かりにくい関数です。よって動画を使って解説しています。
見ていただければDir関数の理解につながります。Dir関数を理解したいうえで以降の記事をご覧ください。
事例をもとに解説
フォルダ内のファイル名を取得する為に簡単な事例を用意しました。
環境
デスクトップにフォルダ「test」、A.xlsmを配置します。
A.xlsmから指示を出してフォルダ「test」内の全てのファイル名を取得してみます。
フォルダの中身です。7つの拡張子(データ)を用意しました。
- Excel
- Access
- PowerPoint
- Word
- 画像(png)
- 動画(mp4)
Microsoft関連のアプリケーション(App)は新規でファイルを作った際のファイル名のままです。
PDFと画像、動画はサンプル(sample)という文字を入れてカタカナや英語などを混ぜて名前を用意してみました。
ひらがな、カタカナ、漢字、英語、数字(mp4の4は文字列なので数字)を使ったのは理由があります。
コード内で文字列を扱うのでバグなど不具合が出ないかを見る為に文字のバリエーションを持たせたかった為です。
コード
コードは2つ紹介します。Do Wile ~ Loopステートメントの条件を2通り用意している為です。
どちらも結論は同じになります。以降の解説を読んでいただき各自理解しやすいコードをコピーして使ってみてください。
WorkbookやWorksheetを格納するオブジェクト変数や特別理解が難しいプロパティやメソッドなども使っていません。
シンプルにファイル名を取得する為のコードを用意してできるだけ初心者様でも理解できる様にしています。
コード1
1つ目のコードを紹介します。
Sub フォルダ内のファイル名を取得_コード1()
Dim pth As String
Dim file As String
Dim r As Long
r = 1
pth = ThisWorkbook.Path & "\test\"
file = Dir(pth)
Do While Len(file) > 0
Cells(r, 1).Value = file
r = r + 1
file = Dir()
Loop
End Sub
コード2
続いて2つ目のコードを紹介します。コードのパターンは1つ目のコードとほとんど同じです。
Do While ~ Loopに設定する条件が違います。この後に用意された解説で詳細を確認してください。
Sub フォルダ内のファイル名を取得_コード2()
Dim pth As String
Dim file As String
Dim r As Long
r = 1
pth = ThisWorkbook.Path & "\test\"
file = Dir(pth)
Do While file <> ""
Cells(r, 1).Value = file
r = r + 1
file = Dir()
Loop
End Sub
アウトプット
コードを実行した後のワークシートの画像です。
フォルダ「test」内に配置されたファイル名が出力されています。
参考Dir関数の説明で紹介した記事には任意の拡張子だけ(.xlsxのみ指定など)にアプローチする方法も書いてあります。
リンク先の記事ではワイルドカードを使っています。ワイルドカードについて知りたい方はこちらの記事をご覧ください。
解説
まずはDir関数の使い方です。基本的な使い方についてはこちらの記事でご確認ください。
ここでのポイントはDo While ~ Loopステートメントです。各コード共に1つだけ解説を用意しました。
Dir関数やDo While ~ Loopステートメントの理解する為にはローカルウインドウを見る事をおすすめします。
ローカルウインドウについてはこちらの記事をご覧ください。
コード1
Do While ~ Loopステートメントの条件としてLen関数を使用しています。
Len関数は文字列の文字数を数える関数です。Len関数についてはこちらの記事で説明しています。
「文字数が0以上」=「変数Fileにファイルが格納されている」際はループが回る事になります。
Dir関数は返す文字数が無くなると「””」ダブルクォーテーション2つを返します。
Len関数の戻り値はゼロになりループの条件が満たされなくなるのでループが終了するという建付けです。
コード2
Do While ~ Loopステートメントの条件として「変数Fileに文字列が格納されているのか」を確認しています。
エクセルで<>は「等しくない」という意味です。「≠」と同じ意味です。代わって「””」は文字列無しを表しています。
「<>””」という様に一緒に使うと「文字列無しと等しくない」となり言い換えると「文字列がある」になります。
文字列があるうちはループが回り文字列が無くなったらループを抜けるという建付けになっています。
その他
ThisWorkbookオブジェクトのPathプロパティの使い方についてはこちらの記事をご覧ください。
ファイルパスについて【VBA】絶対パス相対パスの書き方|理解はカレントディレクトリがポイント
対案(FilesyStemObject、InStrRev関数)
Dir関数を使う方法の他にも色々な方法がありますので紹介しておきます。
詳細知りたい方の為に別途リンクも用意しております。
FileSystemObject
「フォルダの中にフォルダ」などフォルダが階層構造を形成している時はFileSystemObjectの出番です。
ただし使い方が難しくなるので使用は中級者以上の方をおすすめします。記事リンクを用意しておきます。
「フォルダの中にフォルダ」に対応VBAで画像を取り込む高速で画像自体を取得しエクセルに貼り付ける
一般的にフォルダへのデータ格納方法は人それぞれなのでフォルダ毎に階層が異なるという事はよくあります。
紹介した記事では2階層のフォルダ構成までしか対応できないです。よって多くの事例に対応できない事が予想されます。
そこでより多くの皆様のニーズに対応する為に別途記事を用意しました。
以下リンク記事に用意されたコードであればどんな階層構造でももれなく全てのデータにアクセスできますよ。
フォルダ内の全てのフォルダ、ファイルにアクセス【VBA_再帰】複数フォルダ内を検索拡張子を決めて画像を取り出す
再帰処理(再帰呼び出し)を使っていますので非常に難しいですが効果は絶大です。チャレンジしてみてください。
InStrRev関数
フルパスからファイル名だけ取り出す際にInStrRev関数を使う事でファイル名を取り出す方法もあります。
しかしこの方法はおすすめしません。理由は2つあります。
- InStrRev関数が分かりにくい
- 今回紹介したコードであればフルパスからファイル名を取り出さなくても良いから
InStrRev関数については別途記事を用意してあります。分かりにくい関数を分かりやすく説明しています。
関数の使い方とコードを紹介InStrRev関数がうまくいかない時は戻り値の読み方を見直す
まとめ
フォルダ内のワークブックを含めたファイル名を取得する為の方法を2通り紹介しました。
2通りの方法を紹介した事には理由があります。1つの事例に対応する為のコードを何通りか考えてもらいたい為です。
色々な要素が絡んでくると1つの方法では作業が行き詰まる事があります。
そんな時に困らない様に私は何通りかコードを用意して並行して検討していきます。
フォルダやファイル関連を扱える様になっている方であれば事例に対し何通りかコードを用意する事ができるレベルです。
自身の引き出しを増やす事にもつながります。面倒は増えますがトライしてみてください。