VBAで複数条件をFlag変数(Boolean)でまとめる方法|If And条件との使い分けと実務パターン

VBAで複数の条件をチェックする処理は、Flag変数(Boolean型)を使うとIf文のネストを避けてスッキリ書けます。「すべて満たしたらOK」「1つでもNGならストップ」という判断ロジックを、1つの変数にまとめることでコードの見通しが格段によくなります。

この記事では、次の内容を順番に解説します。

  • Flag変数の基本的な考え方と使い方
  • 「すべての条件を満たしたらOK」パターン
  • 「1つでも当てはまったら中止」パターン
  • 複数のフラグを組み合わせる応用パターン
  • If And条件との使い分け

Flag変数の基本を理解するには?

Flag変数とは「ある状態が成立しているかどうか」を True / False で記録しておくための変数です。Boolean 型で宣言し、条件チェックの結果を積み上げていくことで、最後に1か所だけで判断を下せる構造を作れます。

パターン初期値条件に当てはまったとき最終判断
すべて満たしたらOKTrue(問題なし前提)False に変えるTrue のままならOK
1つでも当てはまったら中止False(問題なし前提)True に変えるTrue になっていたら中止

すべての条件を満たしたときだけ処理するには?

「名前・数値・日付のすべてが正しい行だけOKにする」という例です。最初に flg = True(問題なし前提)とし、条件に引っかかるたびに False に変えます。最後に flg がまだ True ならすべてクリアしたと判断します。

Sub CheckAllConditions()

    Dim ws  As Worksheet
    Dim i   As Long
    Dim flg As Boolean

    Set ws = ActiveSheet

    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

        flg = True   '最初はOKの前提でスタート

        '条件1:名前が空欄ならNG
        If ws.Cells(i, 1).Value = "" Then flg = False

        '条件2:数値が100未満ならNG
        If ws.Cells(i, 2).Value < 100 Then flg = False

        '条件3:日付が今日より未来ならNG
        If ws.Cells(i, 3).Value > Date Then flg = False

        '最終判断
        If flg Then
            ws.Cells(i, 4).Value = "OK"
        Else
            ws.Cells(i, 4).Value = "NG"
        End If

    Next i

    MsgBox "チェックが完了しました。"

End Sub

条件が何個に増えても「If 〇〇 Then flg = False」を追加するだけで対応できます。If文のネストが深くなることなく、構造がフラットなまま維持できます。

1つでも条件に当てはまったら処理を止めるには?

事前チェックで「どれか1つでもNGなら実行しない」という処理には、初期値を False(問題なし)にして、NGになったら True に変えるパターンを使います。

Sub EarlyCheckStop()

    Dim flg As Boolean
    flg = False   '警告なし前提

    '条件1:Sheet1のA1が空欄
    If Sheets("Sheet1").Range("A1").Value = "" Then flg = True

    '条件2:Sheet2のB2が数値でない
    If Not IsNumeric(Sheets("Sheet2").Range("B2").Value) Then flg = True

    '条件3:Sheet3のC3が0以下
    If Sheets("Sheet3").Range("C3").Value <= 0 Then flg = True

    '1つでも当てはまったら中断
    If flg Then
        MsgBox "入力内容に問題があります。処理を中止します。", vbExclamation
        Exit Sub
    End If

    '全条件OKなら続行
    MsgBox "チェック完了。処理を開始します。", vbInformation

End Sub

複数のフラグを組み合わせるには?

「エラーがあるかどうか」と「警告があるかどうか」を別々に管理したい場合など、フラグを複数に分けて使うと用途ごとに制御できます。

Sub CheckWithMultipleFlags()

    Dim ws         As Worksheet
    Dim i          As Long
    Dim hasError   As Boolean   'エラーフラグ
    Dim hasWarning As Boolean   '警告フラグ

    Set ws = ActiveSheet

    For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

        hasError   = False
        hasWarning = False

        '空欄はエラー
        If ws.Cells(i, 1).Value = "" Then hasError = True

        '数値が500〜1000の範囲外は警告
        Dim v As Double
        v = ws.Cells(i, 2).Value
        If v < 500 Or v > 1000 Then hasWarning = True

        '結果を出力
        If hasError Then
            ws.Cells(i, 3).Value = "エラー"
        ElseIf hasWarning Then
            ws.Cells(i, 3).Value = "要確認"
        Else
            ws.Cells(i, 3).Value = "正常"
        End If

    Next i

    MsgBox "チェックが完了しました。"

End Sub

Flag変数とIf And条件はどう使い分けるには?

「すべての条件を満たしたら処理する」という処理はAndで1行にまとめることもできます。ただし、条件が増えると読みにくくなるため、使い分けの目安を持っておくと便利です。

状況おすすめの方法理由
条件が2〜3つでシンプルAnd条件1行で読みやすく書ける
条件が4つ以上Flag変数条件の追加・削除が容易で見通しがよい
条件ごとに異なるメッセージを出したいFlag変数どの条件でNGになったか特定しやすい
複数のフラグを並行して管理したいFlag変数(複数)エラー・警告などを区別できる

まとめ

  • Flag変数は Boolean型 で宣言し、条件チェックの結果を True / False で積み上げる仕組み
  • 「すべて満たしたらOK」は 初期値 True → NGで False に変える → 最後に True か確認
  • 「1つでも当てはまったら中止」は 初期値 False → NGで True に変える → 最後に True なら中断
  • 条件が増えても「If 〇〇 Then flg = False」を追加するだけでよく、ネストが深くならない
  • 条件が4つ以上・条件ごとにメッセージを出したい場合は And条件よりFlag変数 の方が管理しやすい

よくある質問

「フラグ」という名前じゃないとダメですか?

いいえ、どんな名前でも動きます!ただ、慣習として flg と付けることが多いです。自分ひとりで使うなら、今回の例のように OKスイッチ や チェック結果 といった日本語の名前にすると、後で読み返したときに分かりやすいですよ。

Boolean(ブーリアン)型って、数字じゃダメなんですか?

0(ダメ)か 1(OK)という数字で管理しても動きますが、できるだけ Boolean型 を使いましょう。理由は「これは計算用じゃなくて、OKかNGかを判断するための特別な箱ですよ」と自分に言い聞かせるためです。コードに「意味」を持たせることが、ミスを減らす近道です。

どこがダメだったかも教えてあげたいです

その場合は、フラグと一緒に「メッセージ用の箱」を使いましょう。たとえば Dim メッセージ As String という箱を用意して、ダメだったときに メッセージ = メッセージ & "名前が空です!" と文字を付け足していけば、最後に詳しい理由を教えてあげることができます。

If And(イフ・アンド)で1行にまとめるのと、どっちがいい?

チェックする項目が2つくらいなら If A="OK" And B="OK" Then と1行で書いてもOKです。でも、項目が3つ4つと増えてきたら、フラグ変数に分けましょう。1行が長すぎるとミス探しが大変になりますが、フラグ変数なら「どのIf文で引っかかったか」を1つずつ確認できるからです。

「スイッチを戻す」のを忘れそうです

これが一番多いミスです!たくさんのデータを1つずつ調べる時は、「次のデータの調査を始める前に、必ず合格(True)に戻す」という作業が必要です。上のコード例のように、繰り返し(For)のすぐ内側で OKスイッチ = True と書くクセをつけましょう。


動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール