こんにちは!かいけつマクロです。
前回第13講では、<設計編>として、
売上げ情報ファイルの一覧から、データを取込むための処理を、設計しました。
今回は、その設計をもとに、実際にプログラミングを行っていきます。
設計までできていれば、あとは、もうあと一息!
それでは今回も、張り切っていきましょう!
設計の確認と、今回やることについて
まずは、前回の設計の結果を、改めて確認しておきましょう。
'売上げ情報一覧作成
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
そして今回は、以下のような修正を加えていきます。
- Excelブック・シートの定義を追加
- 上の図の赤枠で囲った部分を、コメントから、VBAのコードに変更
Excelブック・シートの定義を追加する
まずは、Excelブック・シートの定義を追加していきます。
こちらのコードを、プロシージャの定義(Sub make_sales_info_list())の直後に入れてください。
'「集計結果.xlsm」と、「wk_ファイル一覧」「wk_売上げ情報一覧」シートを定義=============
Dim b集計結果 As Workbook
Dim sWk_ファイル一覧 As Worksheet
Dim sWk_売上げ情報一覧 As Worksheet
Set b集計結果 = ThisWorkbook
Set sWk_ファイル一覧 = b集計結果.Worksheets("wk_ファイル一覧")
Set sWk_売上げ情報一覧 = b集計結果.Worksheets("wk_売上げ情報一覧")
'取込対象の売上げ情報ファイルを定義================================
Dim wb As Workbook '売上げ情報ファイルを、動的に格納するための変数
Dim ws As Worksheet '売上げ情報ファイルを、動的に格納するための変数
Dim file As String '売上げ情報ファイルのパスを、動的に格納するための変数
Excelブック・シートの定義については、第9講でも解説しているので、
何やってるかよくわかんないよー
という方は、まずはこちらからご覧になってみてください。
さて、こちらの「Excelブック・シートの定義」の処理ですが、ポイントは、
「Set」で代入しているのは、「集計結果.xlsm」と、
その中のシート「wk_売上げ情報一覧」「wk_売上げ情報一覧」のみ
=
売上げ情報ファイルは、このタイミングでは、代入処理しない
ということです。
ここで売上げ情報ファイルも
代入しちゃえばいいんじゃないの?
と思われるかもしれませんが、もう少し具体的に考えてみましょう。
今、売上げ情報ファイルは、月ごとに、1ファイルずつ用意されているんでした。
そして、集計対象は、2021年6月~2021年12月なので、このタイミングで代入処理までしようとすると、こんな感じになると思います。(ファイルパスは、無視してます。)
Dim b202106 As Workbook
Dim s202106 As Workbook
Set b202106 = Workbooks.Open("2021年06月.xlsx")
Set s202106 = b202106.Worksheet(1)
Dim b202107 As Workbook
Dim s202107 As Workbook
Set b202107 = Workbooks.Open("2021年07月.xlsx")
Set s202107 = b202107.Worksheet(1)
・・・
Dim b202112 As Workbook
Dim s202112 As Workbook
Set b202112 = Workbooks.Open("2021年12月.xlsx")
Set s202112 = b202112.Worksheet(1)
ここで急遽、上司から、
集計対象を、2021年6月~2022年6月に変更!
っていう指示が出たら、どうでしょう?
・・・そう。2022年1月~2022年6月分のコードを新たに追加が必要です。
期間が変わるだけで、いちいち
プログラムの変更が必要だなんて、面倒くさいよー
って思いますよね!
こういったことを回避するため、
売上げ情報ファイルの代入処理は、For文の中で実装するようにします。
このように、Excelマクロがあらゆる場合に、簡単に応用しやすい状態にしておくことは、マクロを構築する上で、非常に重要になってきます。
ちなみに、この内容は、いつもより少し難易度の高い話になるので、
イマイチよくわかんないなー
という方は、
ファイルの数が変わるかもしれないから、
For文の中で代入処理をするようにしたんだ!
ということだけ分かってもらえれば、全く問題ありません(‘ω’)ノ
これで、「Excelブック・シートの定義を追加」は完了です!
コメント部分を、VBAのコードに変更
続いて、「コメントから、VBAのコードに変更」をやっていきましょう。
まずは、コードから。
For i = 1 To sWk_ファイル一覧.Cells(Rows.Count, 1).End(xlUp).Row
'ファイルオープン : sWk_ファイル一覧.Cells(i, 1).Value
file = sWk_ファイル一覧.Cells(i, 1).Value
Set wb = Workbooks.Open(file)
Set ws = wb.Worksheets(1)
'売上げ情報ファイルからデータをコピー===============================
'1ファイル目の取込(=「i=1」)の場合のみ、ヘッダをコピー--------
If i = 1 Then
'売上げ情報ファイルの1行目を、「wk_売上げ情報一覧」シートの1行目にコピー
sWk_売上げ情報一覧.Cells(1, 1).Value = ws.Cells(1, 1).Value
sWk_売上げ情報一覧.Cells(1, 2).Value = ws.Cells(1, 2).Value
sWk_売上げ情報一覧.Cells(1, 3).Value = ws.Cells(1, 3).Value
End If
'売上げ情報ファイルから「集計情報.xlsm」へ、データをコピー--------
For j = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
'売上げ情報ファイルのj行目を、「wk_売上げ情報一覧」シートのk行目にコピー
sWk_売上げ情報一覧.Cells(k, 1).Value = ws.Cells(j, 1).Value
sWk_売上げ情報一覧.Cells(k, 2).Value = ws.Cells(j, 2).Value
sWk_売上げ情報一覧.Cells(k, 3).Value = ws.Cells(j, 3).Value
'データの書込先を、次の行に移動
k = k + 1
Next
'Excelマクロの終了後には、必ずインプットファイルを閉じる=============
wb.Close savechanges:=False
Next
ここで、1つポイントがあります。
実装の際は、必ず、設計の時に記述したコメントを残したままにし、VBAのコードは、コメントのすぐ下に追記していくようにしましょう。
実装の時は、
- 設計時に記述したコメントは、消さない
- VBAのコードは、コメントのすぐ下に追記
前回第13講の時に、設計をするメリットとして、こちらの2点を上げました。
<設計をするメリット>
- いきなりプログラミングするよりも、目的の実現方法をイメージしやすい
- 後から見て、そのプログラムが何をしているか、人間が理解しやすい
こちらの2点目が、設計時に記述したコメントを消さない理由です。
消しちゃったら、後から見れないですもんねー
なので、みなさん、設計をもとに開発をするときは、くれぐれも設計のコメントを消さないようにお願いしますね!
さて、1つ1つの処理を見ていきましょう。
・・・といっても、今まで学んだ知識を使うだけなので、
ここでは、過去のどの記事を参考にすればよいか、ということを書いておきます。
何やってるかよくわかんないなー
という方は、まずは、各記事を参照してみてください。
それでもわからないよーーー!という場合は、TwitterのDMや、一番下のコメント欄から、お気軽にご連絡ください♪
売上げ情報ファイルを開く
'ファイルオープン : sWk_ファイル一覧.Cells(i, 1).Value
file = sWk_ファイル一覧.Cells(i, 1).Value
Set wb = Workbooks.Open(file)
Set ws = wb.Worksheets(1)
<分からないときに参照したい記事>
第10講の「2-1.Excelブックを開く(Workbooks.Open)」
1ファイル目の取込の場合のみ、ヘッダをコピー
'売上げ情報ファイルの1行目を、「wk_売上げ情報一覧」シートの1行目にコピー
sWk_売上げ情報一覧.Cells(1, 1).Value = ws.Cells(1, 1).Value
sWk_売上げ情報一覧.Cells(1, 2).Value = ws.Cells(1, 2).Value
sWk_売上げ情報一覧.Cells(1, 3).Value = ws.Cells(1, 3).Value
<分からないときに参照したい記事>
第10講の「3-1.ヘッダ情報をコピーする」
売上げ情報ファイルのデータを、「wk_売上げ情報一覧」シートにコピー
'売上げ情報ファイルのj行目を、「wk_売上げ情報一覧」シートのk行目にコピー
sWk_売上げ情報一覧.Cells(k, 1).Value = ws.Cells(j, 1).Value
sWk_売上げ情報一覧.Cells(k, 2).Value = ws.Cells(j, 2).Value
sWk_売上げ情報一覧.Cells(k, 3).Value = ws.Cells(j, 3).Value
<分からないときに参照したい記事>
第11講の「3-3.売上げ情報ファイルのデータを、集計シートにコピー」
売上げ情報ファイルを閉じる
'ファイルクローズ : sWk_ファイル一覧.Cells(i, 1).Value
wb.Close savechanges:=False
<分からないときに参照したい記事>
第10講の「2-2.Excelブックを閉じる(Workbooks.Close)」
本日のまとめ
お疲れさまでした!これで、「wk_売上げ情報一覧」シートは完成です!!
実際に、2021年6月~2021年12月までのデータが、正しく反映されていることは、みなさんご自身でも確認していただければと思います。
今までやったことの総復習のような回だったので、
余裕だったよー
という方もいれば、
もう、てんやわんや!
めっちゃ疲れた!!
という方もいらっしゃったのではないかと思います。
大切なのは、このブログを読んで、何度も繰り返し、自分の手でプログラミングをしてみることなので、これからも継続して学んでいきましょう!!
次回は、準備段階としては、いよいよ最後となる、「ソート」をやっていきます。
また新しいことを学んでいくので、ぜひお楽しみにしてください!
コメント