VBAのIf文入門:基本から実践まで

プログラミングでは、条件分岐によって「もし○○ならば◇◇する」というような条件分岐を実現できます。この記事では、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 > 0True(真)であれば、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になった条件のブロックを実行したら、以降のElseIfElseはスキップされ、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エディタでコードを実行する手順

VBA画面の開き方

(〖Excel〗VBA画面の開き方)まず、Excelの「開発」タブにあるVisual BasicボタンをクリックしてVBAエディタ(VBE)を開きます。開発タブが表示されていない場合は、Excelのオプションから開発タブを有効にする必要があります。(ショートカット: Alt + F11キーでもVBEを起動できます。)VBEが開いたら、メニューから挿入 > 標準モジュールを選んで新しいモジュールを挿入し、そのコードウィンドウに先ほどのサンプルコードをコピーしましょう。コードを入力できたら、エディタ上部の▶(実行)ボタンを押すか、F5キーを押してマクロを実行できます。すると、書いたコードが上から順に処理され、結果がExcel上に表示されます。 (〖Excel〗VBA画面の開き方)

コードの処理フローを追う

次に、例として「データのバリデーションを行う活用例」で示したValidateInputマクロの処理手順を追ってみます。ユーザーの入力に対して、コードがどのように分岐・動作するかを順番に解説します。

  1. 入力の取得: InputBoxが表示され、ユーザーがテキストボックスに値を入力します。OKボタンが押されると、その値が文字列としてuserInput変数に格納されます(キャンセルされた場合は空文字列が返ります)。
  2. 空入力のチェック: 最初のIf userInput = "" Thenで入力が空かを確認します。空文字列だった場合は条件がTrueとなり、メッセージを表示した後Exit Subでマクロを終了します。入力が空でなければ条件はFalseとなり、End Ifの次(次のチェック)へ進みます。
  3. 数値形式のチェック: 次のIf Not IsNumeric(userInput) Thenで入力が数値として解釈できるかを確認します。数字以外の文字が含まれている場合などIsNumericがFalseなら条件がTrueとなり、「数値を入力してください。」というメッセージを表示して終了します。ここでも、条件がFalse(すなわち入力が数値)なら処理は続行されます。
  4. 数値の範囲チェック: 3番目のIfではCInt関数で文字列を数値に変換したうえで、その値が0~100の範囲内かを確認します。範囲外であれば条件がTrueとなり、エラーメッセージを出して終了します。範囲内であればFalseとなり、最後のEnd Ifを抜けます。
  5. 最終処理: ここまで全てのチェックを通過できた場合(どの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文:初心者向けガイド | 縁紡ぐ)など。

上部へスクロール