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

アイキャッチ
スポンサーリンク

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

今回からは、前回第12講で作成したファイル一覧を利用して、複数ファイルからデータを取込むという方法を学んでいきます。

今回は、このような、今まで学んだ知識を総動員していくことになります。

  • Excelファイルを開く・閉じる(第9講
  • For文(第10講
  • 別ファイルからデータを取込む(第11講

不安な方は、適宜、前のブログに戻って、読み直してみましょう。

また、このあたりから、For文やIf文が入れ子になってきて、

頭がごちゃごちゃしてきたよー

という方が出てくると思います。

そんな時は、第11講で紹介した、「ブレークポイント・イミディエイトウィンドウを使って、1行ずつ見ていく」という方法が、かなり有効になってきます!

まだご覧になっていない方は、ぜひそちらを読んでから、今回の記事を読み進めるようにしてください。

それでは、今回も張り切っていきましょう!

スポンサーリンク

処理の流れの確認

まずは、今回の目標「複数ファイルからデータを取込む」について、どのような流れで処理を実行するか確認していきます。

処理は、こちらの手順①~⑥の順で実行していきます。

「ファイル一覧」で一番上のファイル(2021年06月.xlsx)を開く
開いたファイルのデータを「集計結果.xlsm」にコピー
「ファイル一覧」で2番目のファイル(2021年07月.xlsx)を開く
「2021年06月.xlsx」のデータの直後にデータをコピー
手順③④を繰り返し、実行する
「2021年12月.xlsx」まで、売上げ情報ファイルを開いて、データをコピーしたら、処理終了!

次の章では、コメントを使って、上の手順を、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行だけ必要になるものですよね。

そのため、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は、こちらの図の赤枠部分を意味しています。

変数jとkの「意味」

そして使い方のところで見た、「初期値」に注目すると、最初は、2行目のデータを2行目にコピーすることがわかります。

最初は、2行目のデータを2行目にコピーする(「初期値」に注目)

続いて、ループが1回ぐるっと回ると、j=3、k=3になるので、こちらの図のようにコピーが行われます。(使い方の「更新」の部分に注目しています。)

j=3、k=3になるので、3行目を3行目にコピー(使い方の「更新」に注目)

さらに処理が進むと、売上げ情報ファイルのデータがなくなります。

そこで、ループを抜けることになるのですが、このタイミングでも、変数kに1が加えられるというのがポイントになります。(使い方の「更新」の部分に注目)

ループを抜けるタイミングで、変数kに1が加えられる(使い方の「更新」の部分に注目)

続いて、次のファイルを開いて、新しいForループが始まります。

そこで、変数jは、2に初期化されます。(使い方の「初期値」に注目)

変数kは、前の処理で「更新」したままなので、下の図のように、コピーが行われることとなります。

変数jは、2に初期化(使い方の「初期値」に注目)
変数kは、前の処理で「更新」したまま

お疲れ様でした!これで、設計は完了です!!

本日のまとめ

今回は、複数ファイルからデータを取込む準備として、「設計」を行いました。

今回、結構ハードだったよー

という方もご安心ください♪

設計さえできてしまえば、8割くらいは完了したようなものです!

次回は、今回の設計を元に、実際にプログラミングしていきます!

そこで、設計の威力を実感できると思うので、お楽しみに(๑・̑◡・̑๑)

本日の学びポイント
  • 設計をするメリットは、以下の2点
  • いきなりプログラミングするよりも、目的の実現方法をイメージしやすい
  • 後から見て、そのプログラムが何をしているか、人間が理解しやすい
  • 変数の定義をするときは、何を表す変数か、ということを、必ずコメントで書く
  • For文が入れ子になるなど、複雑な処理になればなるほど、
    変数の「意味」と「使い方」を意識するのがポイント
  • 変数の「使い方」については、「初期値」と「更新」に注目する

コメント

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