こんにちは!VBAの基本をマスターし、「そろそろワンランク上のコードが書きたいな」と意気込んでいるあなたへ。
マクロの記録から一歩踏み出し、自分でコードを書くようになると、避けて通れないのが「条件分岐(If文)」ですよね。
「もし〇〇なら、かつ〇×なら、その上で……」なんて条件を重ねていくうちに、気づけばコードの右側がどんどん深くなっていき、画面からはみ出すほどの「大仏のような階段(ネスト)」になってしまった経験はありませんか?
今回は、そんな複雑なIf文のネストを綺麗さっぱり解消し、プロの現場でも愛用されている「早期リターン(ガード節)」という極上のテクニックを伝授します。
ここをクリアすれば、あなたのVBAスキルは一段と洗練されますよ。さあ、一緒に扉を開けましょう!
—
1. 誰もが通る道:「右肩上がり地獄(深いネスト)」の恐怖
まずは、よくある「やってしまいがち」なコードを見てみましょう。
例えば、「選択されているセルが空欄ではなく、数値であり、かつ100以上の場合にのみ処理を実行する」というマクロを書いたとします。
Sub CheckValue_Bad()
‘ — 悪い例:右に深く潜っていくIf文のネスト —
If ActiveCell.Value <> “” Then
If IsNumeric(ActiveCell.Value) Then
If ActiveCell.Value >= 100 Then
‘ 【本丸の処理】
ActiveCell.Interior.Color = RGB(255, 255, 0)
MsgBox “条件クリア!処理を実行しました。”, vbInformation
Else
MsgBox “値が100未満です。”, vbExclamation
End If
Else
MsgBox “数値ではありません。”, vbCritical
End If
Else
MsgBox “セルが空欄です。”, vbCritical
End If
End Sub
……どうでしょうか。
「本当にやりたいメインの処理」が、一番奥のインデント(字下げ)の中に埋もれていますよね。条件が増えるたびに `End If` を探す旅に出なければならず、保守性は最悪です。これが、いわゆる「可読性の低いコード」の正体です。
—
2. 救世主あらわる!「早期リターン(ガード節)」の概念
ここで登場するのが「早期リターン(Early Return)」、別名「ガード節(Guard Clauses)」です。
考え方はとてもシンプル。
「メインの処理を進める前に、まずは『例外エラー』や『処理対象外のケース』を先にチェックし、該当したら即座に処理を中断(Exit Sub)して追い返す」という手法です。
警備員(ガード)が入口で「おっと、身分証がない人は入れません!」と門前払いするイメージですね。これによって、メインの処理は一切インデントせず、まっすぐフラットに書くことができるようになります。
—
3. 実践!VBAコードを美しく書き換える
先ほどの「右肩上がり地獄」のコードを、ガード節を使って華麗にリファクタリング(書き換え)してみましょう。
Sub CheckValue_Good()
‘ — 良い例:ガード節による早期リターン —
Dim targetCell As Range
Set targetCell = ActiveCell
‘ 1. 【ガード節】セルが空欄なら即終了
If targetCell.Value = “” Then
MsgBox “セルが空欄です。”, vbCritical
Exit Sub
End If
‘ 2. 【ガード節】数値でなければ即終了
If Not IsNumeric(targetCell.Value) Then
MsgBox “数値ではありません。”, vbCritical
Exit Sub
End If
‘ 3. 【ガード節】100未満なら即終了
If targetCell.Value < 100 Then
MsgBox "値が100未満です。", vbExclamation
Exit Sub
End If
' ==========================================
' 【本丸の処理】
' ここに到達した時点で、すべての条件クリアが保証されている!
' ==========================================
targetCell.Interior.Color = RGB(255, 255, 0)
MsgBox "条件クリア!処理を実行しました。", vbInformation
End Sub
この書き換えの何が素晴らしいのか?
1. メイン処理が左端にいる: 本当に実行したい処理が、余計な `If` に邪魔されず一番下にドンと構えているため、一目で「何をするマクロなのか」が分かります。
2. 条件とエラーメッセージがセットで分かりやすい: 「この条件に引っかかったら、このメッセージを出して終わる」というルールが上から順に綺麗に整理されています。
3. バグの温床を断てる: 複雑な `Else` の対応関係に悩むことがなくなるため、メンテナンス時のミスが劇的に減ります。
—
4. 初学者が陥りやすい罠と注意点
早期リターンは非常に強力ですが、VBAを書く上でいくつか知っておくべきポイントがあります。
- `Exit Sub` と `Exit Function` の使い分け
- Subプロシージャ(値を返さないマクロ)を途中で抜けるときは `Exit Sub` を使います。
- Functionプロシージャ(計算結果などを返す関数)を途中で抜けるときは、戻り値をセットしてから `Exit Function` を使います。
- 「オブジェクトの解放」忘れに注意
- `Set` ステートメントでメモリ上にワークシートやセル範囲を読み込んでいる場合、途中で `Exit Sub` する前にメモリの解放(`Set 〇〇 = Nothing`)が必要な複雑なコードを組むときは、ジャンプ先ラベル(`GoTo`)を使った終了処理パターンを検討することもあります。ただ、基本の単体マクロであれば `Exit Sub` で十分です。
—
まとめ:ここをクリアすれば、Excel VBAの基本はバッチリ!
今回は、If文のネストを解消する「早期リターン(ガード節)」について解説しました。
- 深いネストはコードの可読性を下げ、バグの元になる。
- 「例外やエラーの条件」を先に書き、`Exit Sub` で弾き返す(ガードする)。
- 条件をクリアした「メインの処理」を一番下にフラットに記述する。
この書き方を意識するだけで、あなたが書くVBAコードのクオリティは見違えるほどプロフェッショナルなものに進化します。現場で同僚に見せたとき、「おっ、できるな!」と思われること間違いなしです。
ぜひ、明日からのマクロ作成にこの「早期リターン」を取り入れてみてくださいね。あなたのVBAライフを心から応援しています!
