先日書いたExcel複数シート集計ー複数シートの合計値を1枚に集計するマクロ【サンプルあり】ーでご紹介したマクロ。
同じくMicroSoft MVP For Excelの伊藤潔人さん(同じくといっても大先輩です)がブログで同じ事例のマクロを書いてくださいました。合計を集計用シートにまとめるExcelマクロ
この違いがマクロの面白いところでもあり、難しいところでもあります。
マクロは言葉
マクロはプログラムです。
英語(一部日本語)でExcelに指示を出し、その指示通りに処理をしてもらいます。
ある程度の厳格なルールはありますが、「言葉」ですので、書く人によって違いがあるのです。
文章でまったく同じものがないように、マクロにもまったく同じものはないといっていいでしょう。
(よほど単純なものを除いて)
伊藤さんと私のマクロもぱっと見た感じでも印象はかなり違います。
こちらが伊藤さんのマクロ。
Sub 合計値を集計シートにまとめる()
Dim mrg_row As Long
Dim sum_row As Long
mrg_row = 1For Each w In Worksheets
w.Range(“D” & Rows.Count).End(xlUp).RowWorksheets(“集計”).Range(“A” & mrg_row).Value = _
w.Name
Worksheets(“集計”).Range(“B” & mrg_row).Value = _
w.Range(“D” & sum_row).Valuemrg_row = mrg_row + 1
End Sub
こちらが私のマクロです。
Sub shuukei()
Shuukei_cell = 1Dim w As Worksheet
For Each w In Worksheets
If w.Name < > “集計” Then
Last_row = w.Range(“d” & Rows.Count).End(xlUp).Row
Range(“b” & Shuukei_cell).Value = w.Range(“d” & Last_row)
Shuukei_cell = Shuukei_cell + 1
End Sub
この事例(シートごとの合計値を1枚の集計シートにまとめる)では、どちらのマクロでも同じように動きます。
共通しているのは、自分が使うだけではなくマクロの初心者向けにもわかりやすくどう書けばいいかを考えている点です。
自分が使うだけなら、もっと簡潔に書くこともできます。
ただし、簡潔=わかりやすいわけではありません。
省略するとかえってわかりにくくなる場合もありますし、省略した方がわかりやすいものもあります。
伊藤さんのツイートでも、こう書かれていました。
おっしゃるとおり苦悩しています^_^;
セミナーや執筆をやっている中で、私もまだまだ試行錯誤している状態です。
伊藤さんもセミナーを開催される中で、書くマクロが変わってきているとのことでした。
本日のインスタクターのネタ帳では、 @yoichiinoue さんの、初心者向けにマクロをどう書くべきか苦悩の見えるコードをきっかけにした、合計を集計用シートにまとめるExcelマクロをご紹介しています。 http://t.co/LzlwqhNw4P
— 伊藤潔人++ (@kiyotoi) September 16, 2013
相違点=自由度があるところ
ではかんたんに相違点をみながら、マクロを書くポイントをご紹介していきます。
マクロ名
■伊藤さん
Sub 合計値を集計シートにまとめる()
■私
Sub shuukei()
マクロ(正確にはプロシージャ)の名前は、日本語、英語でもかまいません。
私は、ローマ字や英語で書くことが多いです。
伊藤さんは、わかりやすいように日本語で書かれています。
変数名
■伊藤さん
w、mrg_row、sum_row
■私
w、Last_row、Shuukei_cell
変数とは、Excelに指示をするとき、わかりやすくするため、手間を省くために使うものです。
たとえば、wという変数は、ワークシート(シート)を表します。
この変数は、自由に決められるのです。
簡単に書くなら、小文字1文字がベストですが、後からマクロを見てもわかるようにするには、ある程度の長さで表現した方がいい場合もあります。
英語を使うか、ローマ字を使うか、日本語を使うかも悩むところです。
日本語は、入力モードを切り替えなければいけないため、伊藤さんも私も使っていません。
(見てわかるようにすることを重視するのならば、日本語もありかもしれないと最近思っています)
伊藤さんも私もワークシートのwは同じです。
集計元(各シートの最後の行)を指定する変数は、伊藤さんが「まとめる」という意味のmrg_row、私は「最後の行」という意味のLast_rowを使っています。
集計先を指定する変数は、伊藤さんが「合計」という意味のsum_row、私がローマ字で「集計先のセル」という意味のShuukei_cellです。
このように人によってまるっきり違います。
ある程度のセオリーはありますけどね。
変数名に大文字をいれるかという違いもあります。
伊藤さんは小文字のみ、私は大文字をいれています。
後述する宣言のときにLast_rowと大文字を入れると、それ以降でlast_rowと小文字のみで入力したとき、Last_rowと補正してくれます。
変数名のミスも防げるので、私はこのしくみが好きなのです。
だからこそ、変数に大文字を入れています。
変数宣言の場所
■伊藤さん
マクロの冒頭にまとめています
■私
使う場所の直前に書いています
マクロでは、wやLast_rowなどの変数を、「これは変数です」と宣言する必要があります。
宣言しないと、マクロが混乱するからです。
「おい、あれとってくれ」や「例のものを頼む」といったときに、「あれ」や「例のもの」がわからないと混乱します。
「あれ」や「例のもの」が変数とすれば、それぞれが何なのかを事前に話しておく必要があるでしょう。
変数も、使う場所の前に宣言すれば大丈夫です。
前であればどこでもいいのですが、伊藤さんはマクロの冒頭、私は使う場所の直前に置いています。
マクロの改行
■伊藤さん
随時入れています。
■私
基本的に入れません
マクロで改行するときは、「 _」(半角スペースとアンダーバー)を入れます。
伊藤さんは随時いれてらっしゃいますが、私は基本的にいれません。
よほど長くなったとき以外は使わないです。
項目の入力
■伊藤さん
Worksheets(“集計”).Range(“A” & mrg_row).Value = _
w.Name
という1文を入れています
■私
最初からExcel側で準備しています
項目というのは、集計先の4月〜3月のことです。
伊藤さんは、この準備もマクロに入れていますが、私は最初からExcelで準備しています。
セル指定の大文字・小文字
■伊藤さん
sum_row = _
w.Range(“D” & Rows.Count).End(xlUp).Row
と大文字
■私
Last_row = w.Range(“d” & Rows.Count).End(xlUp).Row
と小文字
ここは非常に迷っているところです。
本来セルは、「D10」というように表記します。
ただ、入力するときは、「d10」と入れることが多く、もちろんマクロも動きます。
マクロだけではなく関数でも同様です。
以前は私も大文字にしていたのですが、実際に書くことを考えると小文字に変えています。
ここは今後の検討事項です。
(本を出すまでには決めます)
ワークシートの指定
■伊藤さん
Worksheets(“集計”).Range(“B” & mrg_row).Value = _
w.Range(“D” & sum_row).Value
■私
Range(“b” & Shuukei_cell).Value = w.Range(“d” & Last_row)
伊藤さんは、Worksheets(“集計”)とシートを指定しています。
私は省略していますので、「今選択しているシート」とマクロ側には解釈されています。
マクロをボタンで実行することを想定していますので、ボタンがあるシート=今選択しているシートになるため省略しても問題ありません。
しかし、ミスの可能性を減らすならば、シートをきちんと逐一指定した方が好ましいです。
ここも悩ましいところといえます。
自分なりのルールを作るのがマクロ上達の秘訣
わずか10数行のマクロですが、これだけの違いができます。
また別の方が書いたら、違ったものが出てくるでしょう。
(今回、伊藤さんに記事にしていただいて非常に勉強になりました。
ありがとうございます!)
マクロの本やサイトを見て、なんとなくしっくり来ないことがあるのは、この違いです。
文章でも、読みやすい・読みにくいといった違いはありますからね。
セミナーでもお話していますが、マクロを自分のものにするなら、書きながら考えながら自分なりのルールを作っていかなければいけません。
マクロは言葉です。かなりの自由度がありますので、自分が読みやすい変数で書き換えてみるだけでも、印象は変わります。
英語が得意かそうでないかによっても変数の付け方は違ってくるでしょう。
それをやるためには、基本の部分(伊藤さんと私のマクロの共通部分)をしっかりと身に付けることが大事です。
「ここは変えちゃいけない」「ここは変えていい」というものがわかるようになります。
ご興味ある方はセミナーもご利用ください。
9/26開催分は、本日23:00締切です。
Excelマクロ入門セミナー 詳細・お申し込み
昨日は終日、書籍執筆DAY。前日のトライアスロンの疲れをほぐすためにプールにも行きました。
疲労回復だけでなくフォーム確認にも役立ちます。
■著書
『税理士のためのプログラミング -ChatGPTで知識ゼロから始める本-』
『すべてをがんばりすぎなくてもいい!顧問先の満足度を高める税理士業務の見極め方』
ひとり税理士のギモンに答える128問128答
【インボイス対応版】ひとり社長の経理の基本
「繁忙期」でもやりたいことを諦めない! 税理士のための業務効率化マニュアル
ひとり税理士の自宅仕事術
リモート経理完全マニュアル――小さな会社にお金を残す87のノウハウ
ひとり税理士のセーフティネットとリスクマネジメント
税理士のためのRPA入門~一歩踏み出せば変えられる!業務効率化の方法~
やってはいけないExcel――「やってはいけない」がわかると「Excelの正解」がわかる
AI時代のひとり税理士
新版 そのまま使える 経理&会計のためのExcel入門
フリーランスとひとり社長のための 経理をエクセルでトコトン楽にする本
新版 ひとり社長の経理の基本
『ひとり税理士の仕事術』
『フリーランスのための一生仕事に困らない本』
【監修】十人十色の「ひとり税理士」という生き方