こんにちは!かいけつマクロです。
今回は、「ファイル一覧を作成する」方法を学んでいきます。
実は、「ファイル一覧を作成する」方法ということだと、
こちらのブログで、コマンドプロンプトを利用した方法を紹介しています。
今回は、この方法ではなく、Excelマクロを使ってファイル一覧を作成していきます。

覚えるの大変だし、
コマンドプロンプトの方だけでいいよ
と思われる方、ちょっと待ってください!!!
Excelマクロを使う方法のメリットは、なんといっても、
- 一度プログラミングすれば、ボタン一つで簡単にファイル一覧を作成可能
- 少しプログラム修正するだけで、いろんなところに応用(使い回し)しやすい
ということです。
ぜひ、どちらの方法も覚えて、どちらもうまく使いこなせるようにしましょう!
それでは、今回も、張り切っていきましょう!
※今後の解説の進め方は、こちらの図の通り予定しています。
今どこの何をやってるんだっけ?となったときは、随時こちらを見てみてください。

ファイル一覧を作成する
それではExcelマクロを使った、ファイル一覧の作成方法を、解説していきます。
目標は、「集計結果.xlsm」の「wk_ファイル一覧」シートに自動反映するプログラムを作成することです。
まずはいつもの通り、プログラムを書いていきましょう。
'ファイル一覧作成
Sub make_file_list()
'「集計情報.xlsm」と、「wk_ファイル一覧」シートを定義=============
Dim b集計結果 As Workbook
Dim sWk_ファイル一覧 As Worksheet
Set b集計結果 = ThisWorkbook
Set sWk_ファイル一覧 = b集計結果.Worksheets("wk_ファイル一覧")
'ファイルリストを作成対象を定義=============
Dim path As String
Dim file As String
path = b集計結果.path & "\売上げ情報"
file = Dir(path & "\" & "*.xlsx")
'「wk_ファイル一覧」シートの、書込み先の行番号を定義&初期化=============
Dim i As Long
i = 1
'「wk_ファイル一覧」シートへ、ファイル名をコピー=============
Do While file <> ""
sWk_ファイル一覧.Cells(i, 1).Value = path & "\" & file
file = Dir()
i = i + 1
Loop
End Sub

それでは、さっそく見ていきましょう。
まず、「path = b集計結果.path & “\売上げ情報”」の部分までは、前回までと同じなので、大丈夫そうですかね?
不安な方は、第9講、第10講で解説しているので、こちらを読んだ上で、先に進んでいきましょう。
- 第9講:ワークブック・ワークシートの定義
- 第10講:パスの取得方法
続いて、こちらのコードです。
file = Dir(path & "\" & "*.xlsx")
まず、「=」で結ばれていることから、右側を、左側に代入している、ということはわかりますよね。
そして、Dir()の中は、「&」で結ばれているので、何かの文字列を結合したものです。(第9講参照)
・・・ということは、この2つがわかれば、このコマンドも意味が分かりそうですね。
- “*.xlsx”とは何か?
- Dir()とは何か?
では、1つずつ見ていきましょう。
「*」で、任意の文字列を表す(ワイルドカード)
まずは、”*.xlsx”です。
・・・よく見ると、なんか、見覚えある方もいらっしゃるのではないでしょうか?
そうなんです!「.xlsx」って、Excelの拡張子ですよね。
で、その前に、なんだかよくわからない「*(アスタリスク)」がついている、と。
この「*」は、「ワイルドカード」といい、「任意の文字列」のことを表します。

ワイルドカード?任意の文字列?
頭の中が、お花畑-ーー
という方。
すごーーーく簡単に言うと、「拡張子さえ合っていれば、なんでもOK」ということになります。
例えば、
- かいけつマクロ.xlsx
- かいけつ.xlsx
- マクロ.xlsx
は、全て、拡張子が「.xlsx」なので、”*.xlsx”で表すことができます。
反対に、
- かいけつマクロ.xls
- かいけつ.xlsm
- マクロ.txt
は、全て、拡張子が「.xlsx」でないので、”*.xlsx”では表せないものになります。
そのため、「path & “\” & “*.xlsx”」では、
売上げ情報フォルダの配下にある、
「.xlsx」という拡張子を持った、全てのファイル
ということを表しています。
ファイル名を取得
そして、「Dir()」
まず、結論から言うと、こちらは、「()内のファイル名を取得するコマンド(※)」です。
※実際には、「関数」というものなのですが、あまり言葉が多くなると混乱するので、説明は割愛します。

じゃあ、()の中には、具体的に、
どんなファイル名が入ってるの?
って、思いますよね?
それを確かめるべく、ブレークポイントを設定して、何が入っているか確認してみましょう!
ブレークポイントの設定方法は、第11講をご覧ください。

Dir()(1回目):ファイル名を取得
ブレークポイントを、上の図のように設定できたら、「F5」を押して、さっそく実行してみましょう。
今の段階だと、「file=””」となっていることが、確認できると思います。

「F8」を押して、1つずつ処理を進めていきます。
まずは、1回押してみると、、、変数「file」に、「2021年06月.xlsx」が代入されました。

「2021年06月.xlsx」というのは、「売上げ情報」フォルダ配下にある、こちらのファイルです。

つまり、
「Dir()」コマンドを発行することで、
()内で指定したファイル名を取得できた、
ということがわかります!
変数「file」に応じて、「Do~While」ループで繰り返し処理
さて、「Do While file <> “”」というところで、処理が止まっていると思います。
・・・この「Do While」。見覚えありませんか???
見覚えないかも、、、という方は、ぜひこちらのブログを少し見てみましょう。

こうやって、同じことを、何度も繰り返し
読んで・実践することで身についていきますよー
今、変数「file」には、「2021年06月.xlsx」が入っているので、ループを抜けず、次の処理を行うことになります。
実際に「F8」を押して、動きを確かめてみると、

続いて、こんな感じで、画面を横に並べた状態で、「F8」を押してみると、

おなじみ、代入処理で、ファイルのパスが、Excelシートに反映されました!
(代入処理については、第2講をご覧ください。)

Dir()(2~7回目):ファイル名を次々に取得
続いて、もう1回「F8」を押して、「file = Dir()」というコマンドを実行してみましょう。
すると・・・
変数「file」の中身が、2021年06月.xlsx ⇒ 2021年07月.xlsxに変わった
ことがわかります。(今回、ここが最重要ポイントです!!!)

「2021年07月.xlsx」というのは、「売上げ情報」フォルダ配下にある、こちらのファイルです。

つまり、「Dir()」というコマンドを発行することで、
- 次のファイルを取得し、
- そのファイル名を変数「file」に代入した
ということです。この「次のファイルを取得」というのがポイントです。
「i = i + 1」で、「iに1を加える」
次のコマンド「i = i + 1」は、知らないと、

ギョッ!!!
としますよね。
・・・ですが、意味を考えれば、そんなに難しくありません。
まず、「=」で結ばれているので、「代入」を表してます。
そして、右側を考えると、変数「i」には1が入っていて、そこに1を加えて、2になる。
それを、左側の変数「i」に代入するという処理です。
もう少し、ざっくりとらえると、
変数「i」の中身に、1を加える処理
ということになります。どうですか?思ってるより難しくなくないですか?
さて、ここまで来たら、「Loop」で、また「Do While~」に戻ります。
ここからは、皆さん各自で、何度か「F8」を押しながら、どのような動きになるか見てみてください!
特に、「file = Dir()」というコマンドの前後で、変数「file」の中身が変わるところは、
「売上げ情報」フォルダと見比べながら、よく観察してもらえると、理解が深まると思います。
Dir()(8回目):ファイル名が取れず、「””」を返す
さて、何回かループを繰り返すと、下の図のようになると思います。

ここで、「F8」を押してみましょう。

変数「file」の中身が「””」に変わり、ループを抜ける条件を満たしたことがわかります。
・・・これだけ見ると、

なんで突然「””」が入ったの??
となると思います。
ここで、ちょっと思い出したいのが、「Dir()」コマンドでやっていることです。
「Dir()」コマンドでは、このような処理をやってるんでした。
次のファイルを取得し、そのファイル名を変数「file」に代入
つまり、「売上げ情報」フォルダ配下のファイルを次々に取得して、
ファイル名を、変数「file」に代入する、ということをやっていたわけですが、
「2021年12月.xlsx」まで取得してしまうと、次に取得するものがありません。
その結果として、「””」が変数「file」に代入された、というわけです。

そして、あと3回ほど「F8」を押すと、条件を満たして、ループを抜けることを確認できると思います。

お疲れさまでした!これで、ファイル一覧の作成が完了です。
実際に、ファイル一覧の中身を見てみると、正しく作成できていることが確認できますね!

本日のまとめ
今回は、「Dir()」というコマンドを使って、ファイル一覧を作成しました。
ブログの記事にすると、

正直、結構大変だったかも。。。
という感じかもしれませんが、一度身に着けてしまえば、ものの5分くらいでプログラミングできるようになります。

この記事の執筆にあたり、実際に私も、
それくらいでプログラミングしました
ぜひ、何度も記事を読んで、実際に手を動かして、身に着けていってもらえると嬉しいです!
- 「*(ワイルドカード)」で、任意の文字列を表す
- 「Dir()」コマンドの特徴は、以下の通り
- ◎()内で指定したファイルの、ファイル名を取得する処理
- ◎2回目以降は、条件を満たす、次のファイル名を取得する
- ◎ファイル名が取れなくなったら、「””」を返す
- 「i = i + 1」は、変数「i」の中身に、1を加える処理
コメント