こんにちは!かいけつマクロです。
今回からは、前回第12講で作成したファイル一覧を利用して、複数ファイルからデータを取込むという方法を学んでいきます。
今回は、このような、今まで学んだ知識を総動員していくことになります。
不安な方は、適宜、前のブログに戻って、読み直してみましょう。
また、このあたりから、For文やIf文が入れ子になってきて、
頭がごちゃごちゃしてきたよー
という方が出てくると思います。
そんな時は、第11講で紹介した、「ブレークポイント・イミディエイトウィンドウを使って、1行ずつ見ていく」という方法が、かなり有効になってきます!
まだご覧になっていない方は、ぜひそちらを読んでから、今回の記事を読み進めるようにしてください。
それでは、今回も張り切っていきましょう!
処理の流れの確認
まずは、今回の目標「複数ファイルからデータを取込む」について、どのような流れで処理を実行するか確認していきます。
処理は、こちらの手順①~⑥の順で実行していきます。
次の章では、コメントを使って、上の手順を、Excelマクロの処理っぽく記述してみます。
この「処理っぽくコメントで記述すること」を「設計」といい、とても重要な役割を持っています。
- どうすれば目的を実現できるか、いきなりプログラミングするよりもイメージしやすい
- 後から見たときに、そのプログラムが何をしているか、人間が理解しやすい
実は、第8講で、Do~Whileを学んだ時に、少しだけこんな記述をしたことがありました。
この、
- ‘インプットブックスを再度表示する
- ‘入力された値を、変数buf_aに代入する
という「メモ書き」のようなものを使って、上で見た手順①~⑥を記述していきます。
Excelマクロの設計を行う
それでは、まずは、設計の結果をご覧ください。
ポイントは、ところどころ、処理が日本語のコメントで記述されている、ということです。
'売上げ情報一覧作成
Sub make_sales_info_list()
Dim i As Long '「wk_ファイル一覧」シートの行番号
Dim j As Long '売上げ情報ファイルの行番号(データの取得元)
Dim k As Long '「wk_売上げ情報一覧」シートの行番号(データの書込先)
k = 2 '変数kを初期化
'売上げ情報ファイルを1つずつ開いて、「wk_売上げ情報一覧」シートにコピーする
For i = 1 To sWk_ファイル一覧.Cells(Rows.Count, 1).End(xlUp).Row
'ファイルオープン : sWk_ファイル一覧.Cells(i, 1).Value
'売上げ情報ファイルからデータをコピー===============================
'1ファイル目の取込(=「i=1」)の場合のみ、ヘッダをコピー--------
If i = 1 Then
'売上げ情報ファイルの1行目を、「wk_売上げ情報一覧」シートの1行目にコピー
End If
'売上げ情報ファイルから「集計情報.xlsm」へ、データをコピー--------
For j = 2 To 売上げ情報ファイル.Cells(Rows.Count, 1).End(xlUp).Row
'売上げ情報ファイルのj行目を、「wk_売上げ情報一覧」シートのk行目にコピー
'データの書込先を、次の行に移動
k = k + 1
Next
'Excelマクロの終了後には、必ずインプットファイルを閉じる=============
'ファイルクローズ : sWk_ファイル一覧.Cells(i, 1).Value
Next
End Sub
変数を定義する
それでは、1つ1つ見ていきましょう。まずは、この部分。
Dim i As Long '「wk_ファイル一覧」シートの行番号
Dim j As Long '売上げ情報ファイルの行番号(データの取得元)
Dim k As Long '「wk_売上げ情報一覧」シートの行番号(データの書込先)
k = 2 '変数kを初期化
「変数の定義」と「初期値の代入」です。
処理自体は、ただそれだけではあるのですが、For文が入れ子になるような処理の場合、どの変数が何を意味しているのかを、しっかり整理することが、非常に重要になってきます。
そのため、上のように、何を表す変数か、ということを、コメントで必ず書くようにしましょう!!
売上げ情報ファイルを、1つずつオープン/クローズ
続いて、この部分。
'売上げ情報ファイルを1つずつ開いて、「wk_売上げ情報一覧」シートにコピーする
For i = 1 To sWk_ファイル一覧.Cells(Rows.Count, 1).End(xlUp).Row
'ファイルオープン : sWk_ファイル一覧.Cells(i, 1).Value
~~~見やすくするため、間の処理は割愛~~~
'Excelマクロの終了後には、必ずインプットファイルを閉じる=============
'ファイルクローズ : sWk_ファイル一覧.Cells(i, 1).Value
Next
見やすくするために、間の処理は割愛しています。
・・・するとどうでしょう。結構単純に見えてきませんか?
まずは、「wk_ファイル一覧」シートの上から下まで、変数iでループさせています。
ここで、「Cells(Rows.Count, 1).End(xlUp).Row」という難しそうなものが出てきますが、こちらは第11講で解説しています。もし、
よくわかんないよー
という方は、そちらのブログを参考にしてみて下さい(‘ω’)ノ
そして、あとは単純です。
「wk_ファイル一覧」シートの1列目に書かれたファイルを、オープンして、クローズしています。
1ファイル目の場合のみ、ヘッダをコピー
次は、先ほど飛ばした、こちらの部分です。
'1ファイル目の取込(=「i=1」)の場合のみ、ヘッダをコピー--------
If i = 1 Then
'売上げ情報ファイルの1行目を、「wk_売上げ情報一覧」シートの1行目にコピー
End If
売上げ情報ファイルを開いてみるとわかるのですが、1行目はヘッダ行で、実際のデータは2行目から記述されています。
こちらのヘッダ行は、コピーした後で、1番最初の1行だけ必要になるものですよね。
そのため、1ファイル目(i=1)の場合のみ、ヘッダをコピーするよう、If文で分岐を入れています。
売上げ情報ファイルから「集計情報.xlsm」へ、1行ずつデータをコピー
そして最後はこちら。
'売上げ情報ファイルから「集計情報.xlsm」へ、データをコピー--------
For j = 2 To 売上げ情報ファイル.Cells(Rows.Count, 1).End(xlUp).Row
'売上げ情報ファイルのj行目を、「wk_売上げ情報一覧」シートのk行目にコピー
'データの書込先を、次の行に移動
k = k + 1
Next
実際に、売上げ情報ファイルから、「集計情報.xlsm」の「wk_売上げ情報一覧」シートにデータをコピーしていきます。
ポイントは、変数jとkの、「意味」と「使い方」です。
各変数の意味をおさらいすると、
- 変数j:売上げ情報ファイルの行番号(データの取得元)
- 変数k:「wk_売上げ情報一覧」シートの行番号(データの書込先)
そして、使い方については、変数の「初期値」と「更新」に注目しましょう!
【初期値】以下の処理で、各々の変数が初期化されています。
k = 2 '変数kを初期化
For j = 2 To 売上げ情報ファイル.Cells(Rows.Count, 1).End(xlUp).Row
【更新】
変数jは、For文の中でNextまで行くと、1加えられます。(詳細は、第10講参照)
変数kについては、Forループ内の「k=k+1」というコマンドで、1加えられていることがわかります。
それでは、変数jとkの、「意味」と「使い方」に注目して、
売上げ情報ファイルから「集計情報.xlsm」へ、1行ずつデータをコピーする様子を見てみましょう!
まず、変数jとkは、こちらの図の赤枠部分を意味しています。
そして使い方のところで見た、「初期値」に注目すると、最初は、2行目のデータを2行目にコピーすることがわかります。
続いて、ループが1回ぐるっと回ると、j=3、k=3になるので、こちらの図のようにコピーが行われます。(使い方の「更新」の部分に注目しています。)
さらに処理が進むと、売上げ情報ファイルのデータがなくなります。
そこで、ループを抜けることになるのですが、このタイミングでも、変数kに1が加えられるというのがポイントになります。(使い方の「更新」の部分に注目)
続いて、次のファイルを開いて、新しいForループが始まります。
そこで、変数jは、2に初期化されます。(使い方の「初期値」に注目)
変数kは、前の処理で「更新」したままなので、下の図のように、コピーが行われることとなります。
お疲れ様でした!これで、設計は完了です!!
本日のまとめ
今回は、複数ファイルからデータを取込む準備として、「設計」を行いました。
今回、結構ハードだったよー
という方もご安心ください♪
設計さえできてしまえば、8割くらいは完了したようなものです!
次回は、今回の設計を元に、実際にプログラミングしていきます!
そこで、設計の威力を実感できると思うので、お楽しみに(๑・̑◡・̑๑)
コメント