Excel VBAでIf文の使い方をお探しですね。
広告
Excel VBAのIf文を使いこなそう!条件分岐の基本から応用まで
Excel VBAでマクロを作っていると、「この条件のときはこうする」という判断が必要な場面がたくさん出てきます。
たとえば「点数が80点以上なら合格」「在庫が少なくなったら警告を出す」「A列とB列の両方に入力があったら処理する」といった具合です。
この記事では、Excel VBAのIf文について、基本的な使い方から、複数の条件を組み合わせる方法、段階的に判定する書き方まで、初心者の方にも分かりやすく説明していきます。
Excel VBAのIf文ってどう書くの?基本の形を覚えよう
Excel VBAのIf文は、「もし○○なら△△する」という条件分岐を作るための命令です。
条件を満たしたとき(Trueのとき)にThenの後ろに書いた処理が実行されます。
条件を満たさなかった場合は、Elseがあればその処理に進み、なければIf文をスキップして次へ進みます。
Excelの作業を自動化するときは、セルの値や日付、文字列、数字の大小などを判定することがとても多いので、If文はマクロ作りの基礎中の基礎と言えます。
基本的な書き方はこんな感じです。
処理が複数行になるときは、最後に必ず「End If」を書きます。
End Ifを忘れるとエラーになってしまうので、Ifを書いたら「閉じる場所も必要だな」とセットで考えるクセをつけておくといいですよ。
“`vba
Sub SampleIf()
Dim score As Long
score = Range(“A1”).Value
If score >= 80 Then
MsgBox “合格です”
Else
MsgBox “不合格です”
End If
End Sub
“`
このコードでは、A1セルの値が80以上なら「合格です」、そうでなければ「不合格です」とメッセージが表示されます。
`score >= 80`の部分が条件式で、比較演算子を使って数字を比べています。
VBAでよく使う比較演算子には、等しいかどうかを調べる`=`、等しくないかを調べる`<>`、以上を表す`>=`、以下を表す`<=`などがあります。 文字列の比較もできて、たとえば`Range("B1").Value = "完了"`と書けば、B1セルが「完了」かどうかを判定できます。 If文には、処理が1行だけのときに1行でまとめて書く方法もあります。 たとえば`If score >= 80 Then MsgBox “合格です”`のような感じです。
ただ、慣れないうちは複数行で書いたほうが見やすいですし、後からElseやElseIfを追加するときも迷いにくくなります。
実際の仕事で使うマクロは後から修正することが多いので、短く書くことより、条件と処理の関係が分かりやすいことを優先したほうがいいでしょう。
複数の条件を組み合わせる!And・Or・Notの使い方
If文で複数の条件を扱いたいときに使うのが、And、Or、Notといった論理演算子です。
Andは「かつ」、Orは「または」、Notは「〜ではない」という意味で使います。
たとえば「A1が80以上で、かつB1が提出済みなら合格」としたいときはAndを使います。
逆に「A1が80以上、またはB1が特別承認なら合格」としたいときはOrを使います。
複数条件が使えるようになると、Excelのデータ判定や入力チェックをかなり柔軟に自動化できるようになりますよ。
Andを使った例はこんな感じです。
2つの条件が両方ともOKのときだけ、Thenの後ろの処理が実行されます。
“`vba
Sub SampleAnd()
Dim score As Long
Dim submitted As String
score = Range(“A1”).Value
submitted = Range(“B1”).Value
If score >= 80 And submitted = “あり” Then
MsgBox “合格です”
Else
MsgBox “不合格です”
End If
End Sub
“`
このコードでは、点数が80以上で、なおかつ提出物が「あり」のときだけ合格になります。
どちらか片方でも条件を満たさなければElse側の処理が実行されます。
Andは範囲を指定するときにもよく使われて、たとえば`If value >= 100 And value <= 200 Then`と書けば、値が100以上200以下かどうかを判定できます。 Excel VBAでは「100から200の間」みたいな書き方はできないので、下限と上限をそれぞれ比較してAndでつなぐと覚えておくと便利です。 Orを使うと、複数の条件のうちどれか1つでも満たせば処理を実行できます。 たとえば土曜日または日曜日なら休日と判定する場合はこう書きます。 ```vba Sub SampleOr() Dim dayName As String dayName = Range("A1").Value If dayName = "土" Or dayName = "日" Then MsgBox "休日です" Else MsgBox "平日です" End If End Sub ``` Notは条件を反対にするときに使います。 たとえば`If Not Range("A1").Value = "" Then`と書けば、A1が空白じゃない場合に処理できます。 ただ、単純に「等しくない」を表すなら`<>`を使って`If Range(“A1”).Value <> “” Then`と書いたほうが分かりやすいこともあります。
Notは、複数の条件全体をひっくり返したいときに特に役立ちます。
“`vba
Sub SampleNot()
If Not (Range(“A1”).Value = “完了” Or Range(“A1”).Value = “確認済”) Then
MsgBox “未処理の可能性があります”
End If
End Sub
“`
AndとOrを組み合わせるときは、カッコを使って条件のまとまりをはっきりさせることが大事です。
たとえば「点数が80以上で、提出物が『あり』または『理由あり』なら合格」という条件では、提出物側のOrをカッコで囲むと意図がはっきりします。
カッコがないと、後から読んだときにどこまでがAndで、どこからがOrなのか分かりにくくなってしまいます。
“`vba
If score >= 80 And (submitted = “あり” Or submitted = “理由あり”) Then
MsgBox “合格です”
End If
“`
ちなみに、VBAのAndやOrは、他のプログラミング言語にある「短絡評価」という仕組みとは動きが違います。
短絡評価というのは、左側の条件だけで結果が決まったら右側を評価しない仕組みなんですが、VBAでは基本的に両方の条件が評価される前提で考える必要があります。
そのため、オブジェクトがNothingかどうかを確認してからプロパティを見るような処理では、1つのIf文にまとめず、If文を分けたほうが安全です。
エラーを避けるためにも、複数条件は便利な反面、評価される順番や内容を意識して書くことが大切です。
3つ以上の条件を分けるならElseIfが便利
条件が2つだけじゃなくて、3つ以上に分かれる場合はElseIfを使います。
ElseIfは、最初のIf条件に当てはまらなかったときに、次の条件を順番にチェックするための書き方です。
たとえば点数に応じて「A評価」「B評価」「C評価」「再提出」のように分けたい場合、IfとElseだけでは書きづらくなります。
ElseIfを使えば、上から順番に条件を確認して、最初にOKになった処理だけを実行できます。
“`vba
Sub SampleElseIf()
Dim score As Long
Dim result As String
score = Range(“A1”).Value
If score >= 90 Then
result = “A評価”
ElseIf score >= 80 Then
result = “B評価”
ElseIf score >= 60 Then
result = “C評価”
Else
result = “再提出”
End If
Range(“B1”).Value = result
End Sub
“`
この例で大事なのは、条件を書く順番です。
`score >= 90`を先に判定して、その次に`score >= 80`を判定しています。
もし順番を逆にして`score >= 60`を先に書いてしまうと、90点の人も60点以上として判定されて、A評価まで到達しません。
ElseIfは上から順にチェックされるので、範囲が重なる条件では、より細かい条件を先に書くのが基本です。
ElseIfと似た書き方に、If文の入れ子、つまりネストがあります。
ネストというのは、If文の中にさらにIf文を書く方法です。
たとえば「部署が営業部で、さらに売上が一定以上なら表彰」みたいに、前提条件を満たした場合だけ次の条件を確認したいときに使えます。
ただ、ネストが深くなるとコードがどんどん右に寄っていって、読みにくくなりやすいので注意が必要です。
“`vba
Sub SampleNest()
If Range(“A1”).Value = “営業部” Then
If Range(“B1”).Value >= 1000000 Then
MsgBox “表彰対象です”
Else
MsgBox “営業部ですが表彰対象外です”
End If
Else
MsgBox “営業部ではありません”
End If
End Sub
“`
ElseIfとネストの使い分けは、条件の関係で判断すると分かりやすくなります。
同じ対象を段階的に評価するならElseIf、前提条件の内側でさらに細かく判定するならネストが向いています。
たとえば点数評価のように「どのランクか」を決める処理はElseIfが適しています。
一方、部署、役職、売上のように条件に親子関係がある場合はネストのほうが意図を表しやすいことがあります。
ただ、ネストが3段階以上になると、かなり読みにくくなってきます。
実際の仕事では、条件式を変数に分けたり、処理を別のSubやFunctionに切り出したりすると読みやすくなります。
VBAは一度作って終わりじゃなくて、業務ルールの変更に合わせて修正されることが多いので、「今動くコード」だけじゃなく「後から読めるコード」を意識することが大切です。
実務で使いやすいIf文にするためのコツと注意点
実際の仕事でExcel VBAのIf文を使うときは、ちゃんと動くだけじゃなくて、条件の意味が分かりやすいことも大事です。
特にAndやOrを組み合わせた複数条件は、1行が長くなりやすくて、数週間後に見返したときに「これ何だっけ?」となることがあります。
そんなときは、複雑な条件はカッコでまとまりを示して、必要に応じて行継続文字`_`を使って複数行に分けると読みやすくなります。
VBAでは半角スペースの後にアンダースコアを書くことで、1つの命令を複数行に分けて書けるんです。
“`vba
Sub SampleReadable()
Dim amount As Long
Dim rank As String
amount = Range(“A1”).Value
rank = Range(“B1”).Value
If (amount >= 100000 And rank = “Gold”) Or _
(amount >= 300000 And rank = “Silver”) Then
MsgBox “割引対象です”
Else
MsgBox “通常価格です”
End If
End Sub
“`
こうやって書くと、「Gold会員は10万円以上」「Silver会員は30万円以上」という条件のまとまりが見えやすくなります。
カッコがあることで、VBAだけじゃなく人間にも条件のグループが伝わります。
仕事で使うマクロでは、条件が売上、会員ランク、日付、在庫数など複数の要素にまたがることが多いので、読みやすさはミス防止に直結します。
よくある失敗として、成立しない条件や、いつも成立してしまう条件を書いてしまうケースがあります。
たとえば`If value <= 100 And value >= 200 Then`は、100以下かつ200以上という意味になるので、普通の数字では絶対に成立しません。
反対に`If value <= 200 Or value >= 100 Then`は、ほとんどの数字でOKになってしまって、条件としての意味が薄くなる場合があります。
複数条件を書くときは、日本語に置き換えて「本当にこの条件ってあり得るの?」と確認すると、論理ミスを見つけやすくなります。
あと、文字列の比較では表記ゆれにも注意が必要です。
たとえば「完了」と「 完了」(先頭にスペース)のように、見た目は似てても別の文字列として扱われます。
必要に応じて`Trim`関数で前後の余分なスペースを取り除いてから比較すると、入力データのブレに強くなります。
“`vba
If Trim(Range(“A1”).Value) = “完了” Then
MsgBox “処理済みです”
End If
“`
条件分岐がすごく多くなってきたら、Select Caseを検討するのもアリです。
Select Caseは、1つの値に対して複数の分岐を作るときに見通しが良くなります。
たとえば評価ランク、曜日、ステータスのように、同じ項目の値によって処理を分ける場合は、If ElseIfを長々と並べるより読みやすくなることがあります。
ただ、AndやOrを使った複雑な組み合わせ条件ではIf文のほうが自然に書ける場合もあるので、目的に応じて使い分けるのが現実的です。
Excel VBAのIf文は、基本の書き方、And・Or・Not、ElseIf、ネストを理解すれば、いろんな業務マクロに応用できます。
最初は簡単な条件から始めて、次に複数条件、最後に読みやすい書き方へと進んでいくと無理なく身につきます。
条件が複雑になったときほど、カッコ、インデント、変数名、コメントを活用して、処理の意図が伝わるコードにすることが大切です。
If文を使いこなせるようになると、入力チェック、集計、抽出、帳票作成など、Excel作業の自動化の幅がグッと広がります。
ぜひこの記事を参考に、少しずつIf文に慣れていってくださいね!
広告
