「VBAのIf文って、なんだか難しそう……」
そう思って手が止まっていませんか? 条件分岐はプログラミングの基本中の基本ですが、初めて見ると記号や英語の羅列に見えて、つい身構えてしまいますよね。
でも安心してください。If文の仕組みは、実は日常会話とほとんど同じです。この記事では基本の書き方から実務で使えるコードまで、一つずつ丁寧に解説していきます。
VBA If文(条件分岐)とは?
条件分岐とは、条件に応じて処理を切り替える仕組みのことです。
日常で例えるとこんな感じです。
「明日晴れたらピクニックに行こう。くもりだったら映画にして、雨だったら家でのんびりしよう」
この会話、無意識に条件分岐をしていますよね。「天気」という条件によって「行き先」という処理を変えているわけです。
VBAのIf文も、やっていることはまったく同じです。「もし○○だったら△△する、そうでなければ□□する」をコードで書いているだけなんですよ。
VBEの起動とコードの書き方
If文を試すには、まずVBE(Visual Basic Editor)を開く必要があります。
VBEの開き方
一番かんたんな方法は、Excelを開いた状態で Alt + F11 キーを押すことです。
開発タブが表示されていない場合でも、このショートカットなら直接VBEを開けます。開発タブを表示させたい場合は「ファイル」→「オプション」→「リボンのユーザー設定」へ進みます。そこで「開発」にチェックを入れてくださいね。
標準モジュールの挿入
VBEが開いたら、コードを書く場所を用意します。
メニューの「挿入」→「標準モジュール」を選んでください。白い画面が表示されたら、そこにコードを貼り付けて実行できます。
実行方法は F5キー を押すか、メニューの「実行」→「Sub/ユーザーフォームの実行」を選びます。
If文の基本構文(コピペで動くコード)
ここからは、実際にコピペして動かせるコードで解説していきます。
Ifだけのシンプルな分岐
まずは一番シンプルな形です。「条件に合ったときだけ処理する」パターンです。
Sub シンプルなIf()
Dim 天気 As String '--- 天気を入れる変数 ---
天気 = "晴れ"
If 天気 = "晴れ" Then
MsgBox "ピクニックに出かけよう!"
End If
End Sub
日本語に置き換えると、こうなります。
If→ もし天気 = "晴れ"→ 天気が「晴れ」だったらThen→ そのときはEnd If→ ここまで
ポイントは If で始めたら、必ず End If で閉じる ことです。これを忘れるとエラーになるので、Ifを書いたらすぐにEnd Ifも書いておくのがおすすめです。
変数(Dim)の使い方がまだよく分からないという方は、先にそちらの記事を読んでおくとスムーズですよ。
If…Else(2択の分岐)
次は「条件に合ったらAの処理、合わなかったらBの処理」という2択パターンです。
Sub 二択の分岐()
Dim 天気 As String '--- 天気を入れる変数 ---
天気 = "雨"
If 天気 = "晴れ" Then
MsgBox "ピクニックに出かけよう!"
Else
MsgBox "家でのんびり過ごそう"
End If
End Sub
Else は「その他」という意味です。If の条件に合わなかった場合、すべてここに流れてきます。
このコードでは天気が「雨」なので、Else側の「家でのんびり過ごそう」が表示されます。天気を「晴れ」に書き換えて実行すると、結果が変わりますよ。
If…ElseIf…Else(3つ以上の分岐)
条件を3つ以上に分けたいときは ElseIf を使います。冒頭の天気の例をそのままコードにしてみましょう。
Sub 天気で行き先を決める()
Dim 天気 As String '--- 天気を入れる変数 ---
天気 = "くもり"
If 天気 = "晴れ" Then
MsgBox "ピクニックに出かけよう!"
ElseIf 天気 = "くもり" Then
MsgBox "映画を見に行こう"
Else
MsgBox "家でのんびり過ごそう"
End If
End Sub
処理の流れを整理しておきます。
- まず
Ifの条件をチェック(天気 = “晴れ”?) - 合わなければ
ElseIfの条件をチェック(天気 = “くもり”?) - どれにも合わなければ
Elseの処理を実行
ElseIf は何個でも追加できます。ただし、最初の条件は必ず If で書く必要があります。ElseIf だけで始めることはできないので注意してくださいね。
If文の3つのパターンを表にまとめておきましょう。
| パターン | 書き方 | 使いどころ |
|---|---|---|
| If…End If | 条件に合ったときだけ処理 | 1つの条件だけチェックしたいとき |
| If…Else…End If | 2択の分岐 | 「はい/いいえ」で処理を分けたいとき |
| If…ElseIf…Else…End If | 3つ以上の分岐 | 条件ごとに違う処理をしたいとき |
If文の実践コード(業務で使えるバージョン)
基本を押さえたところで、実際の業務で使えるコードを見ていきましょう。
セルの値で処理を分岐する例
たとえば、テストの点数がセルに入力されていて、隣のセルに判定結果を書き込みたい場合です。A列に点数が入っていて、B列に判定を出力します。
Sub テスト判定()
Dim i As Long '--- 行カウンター ---
Dim lastRow As Long '--- 最終行 ---
Dim 点数 As Long '--- 判定対象の点数 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row '--- A列の最終行を取得 ---
For i = 2 To lastRow '--- 2行目(データ開始行)から最終行まで ---
点数 = Cells(i, 1).Value
If 点数 >= 80 Then
Cells(i, 2).Value = "合格"
ElseIf 点数 >= 60 Then
Cells(i, 2).Value = "追試"
Else
Cells(i, 2).Value = "不合格"
End If
Next i
MsgBox "判定が完了しました!"
End Sub
このコードでは For文 を使ってA列のデータを1行ずつ処理しています。最終行の取得を使っているので、データが何行あっても自動で対応できますよ。
複数条件を組み合わせる(And / Or)
「点数が80点以上かつ出席率が90%以上のとき合格」のように、複数の条件を同時にチェックしたい場合は And や Or を使います。
Sub 複数条件の判定()
Dim 点数 As Long '--- テストの点数 ---
Dim 出席率 As Long '--- 出席率(%) ---
点数 = Range("A2").Value
出席率 = Range("B2").Value
If 点数 >= 80 And 出席率 >= 90 Then
MsgBox "合格です!"
ElseIf 点数 >= 80 Or 出席率 >= 90 Then
MsgBox "条件付き合格です"
Else
MsgBox "残念ですが不合格です"
End If
End Sub
使い分けをまとめます。
| 演算子 | 意味 | 例 |
|---|---|---|
| And | 両方の条件がTrueのとき | 点数 >= 80 And 出席率 >= 90 |
| Or | どちらかの条件がTrueのとき | 点数 >= 80 Or 出席率 >= 90 |
| Not | 条件を反転させる | Not 点数 >= 80(80点未満のとき) |
And と Or を同じIf文に混ぜるときは、括弧 () で優先順位を明確にしましょう。括弧がないと、意図しない判定になることがあります。
If文とSelect Caseの使い分け
VBAにはIf文のほかに、Select Case文という条件分岐の方法もあります。
どちらを使うか迷ったときの目安はこちらです。
| 条件 | おすすめの書き方 |
|---|---|
| 条件が2つ以下 | If文で十分 |
| 1つの値に対して3つ以上の分岐 | Select Caseがスッキリ |
| 複数の変数を同時に判定 | If文(And/Or)の方が柔軟 |
| 範囲で分岐したい(○○以上など) | どちらでもOK |
たとえば、さきほどの天気の例のように「1つの変数の値で3つ以上に分岐する」場合は、Select Caseで書くとグッとコードが見やすくなります。
Select Case文の詳しい使い方は、Select Case文で条件分岐を見やすく書く方法で解説していますので、あわせて読んでみてくださいね。
よくあるエラーと対処法
If文を書いていて遭遇しやすいエラーをまとめました。
End Ifの書き忘れ
一番多いのがこのエラーです。「コンパイル エラー: End If に対応する If がありません」と表示されます。
'--- 悪い例:End Ifがない ---
Sub エラー例1()
If Range("A1").Value > 0 Then
MsgBox "正の数です"
'--- ここにEnd Ifが必要! ---
End Sub
If文が入れ子(ネスト)になっていると、どのIfにEnd Ifが対応しているか分かりにくくなります。Ifを書いたらすぐにEnd Ifも書く習慣をつけると、このエラーを防げますよ。
比較演算子のミス
「等しい」を表す = と「代入」の = を混同するケースです。VBAではどちらも = を使いますが、If文の中では比較として扱われるので、実は心配不要です。
ただし、文字列を比較するときに = ではなく == と書いてしまうのはNGです。VBAには == という演算子はありません。
'--- 悪い例:==はVBAでは使えない ---
If 天気 == "晴れ" Then '← コンパイルエラー!
型の不一致
セルの値を数値として比較したいのに、セルに文字列が入っているとエラーになることがあります。
'--- 安全な書き方:IsNumericで事前チェック ---
If IsNumeric(Range("A1").Value) Then
If CLng(Range("A1").Value) >= 80 Then
MsgBox "合格"
End If
Else
MsgBox "数値を入力してください"
End If
IsNumeric で数値かどうかを先にチェックしておくと、実行時エラーを防げます。
エラーパターンをまとめておきましょう。
| エラー内容 | 原因 | 対処法 |
|---|---|---|
| End Ifに対応するIfがありません | End Ifの書き忘れ | Ifを書いたらすぐEnd Ifも書く |
| 構文エラー | ==の使用、Thenの書き忘れ | =を使う、Thenを忘れずに書く |
| 型の不一致 | 文字列と数値の比較 | IsNumericで事前チェック |
| 処理が通らない | ElseIfの条件が前のIfと重複 | 条件の順序を見直す |
マクロを保存するときは、ファイル形式を Excelマクロ有効ブック(.xlsm) にするのを忘れないでください。通常の .xlsx で保存すると、せっかく書いたマクロが消えてしまいます。
まとめ
この記事では、VBA If文の使い方を基本から実務活用まで解説しました。
ポイントをおさらいしておきましょう。
- If文は 「もし○○だったら△△する」 という条件分岐の基本構文
- If / ElseIf / Else の3つを組み合わせて、複数の条件を処理できる
- 複数の条件を同時にチェックするには And / Or 演算子を使う
- 条件が3つ以上で1つの値の分岐なら、Select Case文の方がスッキリ書ける
- If を書いたら End If もセットで書く(エラー防止の基本)
条件分岐はVBAの中でもっともよく使う構文です。まずはこの記事のサンプルコードをコピーして、実際に動かしてみてください。変数の値を変えて結果がどう変わるか試してみると、理解がぐっと深まりますよ。
If文を使いこなせるようになったら、For文でのループ処理やDo Loopでの繰り返し処理にも挑戦してみてくださいね。
