読みやすいコードの書き方
4月2日(土) 20:00~ Zoom勉強会に登壇します。「脱初心者!メンテナンスしやすいマクロの作り方」と題し、VBEの基本操作、シートの指定方法、変数(説明変数)、定数(Enum)をテーマに講演します。聞き専OKですのでお気軽にご参加ください。
VBAの学習に難敵として立ちはだかるのがクラスモジュールです。これは目的がわからないことが主な原因なのですが、クラスモジュールの目的はズバリ「コードの整理整頓」です。簡単で便利なクラスを作って勉強してみましょう。
マクロを作るSubやFunctionを、正確にはSubプロシージャ/Functionプロシージャと呼びます。このプロシージャは「使いどころがわからない」と悩む人が多く、そんな方々へ向けて、プロシージャ分割の基礎と使いどころを解説いたします。
マジックナンバーという用語をご存知でしょうか?Cells(R, 4) = Cells(R, 2) * Cells(R, 3)など、直接入力された数値を指す用語です。この3つの数値は、改修時の書き換えが面倒かつ危険でしかも読みづらいので、なくさなければいけない数字です。
Cells(R, ○)←VBAをやっている限り入力し続けることになるこのコードですが、この○を普段どうやって入力していますか?個数→P列→16という対応をいかに素早く考えるかがカギになるこの処理ですが、実はそれ以上に大事なことがあります。
マジックナンバーという用語をご存知でしょうか?Cells(R, 4) = Cells(R, 2) * Cells(R, 3)の2、3、4など、コード中に直接入力された数値を指す用語です。メンテ・可読性の点で、しっかりとプログラムを組むなら無くすべき数値です。
日本語変数・関数にとって、最大の敵は「入力のめんどくささ」です。この対策として、ふぁん⇒Functionのように変換を登録し、それでコードを入力していく方法があります。逆にコーディングが簡単で速くなるポテンシャルがあるので、是非使っていきましょう。
どんなマクロでも使えるような関数のことを汎用関数と呼びます。よく書く処理は汎用関数にして持っておきましょう。同じコードを何回も書かなくて良くなるだけでなく、コードが読みやすくなり、重要な処理に集中できるようになります。
英訳してはいけない変数第1位のワークシート、第2位の列見出し名ときて、最後は「専門用語」です。ExcelVBAを用いて業務を効率化せんとするみなさんはその道のプロです。プロ同士の繊細な意思疎通を図るためにも、専門用語はそのまま変数名にしましょう。
今回は日本語変数に関するお話です。第1位のワークシートに続き、列見出し名が日本語だった場合は、その変数名をわざわざ英訳してはいけません。特にEnum定数などは、入力も日本語の方が簡単なコードですので、しっかり一致させたコードを書きましょう。
今回は日本語変数に関するお話です。単刀直入に、シート名が日本語だった場合に、その変数名をわざわざ英訳してはいけません。VBAではワークシート名もソースコードの一部です。同じオブジェクトの変数名は、すべてのコードで同じ単語を当てましょう。
セル範囲の指定は、簡単に書こうと思えば書けるので、普段はあまり考えない部分かもしれません。ですが読みやすさや書きやすさを追求しようと思えば、とても考えがいのある処理ですので、自分の知識の確認の意味でも、ちょっと確認してみましょう。
「If 開始条件=False Then 警告 Else メインコード Endif」と書いているマクロは、ExitSub EndIfと一旦If文を閉じることで、メインの処理をElse内に書かずに済みます。メインコードのインデントが1つ減りますし、終わった話は終わったと明示しましょう。
「固定セルを定数で扱いたい!」という場面は結構多いです。データシートの上部に固定された、「対象月」や「更新日」のセルとかですね。常に同じRangeオブジェクトをくれる定数がほしいのですが、Constではできませんので、別の方法を使います。
コードの読みやすさと処理速度のバランスに関するお話です。テーマは「Ifの判定回数にどれだけこだわるか」です。単純な比較時間は、実はほとんど0で、別にIfは重複しても問題ありません。Else地獄に陥らないよう、読みやすさを追求していきましょう。
マクロの処理速度に関するお話です。今回のテーマは「錯覚しやすいForステートメントの処理速度」です。For R = 1 To 10000 処理A,B,C,D Nextは、For R = 1 To 10000 処理A Next × 4個に分けても、「Rに1を足す×30000回」しか処理の内容に差がありません。
Cells(i, 1)をもうやめて、Cells(R, 1)こうしませんか?という話です。複数のオブジェクトを扱う場面が多いExcelVBAにおいて「カウンタ変数は何のカウンタかわかるように命名する」ことは、とても重要なコーディング規約なんじゃないかと思います。
VBAでは、「:」を使うことで、複数行のコードを1行に書くことができます。これをマルチステートメントと呼びます。これを使うべきか。結論は、「使った行は読みづらくなるが、代わり全体の流れが読みやすくなるなら使ってOK」です。
アプリケーションハンガリアンと日本語変数はとっても相性が良くて、区切りと役割がはっきり分かれて読みやすい上に、キーボードの日本語入力をOFFのままで日本語変数を使えるよ。というお話です。最終目的のgifアニメを張りますので見てみてください。
データを扱うマクロで、セルの指定をCells(R, 4)やRange("D" & i)のように書いていませんか?列の挿入や削除に対応するのが、すごい面倒と感じている方は必見です。定数を使えば、このマクロを劇的に「読みやすく、変更に強く」することができます。
変数名・関数名などの識別子は、英語を使う明確な理由がない限り、なるべく日本語で命名するべきです。日本語変数を使うことで、翻訳に労力を割かなくなり、コードが読みやすくなり、全体の流れに集中できるようになり、プログラミングの上達が早くなります。