プログラミングでは、条件分岐によって「もし○○ならば◇◇する」というような条件分岐を実現できます。この記事では、VBA(Visual Basic for Applications)におけるIf
文の基本文法から実務的な活用例まで紹介します。
基本文法の解説
VBAにおけるIf
文は、条件式の真偽によって実行する処理を切り替えるための構文です。 (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)まずは、If
文の基本的な書き方と動作を確認しましょう。
If~Then の基本形
If
文の最もシンプルな形は「If 条件 Then」です。条件が満たされた場合に続く処理を実行し、満たされなければ何もせずに次の行へ進みます。 (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)
If 条件 Then
' 条件が真(True)の場合の処理
End If
上記のように書きます。例えば、変数x
が0より大きい場合にメッセージを表示する簡単な例は次の通りです。
Dim x As Integer
x = 5
If x > 0 Then
MsgBox "xは0より大きいです"
End If
条件式x > 0
がTrue(真)であれば、MsgBox
によるメッセージ表示が実行されます。条件式がFalse(偽)の場合は、If~End If
ブロック内の処理はスキップされ、後続のコードへ進みます (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)。なお、If
を使用するときは必ず対応するEnd If
で閉じる必要があります(閉じ忘れるとエラーになります) (初心者でもわかるExcelマクロ入門! Ifを使ったマクロの使い方をマスター | 4時間のエクセル仕事は20秒で終わる | ダイヤモンド・オンライン)。
If~Then~Else での条件分岐
If
文に**Else
節**を加えると、条件が満たされなかった場合の処理を指定できます。 (初心者でもわかるExcelマクロ入門! Ifを使ったマクロの使い方をマスター | 4時間のエクセル仕事は20秒で終わる | ダイヤモンド・オンライン)これにより、「条件がTrueなら~、Falseなら~」という二者択一の分岐処理が書けます。
If 条件 Then
' 条件がTrueの場合の処理
Else
' 条件がFalseの場合の処理
End If
例えば、変数score
の値で合否を判定する場合を考えてみます。score
が60以上なら合格メッセージを表示し、それ以外なら不合格メッセージを表示するには次のように書けます。
Dim score As Integer
score = 65
If score >= 60 Then
MsgBox "合格です!"
Else
MsgBox "不合格です。"
End If
上記の例では、条件式score >= 60
が真であれば「合格です!」と表示し、偽であれば「不合格です。」と表示します。Else
節を用いることで、条件を満たさない場合にも明示的に処理を指定できるため、どちらの場合でも必ず何らかの処理が実行される構造になります。 (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)
ElseIf を使った複数条件の分岐
さらに、ElseIf
句を使うと条件を追加して複数パターンに応じた処理分岐が可能です (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。ElseIf
は「もし最初の条件がFalseだったら、別の条件を評価し・・・」という形で順に条件をチェックしていきます (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)。構文は次のとおりです。
If 条件1 Then
' 条件1がTrueの場合の処理
ElseIf 条件2 Then
' 条件1がFalseで条件2がTrueの場合の処理
Else
' 上記いずれの条件もFalseの場合の処理
End If
ElseIf
は必要なだけ複数回使用でき、上から順に条件を判定します。最初にTrueになった条件のブロックを実行したら、以降のElseIf
やElse
はスキップされ、End If
の次へ抜けます (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)。もし全ての条件がFalseであれば、最後のElse
ブロックの処理が実行されます。 (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)
具体例として、テストの点数score
に応じて評価を変える場合を考えてみましょう (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。点数が90以上なら「優」、75以上なら「良」、60以上なら「可」、それ未満は「不合格」と表示するコードは以下のように書けます。
Dim score As Integer
score = 75
If score >= 90 Then
MsgBox "優"
ElseIf score >= 75 Then
MsgBox "良"
ElseIf score >= 60 Then
MsgBox "可"
Else
MsgBox "不合格"
End If
このように複数の条件を連ねることで、段階的な条件分岐を表現できます。実行時には上から順に条件を評価し、当てはまった箇所の処理だけが実行されます(この例ではscore=75
なので「良」が表示されます) (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。
条件分岐の処理フロー(例)
ElseIf
を含む条件分岐の流れを、簡単な例で表に整理してみましょう。以下は「条件1」「条件2」という2つの条件を持つIf~ElseIf~Else
構造において、各条件の真偽によってどのブロックが実行されるかを示したものです。
条件1の判定 | 条件2の判定 | 実行される処理ブロック |
---|---|---|
True(成立) | (※条件2は検査せず) | Thenブロックの処理を実行 |
False(不成立) | True(成立) | ElseIfブロックの処理を実行 |
False(不成立) | False(不成立) | Elseブロックの処理を実行 |
上の表のとおり、まず条件1を評価し、成立した場合はその時点で処理が確定します。条件1が不成立の場合に限り条件2の評価に進み、条件2が成立すればその処理を実行、不成立なら最後のElse
処理を実行します。これが基本的なIf~ElseIf~Else
による分岐処理の流れです。
実務的なサンプルコード
それでは、実際の業務で役立つIf
文の使用例を見てみましょう。ここでは、シンプルな例と、実務シナリオを想定した例の2つを紹介します。コードはVBAエディタにコピーして実行できます。それぞれのコードについて、後でステップごとに解説します。
シンプルなIf
文の例
まずは基本的なIf
/Else
の例です。変数に格納された数値に応じてメッセージを表示するマクロを作ってみます。
Sub CheckScore()
Dim score As Integer
score = 45 ' テストの点数
If score >= 60 Then
MsgBox "合格です!" ' 条件を満たす場合
Else
MsgBox "不合格です。" ' 条件を満たさない場合
End If
End Sub
このマクロCheckScore
では、変数score
の値が60以上かどうかをIf
文で判定し、結果に応じて**「合格です!」または「不合格です。」**というメッセージボックスを表示します。score
が例えば45の場合は条件がFalseなのでElse
側が実行され、「不合格です。」と表示されます。値を変えて試すことで、If
文の基本的な動作を確認できます。
データのバリデーションを行う活用例
次に、ユーザー入力の妥当性をチェックして処理を分岐する実践的な例を紹介します。ユーザーに数値入力を求め、入力が空か・数値でないか・範囲外かによってそれぞれエラーメッセージを出し、問題なければ処理を続行するマクロです。
Sub ValidateInput()
Dim userInput As String
userInput = InputBox("0~100の数値を入力してください:")
' ①空入力のチェック
If userInput = "" Then
MsgBox "入力が必要です。"
Exit Sub ' 処理を中断
End If
' ②数値かどうかチェック
If Not IsNumeric(userInput) Then
MsgBox "数値を入力してください。"
Exit Sub ' 処理を中断
End If
' ③数値の範囲チェック
If CInt(userInput) < 0 Or CInt(userInput) > 100 Then
MsgBox "入力値は0から100の範囲である必要があります。"
Exit Sub ' 処理を中断
End If
' ここまで全てのチェックを通過した場合のみ実行
MsgBox "入力された数値は " & userInput & " です。"
End Sub
このValidateInput
マクロでは、InputBox
でユーザーに入力を求めています。続く複数のIf
文で入力値を順番に検証し、各チェックで問題があればメッセージを表示してExit Sub
でマクロの処理自体を終了しています。例えば何も入力せずOKした場合は①の条件がTrueとなり「入力が必要です。」と表示して終了します。一方、適切な数値(例:50)が入力された場合は全てのIf
条件がFalseとなり、最後に入力値を確認するメッセージが表示されます。
このように複数の独立した条件チェックを行う場合、ElseIf
を使った一つの大きな条件分岐にするよりも、上記のように個別のIf
で早めに不正入力時の処理を抜けてしまう方が見通しが良くなります。 (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)(各チェックごとに処理が中断されるため、後続の無駄な評価も行わずに済みます。)実務では入力チェックやエラー検証の場面で頻出するパターンなので、ぜひ覚えておきましょう。
ステップごとの解説
それでは、上記サンプルコードがどのように動作するのか、処理の流れをステップごとに追ってみます。また、コードを実行するためのVBAエディタ上での操作手順も簡単に説明します。
VBAエディタでコードを実行する手順

(〖Excel〗VBA画面の開き方)まず、Excelの「開発」タブにあるVisual BasicボタンをクリックしてVBAエディタ(VBE)を開きます。開発タブが表示されていない場合は、Excelのオプションから開発タブを有効にする必要があります。(ショートカット: Alt + F11
キーでもVBEを起動できます。)VBEが開いたら、メニューから挿入 > 標準モジュールを選んで新しいモジュールを挿入し、そのコードウィンドウに先ほどのサンプルコードをコピーしましょう。コードを入力できたら、エディタ上部の▶(実行)ボタンを押すか、F5
キーを押してマクロを実行できます。すると、書いたコードが上から順に処理され、結果がExcel上に表示されます。 (〖Excel〗VBA画面の開き方)
コードの処理フローを追う
次に、例として「データのバリデーションを行う活用例」で示したValidateInput
マクロの処理手順を追ってみます。ユーザーの入力に対して、コードがどのように分岐・動作するかを順番に解説します。
- 入力の取得:
InputBox
が表示され、ユーザーがテキストボックスに値を入力します。OKボタンが押されると、その値が文字列としてuserInput
変数に格納されます(キャンセルされた場合は空文字列が返ります)。 - 空入力のチェック: 最初の
If userInput = "" Then
で入力が空かを確認します。空文字列だった場合は条件がTrueとなり、メッセージを表示した後Exit Sub
でマクロを終了します。入力が空でなければ条件はFalseとなり、End If
の次(次のチェック)へ進みます。 - 数値形式のチェック: 次の
If Not IsNumeric(userInput) Then
で入力が数値として解釈できるかを確認します。数字以外の文字が含まれている場合などIsNumeric
がFalseなら条件がTrueとなり、「数値を入力してください。」というメッセージを表示して終了します。ここでも、条件がFalse(すなわち入力が数値)なら処理は続行されます。 - 数値の範囲チェック: 3番目の
If
ではCInt
関数で文字列を数値に変換したうえで、その値が0~100の範囲内かを確認します。範囲外であれば条件がTrueとなり、エラーメッセージを出して終了します。範囲内であればFalseとなり、最後のEnd If
を抜けます。 - 最終処理: ここまで全てのチェックを通過できた場合(どの
If
条件もTrueにならなかった場合)に、最後の行のMsgBox
が実行されます。これにより「入力された数値は ○○ です。」というメッセージが表示され、マクロの処理が完了します。
以上のように、If
文による各条件チェックで問題がなければ次へ、問題があれば途中で処理終了、といった流れになっています。ElseIf
を使った場合でも基本的な流れは同様で、上から順に条件を判定し、該当するブロックの処理を実行したら分岐構造を抜けます (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)。
ベストプラクティス:If
文の書き方のコツ
最後に、VBAでIf
文を使う際のベストプラクティスや注意点をまとめます。コードの可読性や保守性を高めるために、以下のポイントに気を付けましょう。
- インデントをつけて読みやすく:
If~End If
ブロックの中身は字下げ(インデント)して記述するのが一般的です。インデント自体は文法上必須ではありませんが、ネストした構造も視覚的に分かりやすくなり、コードを見やすくする効果があります (初心者でもわかるExcelマクロ入門! Ifを使ったマクロの使い方をマスター | 4時間のエクセル仕事は20秒で終わる | ダイヤモンド・オンライン)。特に複数の条件分岐が入れ子になる場合は、インデントで対応関係をはっきりさせましょう。 - ネストは必要最小限に:
If
文は何段にもネスト(入れ子)にできますが、深くネストしすぎるとコードの追跡が困難になります (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。例えば、ElseIf
を使わずにIf
の中にさらにIf
を書くこともできますが、必要以上に入れ子構造にしない方が後々の可読性は向上します (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。どうしてもネストが深くなる場合は、ロジックを分割したりExit Sub
で早期リターンするなどして、ネストの深さを抑える工夫をしましょう。 ElseIf
の乱用に注意:ElseIf
は便利ですが、あまりに数が多くなると横に長い複雑な条件判定になりがちです (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)。先述のように、入力チェックなど**「ある条件では処理を中止」**する場合には、ElseIf
にせず個別のIf
で対処した方が理解しやすいケースもあります。状況に応じて適切に使い分けましょう。Select Case
の活用: 判定する条件が「特定の値に等しいかどうか」を多数比較するような場合(例えば点数による評価やメニューの選択肢分岐など)は、If
の多段ネストよりも**Select Case
構文**を使った方がすっきり書けます (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn)。Select Case
は一つの式の値に応じて分岐する構文で、可読性が高く複数条件の分岐に適しています。状況に応じてIf
と使い分けると良いでしょう。- 一行で書ける
If
文: VBAでは、実行文が1行だけの場合に限りThen
の後に処理を続けて1行で書くこともできます。しかし、可読性やデバッグの面から初心者のうちはブロック構造で書くことをお勧めします (If…Then…Else statement (VBA) | Microsoft Learn)。まずは基本形のIf~End If
で確実に動作を理解してから、一行形式の書き方に挑戦すると良いでしょう。
参考資料: VBA If...Then...Else
文の公式ドキュメント (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn) (If…Then…Else ステートメントを使用する (VBA) | Microsoft Learn),初心者向けの解説記事 (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ) (初心者でもわかるExcelマクロ入門! Ifを使ったマクロの使い方をマスター | 4時間のエクセル仕事は20秒で終わる | ダイヤモンド・オンライン) (VBAのIF文とIIF文:初心者向けガイド | 縁紡ぐ)など。