VBAで複数の条件をチェックする処理は、Flag変数(Boolean型)を使うとIf文のネストを避けてスッキリ書けます。「すべて満たしたらOK」「1つでもNGならストップ」という判断ロジックを、1つの変数にまとめることでコードの見通しが格段によくなります。
この記事では、次の内容を順番に解説します。
- Flag変数の基本的な考え方と使い方
- 「すべての条件を満たしたらOK」パターン
- 「1つでも当てはまったら中止」パターン
- 複数のフラグを組み合わせる応用パターン
- If And条件との使い分け
Flag変数の基本を理解するには?
Flag変数とは「ある状態が成立しているかどうか」を True / False で記録しておくための変数です。Boolean 型で宣言し、条件チェックの結果を積み上げていくことで、最後に1か所だけで判断を下せる構造を作れます。
| パターン | 初期値 | 条件に当てはまったとき | 最終判断 |
|---|---|---|---|
| すべて満たしたらOK | True(問題なし前提) | 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が初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



