【第12講】ファイル一覧作成(ラーメン屋さんの売上げを集計しよう!④)

「Dir」で次々にファイル名を取得する
スポンサーリンク

こんにちは!かいけつマクロです。

今回は、「ファイル一覧を作成する」方法を学んでいきます。

実は、「ファイル一覧を作成する」方法ということだと、

こちらのブログで、コマンドプロンプトを利用した方法を紹介しています。

今回は、この方法ではなく、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
make_file_listプロシージャの記述イメージ

それでは、さっそく見ていきましょう。

まず、「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=””」となっていることが、確認できると思います。

「file=""」となっている

「F8」を押して、1つずつ処理を進めていきます。

まずは、1回押してみると、、、変数「file」に、「2021年06月.xlsx」が代入されました。

「file」に「"2021年06月.xlsx"」が代入された

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

変数「file」には、「売上げ情報」フォルダ配下にある「2021年06月.xlsx」のファイル名が代入された

つまり、

「Dir()」コマンドを発行することで、

()内で指定したファイル名を取得できた

ということがわかります!

変数「file」に応じて、「Do~While」ループで繰り返し処理

さて、「Do While file <> “”」というところで、処理が止まっていると思います。

・・・この「Do While」。見覚えありませんか???

見覚えないかも、、、という方は、ぜひこちらのブログを少し見てみましょう。

こうやって、同じことを、何度も繰り返し

読んで・実践することで身についていきますよー

今、変数「file」には、「2021年06月.xlsx」が入っているので、ループを抜けず、次の処理を行うことになります。

実際に「F8」を押して、動きを確かめてみると、

変数「file」には、「2021年06月.xlsx」が入っているので、ループを抜けず、次の処理を行う

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

画面を並べた状態で、「F8」を押す

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

Excelシートにファイルパスが反映される

Dir()(2~7回目):ファイル名を次々に取得

続いて、もう1回「F8」を押して、「file = Dir()」というコマンドを実行してみましょう。

すると・・・

変数「file」の中身が、2021年06月.xlsx ⇒ 2021年07月.xlsxに変わった

ことがわかります。(今回、ここが最重要ポイントです!!!

変数「file」の中身が、2021年06月.xlsx ⇒ 2021年07月.xlsxに変わった

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

変数「file」には、「売上げ情報」フォルダ配下にある「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回目):ファイル名が取れず、「””」を返す

さて、何回かループを繰り返すと、下の図のようになると思います。

2021年12月までループが進んだ

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

変数「file」の中身が、「””」に変わった(=ループを抜ける条件を満たす)

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

・・・これだけ見ると、

なんで突然「””」が入ったの??

となると思います。

ここで、ちょっと思い出したいのが、「Dir()」コマンドでやっていることです。

「Dir()」コマンドでは、このような処理をやってるんでした。

次のファイルを取得し、そのファイル名を変数「file」に代入

つまり、「売上げ情報」フォルダ配下のファイルを次々に取得して、
ファイル名を、変数「file」に代入する、ということをやっていたわけですが、

「2021年12月.xlsx」まで取得してしまうと、次に取得するものがありません。

その結果として、「””」が変数「file」に代入された、というわけです。

最後までファイルを取得し、次に取得するものがなくなったため、変数「file」に「""」が代入された

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

条件を満たし、ループを抜ける

お疲れさまでした!これで、ファイル一覧の作成が完了です。

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

ファイル一覧の作成完了!

本日のまとめ

今回は、「Dir()」というコマンドを使って、ファイル一覧を作成しました。

ブログの記事にすると、

正直、結構大変だったかも。。。

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

この記事の執筆にあたり、実際に私も、

それくらいでプログラミングしました

ぜひ、何度も記事を読んで、実際に手を動かして、身に着けていってもらえると嬉しいです!

本日の学びポイント
  • 「*(ワイルドカード)」で、任意の文字列を表す
  • 「Dir()」コマンドの特徴は、以下の通り
  •  ◎()内で指定したファイルの、ファイル名を取得する処理
  •  ◎2回目以降は、条件を満たす、次のファイル名を取得する
  •  ◎ファイル名が取れなくなったら、「””」を返す
  • 「i = i + 1」は、変数「i」の中身に、1を加える処理

コメント

タイトルとURLをコピーしました