【VBA】読みにくいコードを改善する7つのポイント|修正しやすい実務設計
まず押さえたい結論|短さより理解しやすさを優先する
VBAのコードは、行数の少なさではなく、目的と処理の流れを迷わず追えるかどうかで評価すると実務で扱いやすくなります。
処理が正しく動いていても、変更する場所を見つけられなければ、修正のたびにコード全体を読み直すことになります。
読みやすさを意識した設計は、見た目を整える作業ではなく、将来の確認時間と修正ミスを減らすための準備です。
短いコードより修正しやすいコードが実務で役立つ
業務で使うマクロは、完成した瞬間よりも、条件変更や不具合対応で読み返す場面の方が長く続きます。
一行に多くの処理を詰め込めば、書いた直後はすっきり見えても、後から条件を追加するときに影響範囲を判断しにくくなります。
私も以前は短く書くことを意識していましたが、数か月後に自分のコードを読み直したとき、処理の意図を思い出すまでに時間がかかった経験があります。
特に、複数の条件判定とセルへの出力を一行へまとめたコードでは、どの条件がどの結果に関係しているのかを整理するだけでも手間がかかりました。
短く書いた時点では効率的に感じても、修正のたびに読み解く時間が増えるなら、実務全体では効率が下がっている可能性があります。
担当者が変わる業務や、毎月のように条件が変更される業務では、数行の短縮より、修正箇所をすぐ見つけられる構造の方が役立ちます。
この記事で改善できる7つのポイント
読みにくいコードは、変数名、改行、処理分割、コメント、変数宣言、固定値、見た目の統一という順番で確認すると改善箇所を見つけやすくなります。
すべてを一度に直す必要はなく、動作確認を挟みながら一項目ずつ改善する方法が安全です。
最初は変数名や改行のように処理結果へ影響しにくい部分を見直し、その後でプロシージャ分割などの構造変更へ進みます。
改善前の結果を保存しておけば、変更後も同じ結果になっているかを比較しながら作業できます。
この記事では、単に行数を増やす方法ではなく、どのような場面で直すべきかという判断基準もあわせて整理します。
VBAコードが読みにくくなる主な原因
読みにくさの原因を先に整理すると、見た目だけを整えるのではなく、修正時の負担を減らす改善へつなげられます。
原因を把握しないまま全体を書き換えると、必要のない部分まで変更し、新しい不具合を入れてしまう可能性があります。
既存コードでは、問題のある書き方を探すだけでなく、今後も変更される可能性が高い部分から優先して確認することが大切です。
書く時間より読む・修正する時間が長くなりやすい
実務のVBAは、作成後にシート名の変更、列の追加、判定条件の変更、出力先の追加などが発生しやすいものです。
たとえば、データ取得、条件判定、セルへの出力を一行にまとめると、出力先だけを変えたい場合でも行全体を読み解く必要があります。
コードの長さより、変更箇所を特定できる速さと、修正後の影響を説明できることの方が重要です。
一度だけ実行する確認用マクロと、毎月利用する集計マクロでは、読みやすさへかけるべき時間も異なります。
繰り返し使用するコードほど、最初に少し整理しておくことで、その後の修正や問い合わせへの対応が楽になります。
処理内容を説明できないまま変更すると、別の条件へ影響していないか不安になり、必要以上に広い範囲を確認することになります。
数か月後の自分には処理の意図が伝わらない
しかし、別の業務を挟んで数か月後に読み返すと、当時の前提や例外条件は思った以上に忘れています。
変数名がaやxだけでは、金額なのか行番号なのか判定結果なのかを、代入元までたどって確認しなければなりません。
未来の自分は事情を知らない担当者と同じだと考え、名前と構造だけでも大まかな意図が伝わる状態を目指す必要があります。
作成時には当然だと思っていた列の意味や処理順序も、仕様書やコメントがなければ後から再確認することになります。
特定のシート構成やファイル名を前提にしている場合、その前提がコードから読み取れないと、別の環境へ流用したときに問題が起こりやすくなります。
コードを閉じる前に、初めて見る人が処理の入口と出口を説明できるか確認すると、意図が伝わりにくい箇所を見つけやすくなります。
1行への詰め込み・曖昧な名前・固定値の散在
読みにくいコードには、一行へ複数処理を詰め込む、役割の分からない名前を使う、同じ固定値を各所へ直接書くという共通点があります。
次の項目に当てはまる数が多いほど、短さより構造の見直しを優先した方がよい状態です。
- 一行に代入、判定、出力が混在している
- 変数名を見ても中身や役割を説明できない
- 同じ文字列や数値が複数箇所に直接書かれている
- コメントが動作の言い換えだけになっている
- 一つのSubが入力から出力まで全部を担当している
- 条件分岐の開始と終了を目で追いにくい
これらの問題は一つだけなら小さく見えますが、複数が重なると、変更箇所を探すために代入元や呼び出し元を何度も往復することになります。
固定値が散らばっているコードでは、同じ意味の値なのか、偶然同じ数値なのかを判断できず、まとめて変更してよいか迷いやすくなります。
長いSubの途中に例外処理が追加され続けると、正常時の流れと異常時の流れが混ざり、どこで処理が終了するのかも追いにくくなります。
読みにくいVBAコードを改善する7つのポイント
既存コードは、動作を変えない小さな改善から始め、役割分担の見直しへ進むと安全に読みやすくできます。
改善する順番を決めておけば、変更した箇所が原因で動作が変わった場合でも、問題の範囲を絞りやすくなります。
大きなマクロでは一度に全体を直さず、日常的に修正する部分や不具合が起きやすい部分から取り組む方法が現実的です。
役割が伝わる変数名を付ける
変数名は、短さよりも、何を保存し、どの処理で使うのかが分かることを優先します。
たとえば、xではなくdepartmentName、nではなくlastRowのように、値の意味が想像できる名前へ置き換えます。
行番号ならrowNumber、件数ならrecordCount、判定結果ならisTargetのように、用途をそろえると読みやすくなります。
変数名を決めるときは、その行だけを見た人が値の意味を推測できるかを基準にします。
同じ種類の値には同じ単語を使い、行番号をrowと書く場所とlineと書く場所が混在しないようにします。
現在処理している行ならcurrentRow、最終行ならlastRowのように役割の違いを名前へ反映すると、条件式も読みやすくなります。
Boolean型の変数では、isEmptyやhasErrorのように真偽を想像できる名前を使うと、If文の意味を読み取りやすくなります。
一方で、名前へ処理の経緯まで詰め込むと長くなりすぎるため、値の内容と役割を説明できる範囲にとどめます。
1行に複数の処理を詰め込まない
一行には一つの判断または一つの操作を置くと、修正する場所と確認する内容を分けやすくなります。
一行Ifは処理が単純でも、後からElseやログ出力を追加すると構造を組み直す必要があります。
行数が増えることを欠点と考えず、一つの行を一つの確認単位として扱うと、レビューもしやすくなります。
ただし、単純な変数宣言まで不自然に分散させる必要はなく、意味のまとまりを保つことが大切です。
代入と判定と出力を分けると、どの段階で想定外の値になったのかを確認しやすくなります。
デバッグ時に停止位置を設定する場合も、処理が分かれていれば、各段階の変数内容を順番に確認できます。
一行へまとめることで読み手が得られる利点より、将来の追加や確認が難しくなる負担の方が大きい場合は、複数行へ分けます。
短い一行Ifを残す場合でも、条件と実行内容が一目で理解でき、今後の追加可能性が低いことを確認します。
役割ごとにプロシージャを分ける
一つのSubにすべてを詰め込まず、入力確認、データ取得、加工、出力、後処理などの役割で分けます。
プロシージャ名は、ImportCsvDataやValidateInputのように、何をする処理なのかが伝わる動詞を含めます。
分割の基準は行数ではなく、その処理を一文で説明できるかどうかです。
一方で、二行程度の処理まで細かく分けすぎると、移動先を追う回数が増えるため、変更単位として独立させる価値があるかを確認します。
MainとなるSubには処理の大きな流れだけを残し、詳細は名前から役割が分かるプロシージャへ任せると全体像を把握しやすくなります。
入力確認だけを分けておけば、条件不足のまま主要処理へ進むことを防ぎやすくなります。
出力処理を独立させると、出力先の変更が発生した場合に、データ取得や加工へ触れずに修正できる可能性が高まります。
プロシージャ間で多くの共有変数へ依存すると関係が分かりにくくなるため、必要な値は引数や戻り値として受け渡す方法も検討します。
コメントには「何を」ではなく「なぜ」を残す
コメントはコードの動作を日本語へ置き換えるのではなく、その書き方を選んだ理由や業務上の制約を残します。
たとえば、「A列を確認する」だけではコードを見れば分かりますが、「未入力行は請求対象外のため除外する」と書けば判断理由が伝わります。
例外的な条件、外部ファイルの仕様、変更してはいけない順序、過去に起きた不具合への対策は、コメントとして残す価値があります。
良いコメントの基準は、その一文がなければ将来の担当者が誤った修正をする可能性があるかどうかです。
業務上の締め日や取引先ごとの例外など、コードだけでは理由を判断できない条件は、特に説明を残した方が安全です。
一時的な対応である場合は、なぜ必要なのかだけでなく、どの条件が解消されたら見直せるのかも分かるようにします。
処理内容を変更したときはコメントも同時に確認し、古い説明が残っていないかをレビュー項目へ含めます。
コメントを書かなくても名前や構造で意図が伝わる部分は、無理に説明を増やさず、コード自体の分かりやすさを優先します。
Option Explicitで変数の宣言漏れを防ぐ
モジュールの先頭にOption Explicitを記述すると、変数を宣言せずに使用した箇所を見つけやすくなります。
VBAでは変数名の入力ミスが別の変数として扱われることがあるため、宣言を必須にすると見落としを減らせます。
行番号にはLong、文字列にはString、真偽の判定にはBooleanなど、用途に合う型を選びます。
既存コードへ導入するときは、宣言漏れを一度に直し、動作確認を行ってから次の改善へ進みます。
似た名前の変数が複数あるコードでは、宣言を確認する過程で、同じ役割の変数が重複していることに気付ける場合があります。
型を明示すると、文字列として扱う値と数値として計算する値の違いが分かり、意図しない変換を見つけやすくなります。
変数の有効範囲も必要以上に広げず、プロシージャ内だけで使う値はローカル変数として宣言します。
モジュール全体で共有する変数は便利ですが、どの処理から変更されたのか追いにくくなるため、必要性を確認してから使用します。
数値や文字列を直接書かず定数へまとめる
シート名、列番号、基準値、保存先などを複数箇所へ直接書くと、変更時に修正漏れが起こりやすくなります。
たとえば、3という数値だけでは意味が分かりませんが、DATA_START_ROWならデータ開始行だと判断できます。
ただし、一度しか使わず、意味が明らかな値まで定数化すると、定義元を探す手間が増える場合があります。
変更される可能性、複数箇所での利用、値だけでは意味が分からないことを定数化の判断基準にします。
シート名やファイル名を定数へまとめると、名称変更が発生したときに確認する場所を限定できます。
列番号を数値だけで書く場合も、CUSTOMER_NAME_COLUMNのような名前を付けると、どの項目を参照しているか分かりやすくなります。
基準値が業務ルールによって変わる場合は、定数としてコード内へ置く方法だけでなく、設定用シートから読み込む方法も検討できます。
複数の意味を持つ同じ数値を一つの定数へまとめると誤解を招くため、用途が異なる場合は別の名前で管理します。
インデント・空行・処理順序をそろえる
インデントは、If、For、Withなどの内側を視覚的に示し、開始と終了の対応を追いやすくします。
空行は、入力確認、主要処理、出力、後処理など、役割の切り替わりを示すために使います。
処理順序は、前提確認から始め、データ取得、加工、出力、終了処理へ進む流れにすると理解しやすくなります。
見た目の統一は装飾ではなく、読み手が処理構造を早く把握するための情報です。
同じ階層の処理では同じ幅のインデントを使い、途中だけ字下げが変わらないようにします。
長いIf文では条件ごとのまとまりをそろえ、どのEnd Ifがどの条件に対応しているかを追いやすくします。
空行を入れすぎると処理のまとまりが分断されるため、一つの役割の中では必要以上に区切らないようにします。
プロシージャ内の順番を統一すると、別のマクロを読む場合でも、入力確認や終了処理の位置を予測しやすくなります。
| 改善項目 | 読みにくい状態 | 改善方法 | 期待できる効果 |
|---|---|---|---|
| 変数名 | aやxだけで役割が不明 | 内容と用途が分かる名前へ変更 | 代入元を探す回数を減らせる |
| 一行の処理 | 判定と出力が同じ行にある | 判断と操作を別の行へ分ける | 変更箇所を特定しやすい |
| 処理分割 | 一つのSubが全工程を担当 | 役割ごとにプロシージャ化する | 影響範囲を限定しやすい |
| コメント | 動作の言い換えだけを書く | 仕様や判断理由を残す | 誤った修正を防ぎやすい |
| 変数宣言 | 宣言漏れや入力ミスが残る | Option Explicitを使う | ミスを早い段階で見つけやすい |
| 固定値 | 同じ値が各所へ散らばる | 定数として一か所へまとめる | 変更漏れを減らしやすい |
| 見た目 | 字下げと空行が不統一 | 階層と役割に合わせてそろえる | 処理の範囲を追いやすい |
表のすべてを一度に改善する必要はなく、修正予定がある項目や、読むたびに迷う項目から対応します。
改善後はコードが長くなったかではなく、目的、変更箇所、影響範囲を以前より説明しやすくなったかで確認します。
修正前と修正後で比べる読みやすいコード
修正前後を比べると、行数ではなく、変更箇所と処理目的の見つけやすさが重要だと分かります。
比較するときは見た目だけでなく、条件追加、出力先変更、不具合調査を行う場面を想定すると違いを判断しやすくなります。
改善後のコードでも処理結果が変わっていないことを確認し、読みやすさと動作の正しさを別々に点検します。
1行Ifを複数行へ分ける例
一行Ifは短く見えますが、条件追加やElse処理が必要になると、行全体を書き換えることになります。
| 比較 | 記述例 |
|---|---|
| 修正前 | If amount >= 10000 Then discount = 500 |
| 修正後 | If amount >= DISCOUNT_THRESHOLD Then |
| 修正後 | discount = DISCOUNT_AMOUNT |
| 修正後 | End If |
修正後は行数が増えますが、判定条件と実行内容が別れ、どちらを変更するのか判断しやすくなります。
一行Ifを残してよいのは、処理が今後も単純で、追加の可能性が低く、読み手が迷わない場合です。
将来、割引条件を複数へ増やす場合や、対象外の理由を記録する場合は、複数行の方が追加しやすくなります。
ブレークポイントを設定して値を確認する場合も、判定と代入が別の行にあれば、どの時点で想定と異なったのかを調べやすくなります。
条件式が長い場合は、判定に必要な値を先に変数へ代入し、If文が何を確認しているのかを読み取りやすくする方法もあります。
CSV取り込み処理を役割ごとに分ける例
CSV取り込みでは、ファイル確認、読み込み、内容の検証、シートへの出力、後処理が混ざりやすくなります。
- ValidateFilePathで対象ファイルの存在を確認する
- ReadCsvDataでCSVの内容を読み込む
- ValidateCsvDataで列数や必須項目を確認する
- WriteDataToSheetでワークシートへ出力する
- RestoreApplicationStateで画面設定などを元へ戻す
この構成なら、CSV形式が変わったときは読み込みと検証を中心に確認し、出力先が変わったときは書き込み処理を中心に確認できます。
分けること自体を目的にせず、変更する単位とテストする単位を一致させることが大切です。
すべてを一つのSubへ書くと、ファイルが見つからない場合の終了処理と、読み込み後のエラー処理が離れた場所へ追加されやすくなります。
役割ごとに分けておけば、ファイル確認だけを単独で動かし、想定したエラーメッセージになるかを確認できます。
読み込み結果を配列へ保持する設計では、ファイル処理とシート出力の間に検証処理を置きやすくなります。
後処理を独立させる場合は、正常終了と異常終了のどちらからでも実行される流れになっているかを確認します。
変数名・固定値・コメントを見直す例
曖昧な変数名、直接書かれた固定値、動作だけを説明するコメントは、個別では小さくても重なると理解を遅らせます。
| 観点 | 修正前 | 修正後 |
|---|---|---|
| 変数名 | x | departmentName |
| 行番号 | n | currentRow |
| 最終行 | lr | lastRow |
| シート名 | “集計”を各所へ直接記述 | SUMMARY_SHEET_NAMEへ集約 |
| コメント | B列を確認する | 部署未入力の行は集計対象外のため除外する |
コメントへ判断理由を残せば、条件を削除してよいか迷ったときに、業務上の意味を確認できます。
この見直しは動作へ影響しにくいため、大きなコードを改善するときの最初の手順として取り組みやすい方法です。
変数名を変更するときは、同じ変数を参照している箇所をすべて確認し、似た名前の別変数まで変更しないようにします。
固定値を定数へ移す場合は、同じ文字列が本当に同じ目的で使われているかを確認してからまとめます。
コメントを追加する前に、変数名やプロシージャ名を改善するだけで意図が伝わらないかを検討します。
コードの名前とコメントが同じ内容を繰り返している場合は、将来も残す必要がある理由だけをコメントへ置きます。
仕様変更や引き継ぎに強い設計へ近づける
読みやすさを保守性へつなげるには、通常時だけでなく、変更時と異常時の流れまで見える構成が必要です。
設計段階で変更されやすい部分と変わりにくい部分を分けると、修正する範囲を限定しやすくなります。
他の担当者へ渡す可能性があるコードでは、実行方法だけでなく、前提となるファイルやシートの条件も分かる状態にします。
コードを書く前に入力・処理・出力を整理する
いきなりVBEへ書き始めず、入力、処理、出力、例外時の動きを短い箇条書きで整理します。
CSV取り込みなら、対象ファイル、必要な列、除外条件、出力シート、既存データの扱いを先に決めます。
最初に全体を整理すると、どこをプロシージャとして分けるかも判断しやすくなります。
入力項目が不足している場合や、対象データが一件もない場合に、どの時点で終了するかも先に決めます。
出力後に元データを削除する処理がある場合は、失敗したときに元へ戻せるかを考えておく必要があります。
処理の流れを日本語で説明できない部分は、コードを書き始めても条件分岐が増えやすいため、仕様を確認してから実装します。
作成前の整理は時間がかかるように見えますが、途中で設計を組み直す回数を減らす効果が期待できます。
エラー処理と後処理を通常処理から分ける
ファイルが存在しない、必要な列がない、書き込み中にエラーが起きるなど、異常時の流れも設計へ含めます。
入力確認は早い段階で行い、条件を満たさない場合は主要処理へ進まない構成にします。
画面更新や計算方法を変更するマクロでは、途中で終了しても元へ戻せる後処理を用意します。
エラー処理では、利用者へ伝える内容と、開発者が確認したい内容を分けて考えます。
すべてのエラーを無視する書き方は原因を見えなくするため、想定できる異常だけを具体的に扱います。
エラー番号や発生した処理名を記録できると、利用者から報告を受けた後に原因を調べやすくなります。
後処理を一か所へまとめる場合は、エラー発生前に設定を変更していないケースでも安全に実行できる内容にします。
メッセージを表示して終了するだけではなく、開いているファイルや変更したExcelの設定が残っていないかも確認します。
正常終了と異常終了で共通する後処理を整理すると、同じ復旧コードを複数箇所へ書かずに済みます。
流用する処理と個別に残す処理を見極める
似たコードが複数ある場合でも、すぐに一つへ共通化するのではなく、今後も同じ理由で変更されるかを確認します。
同じ形式のCSVを読み込む処理は流用しやすい一方で、部署ごとに異なる集計条件は個別に残した方が理解しやすい場合があります。
共通化した処理へ条件分岐が増え続けると、一つの変更が複数機能へ影響する構造になります。
流用する基準は、見た目が似ていることではなく、役割と変更理由が同じことです。
共通部分と個別部分の境界が明確なら、再利用しながら影響範囲も把握しやすくなります。
一度だけ使う短い確認用マクロでは、将来利用を想定した過剰な共通化を行わない判断も必要です。
共通処理へ渡す引数が増え続ける場合は、異なる役割を無理に一つへまとめていないか見直します。
二つの処理が現在は似ていても、今後別々の仕様変更が予定されているなら、個別に残した方が修正しやすいことがあります。
共通化するときは、呼び出し元が処理内容を知らなくても、プロシージャ名と引数から用途を理解できる形を目指します。
既存コードを流用する場合は、元の業務だけで必要だった例外条件が残っていないかを確認します。
読みやすさを意識するときの失敗と注意点
改善策は多く適用すればよいわけではなく、読むための移動や確認を増やさない範囲で使う必要があります。
読みやすさには一つの正解があるわけではないため、利用期間、修正頻度、共有人数に合わせて調整します。
改善後に以前より説明が難しくなった場合は、分割や命名をやりすぎていないか見直します。
長い変数名や細かすぎる処理分割を避ける
変数名へ情報を詰め込みすぎると、一行が長くなり、重要な違いを見つけにくくなります。
名前には、対象、役割、必要に応じた単位を含め、処理内容のすべてを説明しようとしないことが大切です。
プロシージャも細かく分けすぎると、数行読むたびに別の場所へ移動する必要があります。
独立した変更やテストができない小さな処理は、元の役割の中へ残した方が理解しやすい場合があります。
分割後にMainだけを見て全体の流れが分かり、各処理の名前から詳細を予測できる状態が理想です。
読みやすさは行数やプロシージャ数では測れないため、第三者が迷わずたどれるかで確認します。
同じ単語を何度も含む長い変数名では、名称の後半にある違いを見落としやすくなる場合があります。
プロジェクト内で共通する前提は毎回名前へ入れず、区別に必要な情報だけを残すと読みやすくなります。
プロシージャを分けた後に、呼び出し元と呼び出し先を何度も往復しなければ処理を理解できない場合は、分割単位を見直します。
レビュー時には、一つのプロシージャの長さではなく、その中に異なる変更理由を持つ処理が混在していないかを確認します。
コメントの増やしすぎと更新漏れに注意する
コメントを増やしすぎると、コードより説明の方が長くなり、本当に重要な注意点が埋もれます。
変数への代入や単純な繰り返しなど、コードを見れば分かる内容は原則として説明しません。
仕様上の理由、例外条件、外部データの制約、変更してはいけない順序を優先して残します。
コードを修正した後にコメントを更新し忘れると、説明が誤った案内になり、コメントがない状態より危険です。
関連する処理の近くへコメントを置き、変更時に同時確認できるようにします。
レビューでは、コメントの量ではなく、現在の処理と一致しているかを確認します。
長い説明が必要な仕様は、すべてをコード内へ書くのではなく、別の資料へ整理し、参照先だけを明確にする方法もあります。
一時対応を示すコメントは放置されやすいため、見直す条件や期限が分かる情報を残します。
処理を削除した後に関連コメントだけが残ることもあるため、不要なコードを整理するときは周辺の説明も確認します。
コメントへ書いた理由が現在も有効か判断できない場合は、業務担当者へ確認してから変更します。
読みやすさと処理速度は分けて確認する
行数を増やしたから遅くなる、短くしたから速くなるとは限りません。
処理速度は、セルへのアクセス回数、繰り返し回数、ファイル入出力、計算や画面更新などの影響を受けます。
読みやすさを改善した後も、時間が重要な処理は実際のデータ量で動作時間を確認します。
高速化のために複雑な書き方を採用する場合は、効果を測定し、理由をコメントとして残します。
計測できる改善と、見た目だけの短縮を区別しなければなりません。
まず正しく読みやすい構成を作り、必要な箇所だけを根拠に基づいて調整する順番が安全です。
少量のデータでは差が見えなくても、実務で扱う最大件数では処理時間が大きく変わる場合があります。
速度を比較するときは、同じデータ、同じ条件、同じExcel設定で実行し、別の要因が混ざらないようにします。
読みやすくするために処理を分けた後でも、同じセルへ何度もアクセスしている部分が残っていれば、速度面の改善は別に検討します。
高速化したコードが複雑になりすぎる場合は、得られる時間短縮と将来の修正負担を比較して採用を判断します。
実務で使える読みやすさチェックリスト
作成前、レビュー時、引き継ぎ前で確認項目を分けると、読みやすさを感覚ではなく具体的に点検できます。
すべての項目を形式的に確認するのではなく、そのコードの利用期間と変更頻度に合わせて重点を決めます。
定期的に使うマクロでは、修正履歴や問い合わせ内容を確認し、実際に迷いやすかった箇所を次のレビューへ反映します。
コードを書く前に確認すること
実装前には、何を受け取り、どの条件で処理し、どこへ出力するのかを整理します。
正常時だけでなく、入力不足、ファイル不存在、対象データなしの場合の動きも決めます。
処理の大きな流れを一文ずつ並べ、各項目が一つの役割になっているか確認します。
固定値として管理する情報と、利用者が変更する情報を分けます。
同じ処理を別の業務でも使う可能性があるかを確認し、必要な範囲だけ共通化します。
ここで曖昧な部分が残る場合は、コードではなく仕様を先に確認します。
入力データの形式や文字コードなど、外部ファイルに依存する条件も実装前に確認します。
既存データを上書きするのか追記するのかを決め、再実行した場合に結果が重複しないかを考えます。
処理を途中で中止した場合に、作業中のデータやExcelの設定がどの状態で残るかも整理します。
利用者が選択する項目とコード側で固定する項目を分けると、変更時に確認する場所を判断しやすくなります。
コードレビューで確認すること
レビューでは、作者の説明がなくても、変数名とプロシージャ名から役割を予測できるか確認します。
一行に複数の処理が混ざっていないか、条件分岐の範囲を目で追えるかも確認します。
同じ固定値や同じ処理が散らばっていないかを探し、変更箇所を限定できるか判断します。
コメントは理由や制約を説明しているか、現在のコードと一致しているかを確認します。
エラー時にどこで終了し、変更した設定をどこで元へ戻すのかも確認します。
指摘するときは短いか長いかではなく、修正時に迷う具体的な理由を伝えます。
通常のデータだけでなく、空欄、重複、想定外の形式を含むデータでも処理の流れを追えるか確認します。
プロシージャ間で共有される変数が多い場合は、どこから値が変更されるのかを把握できるか確認します。
同じ名前で異なる意味の変数が使われていないか、似た処理へ異なる命名がされていないかも見直します。
レビュー結果は好みの違いだけで終わらせず、変更や調査の時間を減らせるかという観点で整理します。
未来の自分や担当者へ渡す前に確認すること
引き継ぎ前には、半年後の自分が見ても、処理の目的、入力、出力、主な例外を説明できるか確認します。
仕様変更が起きたときに、どのプロシージャと定数を確認すればよいかを示せる状態にします。
利用するシート、ファイル、列、保存先などの前提がコードまたは補足資料で分かるようにします。
動作確認に使った代表的な条件と、対象外になる条件も残します。
一時的なデバッグ処理、不要なコメント、使われていない変数は削除します。
実行手順だけでなく、処理が失敗した場合に確認する場所や、やり直す前に注意する点も伝えます。
外部ファイルの保存場所や名前に規則がある場合は、コード内の設定箇所とあわせて説明します。
担当者が変更してよい値と、変更すると他の処理へ影響する値を区別できるようにします。
引き継ぎ相手に一度コードを読んでもらい、説明なしでは分からなかった部分を修正すると、実際の読みやすさを確認できます。
| 確認時期 | 主な確認項目 |
|---|---|
| 作成前 | 入力、処理、出力、異常時の流れが決まっている |
| レビュー時 | 名前、処理単位、固定値、コメント、エラー処理が追える |
| 引き継ぎ前 | 目的、前提、修正箇所、影響範囲を説明できる |
チェックリストは完成後だけに使うのではなく、機能を追加するたびに確認すると、読みにくさが積み重なることを防ぎやすくなります。
すべてに合格することを目的にせず、次の修正で迷いそうな箇所を一つずつ減らすために使います。
VBAコードの読みやすさに関するよくある疑問
よくある疑問を判断基準とともに整理すると、短縮や分割をやりすぎず、必要な改善へ集中できます。
読みやすさはコードの長さだけで決まらないため、修正頻度、共有範囲、処理の複雑さを合わせて判断します。
試作段階と長期運用段階では必要な設計が異なるため、利用目的に合った範囲で改善します。
コードは短い方が処理も速くなる?
コードの行数と処理速度は、単純には一致しません。
同じ処理を複数行へ分けても、実行する内容がほぼ同じなら、体感できる差が出ない場合があります。
速度を改善したいときは、セルアクセス、繰り返し、ファイル処理など、時間を使っている箇所を測定します。
短く見せることではなく、重い処理を減らせたかで判断します。
一行へまとめた処理でも、同じセルを何度も参照していれば、行数が少なくても時間がかかることがあります。
反対に、処理を複数のプロシージャへ分けても、実行回数や処理内容が同じなら、読みやすさだけを改善できる場合があります。
高速化を目的に書き換えるときは、変更前後の時間を測り、どの修正が効果へつながったかを確認します。
読みやすさを犠牲にする最適化は、十分な効果が確認できる箇所だけに限定した方が保守しやすくなります。
コメントは多いほど読みやすくなる?
コメントは多さではなく、コードだけでは分からない理由を伝えられるかが重要です。
単純な動作をすべて説明すると、読む量が増え、重要な注意点を見落としやすくなります。
仕様上の制約、例外条件、変更理由を優先し、処理変更時には内容も更新します。
コメントを削除しても意図が伝わるなら、名前や構造で説明できている可能性があります。
一行ごとに動作説明を書くより、処理のまとまりの前に目的や業務上の理由を書く方が役立つ場合があります。
コメントがないと理解できないほど複雑な条件式は、条件を変数へ分けるなど、コード自体を読みやすくできないか検討します。
過去の修正履歴をすべてコメントへ残すと現在の処理が見えにくくなるため、必要な理由だけを整理して残します。
コメントを追加した後は、初めて読む人が誤解しない表現になっているかを確認します。
プロシージャは何行で分ければよい?
分割の基準を行数だけで決めると、短い処理が増えすぎたり、長い処理が残ったりします。
一つのプロシージャが一つの役割を持ち、その役割を名前で説明できるかを基準にします。
変更理由が異なる処理や、単独で確認したい処理は分ける価値があります。
移動先を増やすだけで理解が速くならない場合は、分けずに残す判断も必要です。
入力確認とデータ出力のように、変更される理由が異なる処理は、行数が少なくても分けると保守しやすくなります。
同じ役割の中で連続して行う処理を細かく分けると、全体を理解するための移動が増える場合があります。
プロシージャ名が長い説明文にならないと役割を表せない場合は、複数の目的が混ざっていないか確認します。
分割後はMainとなる処理を読み、業務の流れを上から順に説明できるか確認します。
既存の長いコードはどこから直せばよい?
最初に現在の動作を確認し、可能なら代表的な入力と結果を記録します。
次に、変数名、改行、インデント、固定値の定数化など、処理結果を変えにくい部分から直します。
その後で、役割が混ざっている箇所をプロシージャへ分け、各段階で同じ結果になるか確認します。
大きなコードを一度に書き換えず、小さな変更と動作確認を繰り返す方法が安全です。
頻繁に修正している箇所や、不具合が起きたときに毎回読み直している箇所から始めると、改善効果を感じやすくなります。
使われていない変数や到達しない処理を見つけても、すぐ削除せず、現在の仕様で本当に不要かを確認します。
構造を変える前に、処理の入口と出口、共有変数、外部ファイルへの依存を整理すると影響範囲を把握しやすくなります。
一つのh2に相当する役割や、一つの業務工程に相当する範囲で区切って見直すと、作業途中でも元の状態へ戻しやすくなります。
まとめ|読みやすいコードは修正時間を減らす土台になる
読みやすいVBAコードは、未来の修正、仕様変更、引き継ぎで迷う時間を減らすための土台になります。
短いコードを否定するのではなく、読み手が迷わず理解できる範囲で簡潔に書くことが重要です。
長く使うマクロほど、作成時の数分より、その後の修正や確認で積み重なる時間を意識する必要があります。
最初は変数名と1行1処理から見直す
既存コードの改善では、意味の伝わる変数名へ変え、一行に複数の処理を置かないことから始めます。
この二つは動作へ影響しにくく、コードの目的と変更箇所を見つけやすくする効果があります。
次に、固定値の定数化、理由を残すコメント、役割ごとの処理分割へ進みます。
変更するたびに同じ結果になるか確認し、読みやすさの改善と不具合の混入を分けて管理します。
一度に完成形を目指すのではなく、修正するたびに少しずつ整える方法が続けやすい進め方です。
変数名を見直すだけでも、代入元まで戻らずに処理を読める箇所が増えます。
一行の処理を分けると、どこへ条件やログを追加すればよいかを判断しやすくなります。
小さな改善で効果を確認できたら、変更頻度の高いプロシージャから構造の見直しへ進みます。
改善前後の結果を比較する習慣を付けると、読みやすくする作業と機能変更を混同せずに進められます。
半年後の自分が理解できるかを基準にする
最終的な判断基準は、事情を忘れた自分が読んでも、目的と処理順序を説明できるかどうかです。
短く書けた満足感より、変更する場所を見つけ、影響範囲を判断し、安心して直せることを優先します。
チームで共有するコードでは、作者以外が説明なしで読めることが、保守性をさらに高めます。
一時的な確認コードには過剰な設計を行わず、長く使うコードや引き継ぐコードへ重点的に改善を適用します。
未来の自分と担当者を助ける意識を持つことで、VBAのコードは単に動くものから、修正し続けられる資産へ変わります。
半年後に読んだとき、変数名から値の意味が分かり、Mainの処理から全体の流れを説明できれば、読みやすさを意識した効果が表れています。
反対に、コメントを読んでも条件の理由が分からず、固定値の変更箇所を検索しなければならない場合は、まだ改善できる余地があります。
読みやすさは一度整えたら終わりではなく、仕様変更のたびに分かりにくい部分が増えていないか確認する必要があります。
自分以外の人が迷った場所は、未来の自分も迷う可能性が高いため、次の修正で優先して整えるべき箇所です。