Excel VBAでデータチェックや処理分岐を作成していると、「いくつかの条件を満たしたら処理する」「どれかひとつでも条件に当てはまったら中止する」といった複数条件の判断が必要になることがあります。
最初は If ~ Then を並べるだけでも済みますが、条件が3つ4つと増えてくると、コードが見づらくなり、正しく動いているか分かりにくくなることもあります。
そこで役立つのが「Flag変数(フラグ変数)」です。ひとつの変数に「条件を満たしているかどうか」の判断結果をまとめておくことで、コードがシンプルかつ明確になります。
今回は、Flag変数の基本的な使い方と、実務でよくあるパターンを紹介します。
Flag変数の基本的な使い方
次の例では、A列の名前・B列の数値・C列の日付に対して、それぞれチェックを行い、すべての条件を満たした場合に「OK」と表示する処理です。
Sub CheckData()
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の前提でスタート
' 名前が空欄ならNG
If ws.Cells(i, 1).Value = "" Then flg = False
' 数値が100未満ならNG
If ws.Cells(i, 2).Value < 100 Then flg = False
' 日付が今日より未来ならNG
If ws.Cells(i, 3).Value > Date Then flg = False
' 最終的な判断
If flg = True Then
ws.Cells(i, 4).Value = "OK"
Else
ws.Cells(i, 4).Value = "NG"
End If
Next i
End Sub
このように、flg という1つの変数を使って条件を積み重ねていくことで、条件が増えても処理の流れが把握しやすくなります。
コードのポイント
- 最初に
flg = Trueとしておく(前提を「すべて問題なし」に) - 各条件で問題があれば
flg = Falseに変更 - 最終的に
flgの状態を見て判断をまとめる
どれかひとつでも当てはまったら処理を中止したい場合
次のような「1つでも条件に当てはまったら、早めに処理を止めたい」ケースでは、flg = 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
' どれかに当てはまったら処理を中断
If flg = True Then
MsgBox "入力内容に問題があります。"
Exit Sub
End If
MsgBox "チェック完了!処理を続行します。"
End Sub
このように、先にまとめて条件を見てから、続行・中止を一括で判断できるようになります。
実装するメリット
Flag変数を使うことで得られる効果は非常に大きく、特に条件が多くなってくるほど、その効果が実感できます。
- 条件判定をひとつの変数にまとめることで、可読性が向上する
- 条件分岐が増えても、構造が整理されて見やすい
- 処理の成否を
True/Falseで明確に制御できる - 不具合の原因箇所を追いやすくなり、デバッグもしやすくなる
- 同じ変数で「最初に問題ない前提」や「途中で中止」の制御ができる
Flagは小さな仕組みですが、実務での安定性と可読性を大きく高める工夫のひとつです。
まとめ
条件が複雑になってきたとき、つい If ~ Then を並べてしまいがちですが、それでは後から見ると分かりづらく、保守性が下がってしまいます。
そんなときは「Flag変数」を導入することで、処理の成否を明確に整理し、コードをわかりやすく保つことができます。
- すべての条件をクリアしたら処理を実行
- どれかひとつでもNGなら処理を止める
このような判定ロジックは、Flagを使えばスッキリ書けます。これからのVBA開発で、ぜひ積極的に活用してみてください。
