VBAでコードを書いていると、動くには動くけれど「後から見直すと何をしているか分からない」「修正しにくい(スパゲッティコード)」という状態になりがちです。今回は、VBAコードを美しく、バグに強く、保守しやすい状態に生まれ変わらせるためのリファクタリング手法12選を解説します。
1. リファクタリングとは?
外部からの動作(結果)を変えずに、内部のコード構造を整理して読みやすく・手直ししやすくする作業のことです。「動けばいい」から一歩進んだ、プロのエンジニアへの必須スキルです。
2. 実践すべき12個のリファクタリング手法
(1) メソッドの抽出(プロシージャの分割)
一つの巨大な `Sub` プロシージャに何百行もコードを書くのは避けましょう。「1つのプロシージャは1つの役割」を原則に、処理を細かく分割して `Call` で呼び出す構造にします。
(2) コメントは「なぜ」を記述する
「何をやるか(例:A列に値を入れる)」「どうやるか(例:Loopで回す)」というコードを見れば分かることをコメントに書くのはNGです。「なぜこの処理が必要なのか(例:旧システムとの互換性を保つため)」という意図や背景を書き残しましょう。
(3) Arrayを、Objectにする
「配列の1番目はID、2番目が名前、3番目が年齢…」とインデックス番号で管理すると、後から項目の追加・変更があった時にバグの温床になります。自作クラスやDictionaryなどの Object(オブジェクト) を使って、意味のあるプロパティ名で管理しましょう。
(4) マジックナンバーを、コンスタント(定数)に置き換える
コード内に突然出てくる謎の数値(`If status = 3 Then` の `3` など)を「マジックナンバー」と呼びます。`Const` を使って意味の分かる定数名(`Const STATUS_COMPLETE As Long = 3`)に置き換えましょう。
(5) 条件判定を単純にする
何重にもネストした `If` 文(ガード clauses や早期リターン等)を見直し、複雑な条件式をシンプルに整理します。条件の複雑さはそのままバグの多さに直結します。
(6) ループをコントロールするフラグをなくす
ループを抜けるために `isFinished = True` のようなフラグ変数を用意するのではなく、適切なタイミングで Exit For / Exit Do や Exit Sub(return的役割) を利用して、スッキリとループ制御を行いましょう。
(7) エラーコードでの処理を、例外に置き換える
関数が成否を「戻り値の数値(例: 0や-1)」で返す古い設計ではなく、VBAの `Err.Raise` や `On Error` といった 例外機構 を使ってエラーを明確にハンドリングします。
(8) 変数の宣言を必須にする
VBAエディタの最上部に Option Explicit を必ず記述し、宣言していない変数の使用を強制的にエラーにします。タイポ(打ち間違い)によるバグを瞬時に防ぐための大前提です。
(9) 変数のスコープ(有効範囲)を最小限にする
どこからでも値を書き換えられる `Public` 変数やモジュールレベルの変数を乱用すると、プログラムの動きが追えなくなります。変数はできるだけプロシージャ内(ローカル変数)で宣言し、スコープを最小限に抑えるのが鉄則です。
(10) ループの判定位置を「前判定」に統一する
VBAの `Do...Loop` は前判定(`Do While...Loop`)と後判定(`Loop While`)のどちらも書けますが、混在させると「条件を満たさないのに1回実行されてしまう(後判定の罠)」などのバグに繋がりやすくなります。基本は条件を先に評価する前判定に統一し、コードの挙動を予測しやすくしましょう。
(11) 読みやすくなるなら GoTo も許容する
「`GoTo` は悪」と一概に言われがちですが、VBAにおけるエラーハンドリング(`On Error GoTo ErrorHandler`)や、多重ループを一気に抜けて安全な後片付け処理へジャンプさせるための適切な `GoTo` は、かえってコードをシンプルに読みやすくしてくれます。タブー視しすぎず、可読性が上がるなら実用的に活用しましょう。
(12) 関数の成否を戻り値で判断せず、異常時は例外を投げる
古いスタイルの関数で「成功したら0、失敗したら-1を返す」ような設計にすると、呼び出し側で毎回 `If ret <> 0 Then` のようなチェックが必要になりコードが冗長化します。異常時は `Err.Raise` で明確に例外を投げ、呼び出し側は `On Error` で受け止める設計に統一しましょう。
3. まとめ
リファクタリングを行うことで、コードの可読性が上がり、未来の自分や他の人がメンテナンスしやすくなります。「動くコード」から「美しいコード」へステップアップしていきましょう!