VBAで短絡評価の代替を補助変数SelectCaseGoSubで書く

VBAで短絡評価の代替を補助変数SelectCaseGoSubで書く

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

VBAには、他の言語でいう短絡評価の演算子がありません。

つまり、a And b と書いたときに、a が偽だから b を評価しない、という書き方をそのまま期待することはできません。

この記事では、VBAで短絡評価に近い処理を書くための3つの代替案を整理します。

本記事の対象とゴール

  • VBAで AndAlso や OrElse のような短絡評価が欲しい人

  • 条件式の副作用やエラーを避けたい人

  • ネストした If をどう読みやすくするか悩んでいる人

先に結論

VBAで短絡評価を代替する代表案は、次の3つです。

  1. And 相当は補助変数で表す

  2. Or 相当は Select Case True で表す

  3. 分岐後の処理が重複するなら GoSub でまとめる

どれが常に正解というより、条件評価と処理の重複を分けて考えることが大切です。

<!-- LWP_REWRITE_EXPANSION_記事107 -->

1. VBAには短絡評価がない

VBAの And と Or は、一般的な短絡評価とは違い、両辺が評価されます。そのため、左側で安全性を確認し、右側で値へアクセスするような書き方をすると、右側でエラーになることがあります。

たとえば、オブジェクトが Nothing でないことを確認してからプロパティを見る、という書き方は他言語では自然です。しかしVBAでは、条件式の両側が評価される前提で設計する必要があります。

2. 補助変数で段階を分ける

短絡評価の代替として有効なのは、判定を段階に分けることです。まず安全に評価できる条件だけを確認し、その結果を補助変数へ入れます。次に、その補助変数を見て、次の判定へ進みます。

この書き方は少し冗長ですが、どの条件で止めるのかが明確になります。実務コードでは、短さよりも、異常時にどこで止まったか分かることが重要です。

3. Select Case と GoSub の扱い

Select Case や GoSub を使った整理は、状態を段階的に処理する考え方として読むと分かりやすくなります。ただし、GoSub は古い構文であり、現代のVBAでは関数分割で代替できる場面も多いです。

大切なのは、短絡評価がないことを前提に、安全確認と本処理を分けることです。表現方法は、補助変数、早期終了、関数分割のいずれでも構いません。

1. And相当を補助変数で書く

a が真のときだけ b を評価したい場合、補助変数を使います。

Dim a_and_b As Boolean
a_and_b = False
If a Then
    If b Then
        a_and_b = True
    End If
End If
If a_and_b Then
    ' a も b も真のときの処理
Else
    ' それ以外の処理
End If

この形なら、a が偽のときに b を評価しません。

条件式の中で関数呼び出しがあり、呼び出すとエラーになる可能性がある場合に安全です。

2. Or相当をSelect Case Trueで書く

a または b が真なら処理したい場合は、Select Case True が使えます。

Select Case True
    Case a, b
        ' a または b が真のとき
    Case Else
        ' どちらも偽のとき
End Select

ただし、Case a, b の評価順や副作用には注意が必要です。評価自体を完全に制御したいなら、素直に If をネストした方が安全です。

Select Case True は、条件を列挙して読みやすくしたいときの選択肢として考えます。

3. GoSubで処理の重複を避ける

分岐が複雑になると、同じ処理を何度も書きたくなることがあります。

その場合は、GoSub で処理をまとめる方法もあります。

If a Then
    If b Then
        GoSub proc1
    Else
        GoSub proc2
    End If
Else
    GoSub proc2
End If
Exit Sub
proc1:
    ' a も b も真のとき
    Return
proc2:
    ' それ以外のとき
    Return

GoSub は古い構文ですが、短い処理の局所的な分岐整理には使える場面があります。

ただし、濫用すると流れが追いにくくなります。処理が大きくなるなら、SubやFunctionへ分けた方がよいです。

短絡評価が欲しくなる場面

短絡評価が欲しくなるのは、後続条件を評価すると危険な場合です。

If Not obj Is Nothing Then
    If obj.Enabled Then
        ' obj が存在し、Enabled が真のとき
    End If
End If

このように、前提条件を確認してから次の条件を見る形は、VBAでは素直にネストして書くのが安全です。

まとめ

VBAには短絡評価演算子がないため、条件式を一行に押し込むより、評価順を明示した方が安全です。

And 相当は補助変数、Or 相当は Select Case True、処理重複は GoSub またはSub/Function化で整理できます。

大事なのは、条件を短く見せることではありません。

どの条件を先に評価し、どの条件は前提が満たされたときだけ評価するのかを、コード上で明確にすることです。

出典メモ- 元Posfie URL: https://posfie.com/@hoehoe1234/p/omThVu7

  • 元Posfieタイトル: 2022-03-15 VBA 短絡演算子の代替3案

  • 投稿者: hoehoe1234

  • 投稿数: 3

  • 画像確認: 画像なし

  • 取得・確認日: 2026-06-11