こんにちは!かいけつマクロです。
前回まで全5回を通じ、計算機を作成してきました。皆さんのExcelマクロに対する理解が、ぐーーーーーーーーんと上がり、入門・初心者が必須で押さえておくべき知識は、ひとまず学習できたと思います。
さて、今回からは、入門・初心者を抜け出し、ちょっとハイレベルなところまで到達するために身に着けておきたい知識を学習していきます。
ちょっとハイレベルだって、わくわくするね
という方も、
今までだって結構難しかったのに大丈夫かな。。
という方も、全員が、読んで・実践していたら、いつの間にかスキルが身についちゃった!となることを目標に、引き続き連載をしていきますので、ぜひ自分のペースで読み進めていってみてください。
それでは、今回も、張り切ってまいりましょう!
ファイル操作を学んで、集計業務を効率化する
今回からは、あるラーメン屋さんの、半年間の売上げを集計することを、考えていきます。
なんでラーメン屋さんなの?
それは、ただ単純に、私かいけつマクロがラーメン大好きだからです。(ここ大事)
おススメのラーメン屋さんがあったら、コメントで教えてください
・・・と少し脱線しましたが、
今回の連載「ラーメン屋さんの売上げ集計」を学ぶと、Excelマクロでの「ファイル操作」の基本を身につけ、「集計業務」を効率化できます。
超大事なところなので、2回言いました。
具体的には、「ファイル操作」を学び、これらの複雑な操作を、ボタン1つで簡単にできるようになることを目指します。
- バラバラのシートに管理されている情報を、1シートにまとめる(Set、Dir、For)
- 明細行をソートする(Sort)
- 商品毎に、月別の売上高を集計する(For文とIf文の組合せ)
ぜひ、今回からの解説を読んで・実践して、業務効率化を達成していきましょう。
なお、「ファイル操作」は、どうしても少しだけ(あくまでも少しだけですが、)処理が長く、複雑になりがちです。
少し長い連載になってしまうと思いますが、ぜひ最後までご覧いただけると大変うれしいです!
また、理解しづらかったり、困ったことがあれば、お気軽に一番下のコメント欄やTwitterのDMからご連絡ください。丁寧に回答させていただきます。
売上げ集計マクロを作成するまでの流れ
売上げ集計マクロの作成は、第9講~第17講の9回に渡って進めていきます。
大まかな流れは、こんな感じ。
<第9講~第11講:ファイル操作(基礎編)>
まずはお試しで、1か月分のファイル取込を行い、ファイル操作の基礎・基本をしっかり学びます。
<第12講~第17講:ファイル操作(応用編)>
第9講~第11講で身につけた知識を応用し、実際に、2021年6月~2021年12月の売上げ情報ファイルの取込・集計に挑戦します。
もし、
基礎は大丈夫だから、実際にどうやって集計してるか知りたい
という方は、第12講から見ていただくのが良いと思います!
また、具体的な、各講での取扱内容は、以下の通りです。
【ファイル操作(基礎編)】
<第9講>
インプット・アウトプットを確認する
2021年6月の売上げ情報ファイルを取り込む①(ブック・シートの定義)
<第10講>
2021年6月の売上げ情報ファイルを取り込む②(ThisWorkbook.Path、Open、For)
<第11講>
2021年6月の売上げ情報ファイルを取り込む③(Cells(Rows.Count, 1).End(xlUp).Row)
【ファイル操作(応用編)】
<第12講>
売上げ情報ファイルの一覧を作成する(Dir、Do~Loop)
<第13講>
2021年6月~2021年12月の売上げ情報ファイルを、集計シートに取り込む(設計編)
<第14講>
2021年6月~2021年12月の売上げ情報ファイルを、集計シートに取り込む(実装編)
<第15講>
売上げ情報を、「商品>年月」の順にソートする(sort)
<第16講>
商品毎に、月別の売上高を集計する
<第17講>
取込ボタンを設置して、ボタン1つでExcelマクロを実行できるようにする。
なお、今回から利用する、売上げ情報ファイルは、こちらからダウンロードできます。お好きなところにダウンロードしてから、次の章に進んでください。
※セキュリティ等の理由で、うまくダウンロードできない場合は、以下の手順で自作いただくこともできます。
・お好きな場所に、「売上げ情報集計」という名前でフォルダを作成
・Excelを開き、work.xlsmという名前で、「売上げ情報集計」フォルダの下に保存
※この時点で、中身は空っぽでOK
・「work.xlsm」で、VBEを開く(Alt+F11)
・標準モジュールを挿入し、こちらのリンクのVBAコードをコピペ リンク
・一番下の「Sub 連続実行()」にカーソルを当てた状態で、マクロを実行
インプット・アウトプットを確認する
それでは準備が整ったので、早速、マクロを作成していきましょう!。。。と行きたいところなのですが、その前に非常に大切な作業があります。
それは、「インプットとアウトプットを確認すること」
そんなの意味あるの?早くマクロを書き始めようよ
と思われる方もいらっしゃるかもしれませんが、
- 何をインプットにしてExcelマクロを動かすか、また、それはどういう形式か
- 最終的に、アウトプットをどういう形で整理をするか
を、ぼんやりでもいいので、作り出す前に、把握しておくことが、Excelマクロの作成においてとても重要になってきます。(当然、途中で変更が入ってもOK)
ということで、まずは「インプット」のほうから。「売上げ情報」フォルダの中にある、「2021年06月.xlsx」の中身を見てみましょう。
とりあえずこの段階では、「日付・商品毎に、売上数量が入っている」んだなー、ということだけ把握してもらえればOKです。
同様に、「単価テーブル.xlsx」はこんな感じ。こちらはとってもシンプルで、商品毎に、単価の情報が記載されています。
続いて、「アウトプット」のほうです。ダウンロードしたフォルダの中にある「集計結果.xlsm」をご覧ください。
最終的には、「集計結果」シートに、商品・年月ごとに、売上げ情報をまとめていきます。
そのための準備として、以下3つのシートを利用して、順に情報を整理していきます。
- wk_ファイル一覧
- wk_売上げ情報一覧
- wk_売上げ情報一覧_sorted
こちらについても、この段階では、「いくつか段階に分けて集計していく」んだなー、ということだけ把握してもらえれば問題ありません。
2021年6月の売上げ情報ファイルを、集計シートに取り込む
さて、インプット・アウトプットの確認が完了したので、いよいよ、実際にファイルを取り込んでみましょう。
- 取り込むファイルは、「2021年06月.xlsx」
- 取り込む先は、「集計結果.xlsm」の「wk_売上げ情報一覧」シート
です。まずは、「集計結果.xlsm」で、標準モジュールを用意するところまで完了させましょう。
このあたりの操作については、こちらのブログで解説していますので、もし不安な方がいらっしゃれば、併せてご覧ください。
それでは、まずは、プロシージャを作成します。ここでは、プロシージャ名を「work_get_file」としましょう。実際のコードはこんな感じ。
Option Explicit
Sub work_get_file()
End Sub
続いて、プロシージャの中身を書いていきます。いつも通り、まずはこちらのコードを書いていきましょう。
Option Explicit
Sub work_get_file()
'「集計情報.xlsm」と、「wk_売上げ情報一覧」シートを定義=============
Dim b集計結果 As Workbook
Dim sWk_売上げ情報一覧 As Worksheet
Set b集計結果 = ThisWorkbook
Set sWk_売上げ情報一覧 = b集計結果.Worksheets("wk_売上げ情報一覧")
'取込対象の「2021年06月.xlsx」を定義================================
Dim wb As Workbook
Dim ws As Worksheet
Dim path As String
path = b集計結果.path & "\売上げ情報"
Set wb = Workbooks.Open(path & "\" & "2021年06月.xlsx")
Set ws = wb.Worksheets(1)
'「2021年06月.xlsx」からデータをコピー===============================
'「2021年06月.xlsx」から「集計情報.xlsm」へ、ヘッダをコピー--------
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
Dim i As Long '「2021年06月.xlsx」の取得元の行番号
Dim j As Long '「wk_売上げ情報一覧」シートの書込み先の行番号
j = 2 '変数jを初期化
'「2021年06月.xlsx」から「集計情報.xlsm」へ、データをコピー--------
For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
sWk_売上げ情報一覧.Cells(j, 1).Value = ws.Cells(i, 1).Value
sWk_売上げ情報一覧.Cells(j, 2).Value = ws.Cells(i, 2).Value
sWk_売上げ情報一覧.Cells(j, 3).Value = ws.Cells(i, 3).Value
j = j + 1
Next
'Excelマクロの終了後には、必ずインプットファイルを閉じる=============
wb.Close savechanges:=False
End Sub
・・・
全然見たことないものばっかじゃん!
もう無理ー!寝r(ry
と言われそうですが、ちょっと待ってください。(通算3回目)
確かに、前回までと比べると、やっていることは非常に高度になっているのですが、それぞれの処理は全然難しくありません。(難しそうに見えるだけ)
上のコードを、今回と次回の2回に分けて、丁寧に解説していくので、しっかり見ていきましょう!
ワークブック・ワークシートを定義する
それでは、1つ1つ見ていきましょう。
ワークブック・ワークシート変数を宣言する
Dim b集計結果 As Workbook
Dim sWk_売上げ情報一覧 As Worksheet
よく勉強されている方だと、
なんか似たようなの、前にあったかも!
と思われるかもしれませんが、まさにその通りです!
第4講では、「変数」について学んでいて、こんなコードが出てきました。
Dim a As Long
Dim operator As String
- 上は、「整数(Long)」を入れるための箱として、変数「a」を定義
- 下は、「文字列(String)」を入れるための箱として、変数「operator」を定義
しています。
つまり、今回の場合は、
- 「Workbook」を入れるための箱として、変数「b集計結果」を定義
- 「Worksheet」を入れるための箱として、変数「sWk_売上げ情報一覧」を定義
した、ということです。
「Workbook」や「Worksheet」というのは、Excelの「ブック」と「シート」のことです。
どうですか?こう考えると、そんなに難しくなさそうに思えてきませんか?
ワークブックの変数に代入する
続いて、こちらのコードです。
Set b集計結果 = ThisWorkbook
この「=」は、第2講でやった「代入」の意味です。(代入のイメージはこんな感じ)
なので、1つ目は、
「ThisWorkbook(=このブック)」を、変数「b集計結果」に「代入」
しています。
・・・「このExcelブック」って何でしょう。
Excelマクロでは、「ThisWorkbook」は、「マクロを実行しているワークブック」のことです。
今回の場合だと、「集計結果.xlsm」で標準モジュールを作成し、動かしているので、「ThisWorkbook」は、「集計結果.xlsm」となります。
ワークシートの変数に代入する
続いては、こちら。
set sWk_売上げ情報一覧 = b集計結果.Worksheets("wk_売上げ情報一覧")
これも、先ほどと同じく代入処理で、今回はワークシートを代入しています。
どのワークシートを代入しているかというと、「b集計結果.Worksheets(“wk_売上げ情報一覧”)」
・・・なんとなく、想像がつきましたかね?
- 「b集計結果」には、「ThisWorkbook=集計結果.xlsm」が入っている
- 「.(ドット)」は、日本語の「を」や「の」の意味
- 「Worksheets(“wk_売上げ情報一覧”)」は、その名の通り、「wk_売上げ情報一覧」シート
そうです!
「集計結果.xlsm」の「wk_売上げ情報一覧」シートを、変数「sWk_売上げ情報一覧」に代入、という意味になります。
ここまで説明して、
そのまま流そうとしてるけど、
「Set」っていうのがあるよ!
という方、よく見てますね。。。
この「Set」は、「オブジェクト型」という型を持った変数の代入処理でつける必要があるものなのですが、あんまり深追いすると、
わけわかめ
となりそうなので、かなり乱暴ではありますが、こう覚えてしまいましょう。
- 「Workbook」と「Worksheet」の代入処理には、必ず、「Set」をつける
- それ以外は基本的に要らない(後のテストで、エラーになるので問題なし)
本日のまとめ
お疲れさまでした!今回はかなりボリュームが大きくなってしまい、少々大変だったかもしれません。。
今回やった、ブック・シートの定義については、今後のマクロ構築の中で何度も出てくるので、きっと勝手に身についてくると思います。
ぜひ、継続してこちらの解説ブログをご覧いただけると幸いです。
コメント