【第14講】複数ファイルからのデータ取込<実装編>(ラーメン屋さんの売上げを集計しよう!⑥)

スポンサーリンク

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

前回第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ブック・シートの定義を追加

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
VBAのコードを追加

ここで、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月までのデータが、正しく反映されていることは、みなさんご自身でも確認していただければと思います。

2021年6月~2021年12月までのデータが、正しく反映されていることを確認

今までやったことの総復習のような回だったので、

余裕だったよー

という方もいれば、

もう、てんやわんや!

めっちゃ疲れた!!

という方もいらっしゃったのではないかと思います。

大切なのは、このブログを読んで、何度も繰り返し、自分の手でプログラミングをしてみることなので、これからも継続して学んでいきましょう!!

次回は、準備段階としては、いよいよ最後となる、「ソート」をやっていきます。

また新しいことを学んでいくので、ぜひお楽しみにしてください!

本日の学びポイント
  • マクロを構築する際は、あらゆる場合に、簡単に応用しやすい状態にしておくことが重要
  • 実装の時のポイントは、設計時コメントを、消さないこと!

コメント

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