Excel マクロ・VBA

【VBA】If文を極める。基本から応用、よくあるエラーまで実例付きで解説

マクロ・VBAはルーティン的な業務を自動化し、作業効率を圧倒的に向上させるために非常に強力なツールです。

請求書の作成や在庫チェックなど、日常的に発生する繰り返し作業をVBAで自動化することで、毎日数時間かかっていた作業がワンクリックで完了したり、ミスの防止にもつながります。

本記事では、マクロを作るうえで避けては通れないIf文について解説していきます。

VBA初心者でも理解できるよう、If文の基本から応用までを具体例を交えてわかりやすく、詳しく解説しているので、ぜひ業務に活用してみてください。

VBAのIf文とは?基本の使い方

VBAを使うと、Excel業務を自動化して効率的に仕事を進めることができます。

例えば、ある条件を満たしている場合に特定の処理を行い、それ以外の場合には別の処理を実行する、といった制御が可能になります。

ExcelでもIf関数がありますが、If関数も非常に便利で習得必須の関数としてよく話題に挙げられますが、VBAのIf文も書き方が少し違うくらいで、基本的な考え方は同じです。

If文の基本構文

まず最初に、If文の基本構文を見てみましょう。

以下が、If文の基本構文です。

If 条件 Then
    ' 条件がTrueの場合に実行される処理
Else
    ' 条件がFalseの場合に実行される処理
End If
記述意味
If 条件 Thenここで指定された条件が「True」なら、その下に記述された処理が実行されます。条件式には数値や文字列の比較、セルの値を使用できます。
Elseもし条件が「False」であれば、Else以下の処理が実行されます。Elseを省略することも可能ですが、その場合は条件が「False」だった際に何も処理が行われません。
End IfIf文の終了を示す命令です。このEnd Ifがあることで、プログラムがどこで条件分岐の処理を終了するのかが明確になります。

Excelのセルを使ったIf文の記述例

次に、Excelのセルを使ったIf文の具体的な記述例を見ていきましょう。

Excel上で特定のセルに入力された値を元に処理を分岐させる場合、VBAで以下のように記述します。

Sub CheckPassFail()
    Dim score As Integer
    score = Range("A1").Value  ' セルA1の値を取得

    If score >= 50 Then
        Range("B1").Value = "合格"
    Else
        Range("B1").Value = "不合格"
    End If
End Sub
記述意味
Range("A1").ValueExcelのセルA1に入力された値を取得し、その値をscoreという変数に格納します。
If score >= 50 ThenA1の値が50以上であれば、セルB1に「合格」という文字列を出力します。
ElseA1の値が50未満の場合には、セルB1に「不合格」と表示します。
Range("B1").Value = "合格"この部分が、条件を満たした場合にセルB1に書き込む処理です。

このように、If文を使うことでExcelのセルに入力されたデータに基づいて処理を分岐させることで複雑な処理を実現することができます。

たとえば、成績表やデータのチェックリストなどに応用することができ、繰り返し作業を自動化することによって大幅な時間短縮が可能になります。

【初心者向け】VBAでよく使う条件分岐の例

VBAでは、特定の条件に応じて処理を切り替える「条件分岐」を活用することで、業務の自動化が一層効率的になります。

ここでは、VBAの初心者でもすぐに理解できるよう、基本的な条件分岐の使い方を具体的なコード例を交えながら解説します。

条件に応じてメッセージを表示するコード例

まずは、非常にシンプルな条件分岐の例として、特定の条件に基づいてメッセージを表示するコードを紹介します。

たとえば、セルに入力された数値が100以上の場合に「合格」と表示し、それ以下の場合に「不合格」と表示する場合は、以下のようにVBAコードを記述します。

Sub CheckResult()
    Dim score As Integer
    score = InputBox("点数を入力してください")  ' ユーザーに点数を入力させる

    If score >= 100 Then
        MsgBox "合格です!"
    Else
        MsgBox "不合格です。再チャレンジしましょう!"
    End If
End Sub
記述意味
InputBoxユーザーに対して点数を入力させるダイアログボックスを表示します。ユーザーが入力した値はscoreという変数に代入されます。
If score >= 100 Thenscoreが100以上であれば「合格です!」というメッセージボックスが表示されます。
Elseもしscoreが100未満であれば、「不合格です。再チャレンジしましょう!」というメッセージボックスが表示されます。

このように、条件に応じて適切なメッセージを表示することで、ユーザーに結果をわかりやすく伝えることができます。

この基本的な構造は、業務の中でも多くの場面で応用が利きます。

セルの値によって処理を分岐させる方法

次に、Excelのセルに入力された値に基づいて処理を分岐させる方法を紹介します。

たとえば、特定のセル(ここではA1)が「完了」という文字列を含んでいる場合に、その横のセル(B1)に「お疲れ様でした」と表示し、それ以外の場合には「進行中」と表示する例を見てみましょう。

Sub CheckStatus()
    If Range("A1").Value = "完了" Then
        Range("B1").Value = "お疲れ様でした!"
    Else
        Range("B1").Value = "進行中です"
    End If
End Sub
If Range("A1").Value = "完了" ThenセルA1に入力された値が「完了」であるかどうかをチェックします。もし「完了」であれば、次の行の処理が実行されます。
Range("B1").Value = "お疲れ様でした!"セルA1に入力された値が「完了」のとき、B1セルに「お疲れ様でした!」という値を入力します。
ElseもしA1の値が「完了」でなければ、Else以下の処理が実行され、B1には「進行中です」と表示されます。

このように、Excelのセルの値に応じて処理を切り替えることができれば、チェックリストや進捗管理など、さまざまな業務の自動化に役立てることができます。

ElseIf構文とは?基本の使い方

VBAのIf文を使うと、一つの条件に対して処理を分岐させることができますが、複数の条件を順番にチェックしたい場合に便利なのが「ElseIf構文」です。

複数の条件がある場合、一つの条件が満たされなければ次の条件をチェックし、その結果に応じた処理を行うことができます。

これにより、複数のケースをスムーズに管理できるようになります。

ここからは、ElseIf構文の基本的な使い方と記述方法について詳しく解説していきましょう。

ElseIf構文の基本構文

ElseIF構文は、複数の条件を順次チェックし、それぞれの条件に対して異なる処理を行いたい場合に使用します。

基本構文は以下の通りです。

If 条件1 Then
    ' 条件1がTrueの場合の処理
Elseif 条件2 Then
    ' 条件1がFalseで条件2がTrueの場合の処理
Elseif 条件3 Then
    ' 条件1と条件2がFalseで条件3がTrueの場合の処理
Else
    ' すべての条件がFalseの場合の処理
End If
記述意味
If 条件1 Then最初の条件がTrueであるかどうかを確認します。Trueならその処理を実行し、それ以降の条件は無視されます。
ElseIf 条件2 Then条件1がFalseだった場合に次にこの条件が評価されます。条件2がTrueであればその処理が実行されます。
ElseIf 条件3 Then条件1と条件2がFalseだった場合、さらにこの条件がチェックされます。
Else全ての条件がFalseだった場合に実行される処理です。Elseブロックは任意ですが、エラー防止のために入れることをお勧めします。

ElseIf構文を使用することで、複雑な条件分岐も簡潔に書くことができ、コードの可読性も向上します。

ElseIf構文の記述例

実際にElseIf構文を使った具体例を見てみましょう。

例えば、あるテストの点数に応じて評価を変えるシナリオを考えてみます。

点数が80点以上なら「優秀」、60点以上なら「合格」、それ未満なら「不合格」と表示する処理を作成します。

Sub EvaluateScore()
    Dim score As Integer
    score = Range("A1").Value  ' セルA1の値を取得

    If score >= 80 Then
        Range("B1").Value = "優秀"
    ElseIf score >= 60 Then
        Range("B1").Value = "合格"
    Else
        Range("B1").Value = "不合格"
    End If
End Sub
記述意味
score = Range("A1").ValueセルA1に入力された点数を取得し、それをscoreという変数に代入します。
If score >= 80 Thenまず、点数が80以上であればセルB1に「優秀」と表示します。
ElseIf score >= 60 Then点数が80未満でも、60以上の場合はセルB1に「合格」と表示されます。
Else60点未満の場合は「不合格」と表示されます。

このようにElseIf構文を使うことで、複数の条件を一つのコード内で効率よく処理できます。

条件が多くなる場合でも、コードの流れが理解しやすくなり、業務の中でも活用しやすい構造となります。

複数条件を処理するIf文の応用

ElseIf構文のように複数の条件を組み合わせることで、より複雑な判断が可能となり、実務に即した柔軟な自動化を実現できます。

ここでは、条件を組み合わせて処理する「AND」「OR」演算子を使った方法や、複雑な条件でもわかりやすく書くためのコツ、そして実際に業務で役立つ具体例を紹介します。

AND、ORを使った複数条件の設定方法

VBAでは、複数の条件を同時にチェックする場合に「AND」や「OR」を使うことで、処理をより柔軟に制御できます。

これらの演算子を使うことで、条件がすべて成立する場合(AND)や、どれか一つが成立する場合(OR)に処理を分岐させることが可能です。

ANDとORの基本的な使い方
AND: すべての条件がTrue(真)である場合に処理を実行する。
OR: いずれかの条件がTrueであれば処理を実行する。

ANDを使った記述例

セルA1の値が50以上、かつセルB1の値が「完了」である場合にメッセージを表示するコードです。

If Range("A1").Value >= 50 And Range("B1").Value = "完了" Then
    MsgBox "処理が完了しました。"
End If

この場合、両方の条件(A1が50以上、B1が「完了」)が満たされているときにだけメッセージが表示されます。

ORを使った記述例

セルA1の値が50以上、またはセルB1の値が「完了」である場合にメッセージを表示するコードです。

If Range("A1").Value >= 50 Or Range("B1").Value = "完了" Then
    MsgBox "条件のいずれかが満たされました。"
End If

この場合、どちらか一つの条件でも成立すればメッセージが表示されます。

ORはANDに比べると条件が緩やかになるのが特徴です。

【使用例】複数のセル値に基づいて処理を変える

実際の業務では、複数のセルの値に基づいて複雑な処理を行うことがよくあります。

以下の例では、セルA1とB1の値に応じて、異なるメッセージを表示する処理を紹介します。

Sub CheckMultipleConditions()
    Dim score As Integer
    Dim status As String

    score = Range("A1").Value  ' セルA1に入力された数値
    status = Range("B1").Value ' セルB1に入力されたステータス

    If score >= 80 And status = "完了" Then
        MsgBox "合格かつ処理完了"
    ElseIf score >= 80 And status = "未完了" Then
        MsgBox "合格だが処理未完了"
    ElseIf score < 80 And status = "完了" Then
        MsgBox "不合格だが処理完了"
    Else
        MsgBox "不合格かつ処理未完了"
    End If
End Sub
記述意味
score >= 80 And status = "完了"A1に入力された点数が80以上で、かつB1のステータスが「完了」の場合に「合格かつ処理完了」と表示します。
score >= 80 And status = "未完了"点数は合格ラインに達しているが、処理が未完了である場合は「合格だが処理未完了」と表示します。
score < 80 And status = "完了"点数は不合格だが、処理は完了している場合のメッセージ。
Elseすべての条件に当てはまらない場合の処理です。

このように、複数のセルの値を組み合わせて、複雑な状況に応じた処理を行うことができます。

業務の中で複数の条件を確認して処理を分岐させる場面は多いかと思いますが、If文をうまく活用することで、柔軟に対応することができます。

複数条件を扱うことでより複雑な業務にも対応したVBAプログラムを作成することができるので、ぜひチャレンジしてみてください。

複雑な条件でも簡単に扱える書き方のコツ

複数の条件を扱う場合、コードが長くなったり、分かりづらくなったりすることがあります。

以下のコツを活用することで、複雑な条件でも見やすく扱いやすいコードを記述できるので、ぜひ意識してみてください。

  • 条件を適切に括弧でグループ化する
  • 複雑な条件は変数を使って分ける
  • 条件をネストせず、複数のIf文で分岐させる

条件を適切に括弧でグループ化する

演算子の優先順位を明示することで、意図した通りに条件が評価されることを保証します。

特に「AND」と「OR」を組み合わせる場合、意図しない動作を避けるために括弧を使うことが重要です。

If (Range("A1").Value >= 50 And Range("B1").Value = "完了") Or Range("C1").Value = "特例" Then
    MsgBox "条件が満たされました。"
End If

このコードでは、「A1が50以上でB1が完了」の場合、またはC1が「特例」の場合にメッセージが表示されます。

複雑な条件は変数を使って分ける

長い条件式を直接書くのではなく、条件を一度変数に格納することで、読みやすさと再利用性が向上します。

また、後から条件式を修正したり調整する際にも便利です。

Dim isPass As Boolean
Dim isComplete As Boolean

isPass = Range("A1").Value >= 50
isComplete = Range("B1").Value = "完了"

If isPass And isComplete Then
    MsgBox "合格して、処理が完了しました。"
End If

この例では、isPassとisCompleteという変数を使って、条件を分割して記述することで可読性を高めています。

条件をネストせず複数のIf文で分岐させる

条件が多くなりすぎる場合、一つのIf文で処理するよりも複数のIf文を使って段階的に処理を分けることで、コードが見やすくなります。

If Range("A1").Value >= 50 Then
    If Range("B1").Value = "完了" Then
        MsgBox "処理が完了しました。"
    End If
End If

このようにネストを浅くすることで、何が起こっているのかが一目で分かる構造にできます。

If文でよくあるエラーとその解決策

VBAのIf文は便利で強力な構文ですが、正しく書かないとエラーが発生しやすく、思わぬ動作を引き起こすことがあります。

特に初心者の方が陥りやすいミスやエラーを解決するための方法を知っておくことで、プログラムが正常に動作し、スムーズに作業を進めることができます。

ここでは、よくあるエラーとその解決策を詳しく解説し、デバッグ方法や実際のエラー例に基づく修正方法もご紹介します。

If文で陥りやすいミスとエラーメッセージの解説

VBAでIf文を記述する際に、初心者が陥りやすいミスは多くあります。

ここでは、以下のようなよくあるミスやそれに伴うエラーメッセージを紹介し、それぞれの原因と解決策について解説します。

  • 比較演算子の間違い
  • If文の終わりを記述し忘れる
  • 文字列の比較で大文字小文字が一致しない

比較演算子の間違い

エラーメッセージExpected: =
原因比較演算子を誤って使用している場合に発生します。特に、「=」を「==」や「=>」のように書いてしまうことがあります。
解決策 VBAでは「=」は等しいことを意味し、「>=」は「以上」を意味します。演算子を正しく使うことが重要です。
If score == 50 Then  ' エラー
' 修正後
If score = 50 Then  ' 正しい構文

If文の終わりを記述し忘れる

エラーメッセージBlock If without End If
原因If文を使って条件分岐を行った後、End Ifを記述し忘れることで発生します。
解決策If文の開始と終了がペアになっていることを確認し、必ずEnd Ifで閉じるようにしましょう。
If score >= 50 Then
    MsgBox "合格です"
' End Ifを忘れるとエラー
End If  ' 修正後

文字列の比較で大文字小文字が一致しない

エラーメッセージエラーメッセージは出ませんが、意図した結果が得られない場合が多いです。
原因文字列の比較で大文字小文字が一致しないと、意図しない結果になることがあります。例えば「完了」と「かんりょう」は別の文字列と認識されます。
解決策文字列を比較する際には、LCase関数やUCase関数を使って大文字・小文字の違いを無視する方法があります。
If UCase(status) = "完了" Then
    MsgBox "処理が完了しました"
End If

まとめ

本記事では、VBAを記述していくうえで必ず習得すべきIf構文と、ElseIf構文について解説していきました。

条件分岐を扱えるようになると、VBAで実現できる幅が一気に広がります。

業務効率化やミスの削減にもつながりますし、複雑な処理も実現できるようになりますので、ぜひ積極的に使って習得していきましょう。

  • この記事を書いた人

スギ

営業→ITベンチャー→IT上場企業勤務。ITベンチャーでは半年間でマネージャー職まで昇進。仕事術を駆使して残業80時間→10時間まで削減。今はIT上場企業で残業0時間でゆるく頑張ってます。ベンチャー時代に培った仕事術を発信していきます。ExcelとGoogleスプレッドシートが得意。

-Excel, マクロ・VBA