【Excel】VBAでIf文とSelect Caseで条件分岐する方法

【Excel】VBAでIf文とSelect Caseで条件分岐する方法
🛡️ 超解決

Excel VBAでプログラムを作成する際、特定の条件に応じて処理を変えたい場面は多いでしょう。例えば、セルの値が「A」なら特定の処理を実行し、「B」なら別の処理を実行するなどです。このような条件分岐を実現するために、VBAでは「If文」と「Select Case文」という2つの主要な構文が用意されています。どちらを使うべきか迷うこともあるかもしれません。この記事では、Excel VBAにおけるIf文とSelect Case文を使った条件分岐の基本的な使い方から、それぞれの特徴、使い分けについて詳しく解説します。この解説を読むことで、あなたのVBAコードはより柔軟で効率的なものになるはずです。

【要点】VBAでの条件分岐をマスターする

  • If文(単一行): 簡単な条件分岐を1行で記述できる。
  • If文(ブロック): 複数の条件や処理をまとめて記述できる。ElseやElseIfと組み合わせる。
  • Select Case文: 1つの変数の値に対して複数の条件分岐を行う場合に便利。
  • 使い分け: 条件が少ない場合はIf文、多い場合はSelect Case文が適している。

ADVERTISEMENT

If文とSelect Case文の基本構造

Excel VBAでプログラムの実行フローを制御する上で、条件分岐は非常に重要な要素です。条件分岐とは、ある条件が満たされた場合に特定の処理を実行し、満たされない場合には別の処理を実行する、あるいは何も実行しない、といったように、プログラムの動作を条件に応じて変える仕組みのことです。VBAでは、主に「If文」と「Select Case文」がこの条件分岐を実現するために使われます。

If文は、最も基本的で汎用性の高い条件分岐構文です。指定した条件が真(True)である場合に、それに続くコードを実行します。条件が偽(False)である場合の処理を指定することも可能です。一方、Select Case文は、1つの変数や式の値に基づいて、複数の異なる条件のいずれかに合致するかを判定し、対応する処理を実行するのに適しています。どちらもプログラムのロジックを柔軟に構築するために欠かせない構文です。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

If文による条件分岐

If文は、指定した条件が真(True)である場合に、その後のコードを実行する構文です。最もシンプルな形から、複数の条件や、条件が偽の場合の処理まで、様々な形で利用できます。If文には、主に「単一行If文」と「ブロックIf文」の2つの形式があります。それぞれの特徴と使い方を見ていきましょう。

単一行If文

単一行If文は、非常にシンプルな条件分岐を1行で記述したい場合に便利です。構文は以下のようになります。

If 条件 Then 実行する処理

この構文では、指定した「条件」が真(True)の場合に、「実行する処理」が実行されます。実行する処理は、単一のステートメントである必要があります。もし条件が偽(False)だった場合は、この行はスキップされ、次の行の処理に進みます。

例えば、あるセルの値が10より大きい場合に、そのセルに「大きい」と表示するコードは以下のようになります。

Sub SingleLineIfExample()

If Range(“A1”).Value > 10 Then Range(“B1”).Value = “大きい”

End Sub

このコードでは、セルA1の値が10より大きければ、セルB1に「大きい」という文字列が代入されます。条件が偽の場合は何も起こりません。単一行If文は、コードを簡潔にしたい場合に有効ですが、複雑な処理や複数の処理を実行したい場合には適していません。

ブロックIf文

ブロックIf文は、条件が真である場合に複数の処理を実行したり、条件が偽である場合の処理を指定したりする場合に使用します。構文は以下のようになります。

If 条件 Then

‘ 条件が真の場合に実行する処理1

‘ 条件が真の場合に実行する処理2

End If

この基本形では、条件が真の場合に、IfとEnd Ifの間に記述されたすべての処理が順番に実行されます。条件が偽の場合は、Ifブロック内のコードはすべてスキップされます。

さらに、Else句を追加することで、条件が偽の場合の処理を指定できます。

If 条件 Then

‘ 条件が真の場合の処理

Else

‘ 条件が偽の場合の処理

End If

また、ElseIf句を使うと、複数の条件を順番に判定できます。これにより、条件分岐のロジックをより詳細に制御することが可能になります。

If 条件1 Then

‘ 条件1が真の場合の処理

ElseIf 条件2 Then

‘ 条件2が真の場合の処理

ElseIf 条件3 Then

‘ 条件3が真の場合の処理

Else

‘ 上記のどの条件も真でない場合の処理

End If

このElseIf構文は、複数の選択肢の中から条件に合致するものを1つだけ選び、対応する処理を実行したい場合に非常に役立ちます。例えば、あるセルの値に応じて、異なるメッセージを表示するコードは以下のようになります。

Sub BlockIfExample()

Dim score As Integer

score = Range(“C1”).Value

If score >= 80 Then

Range(“D1”).Value = “優”

ElseIf score >= 60 Then

Range(“D1”).Value = “良”

ElseIf score >= 40 Then

Range(“D1”).Value = “可”

Else

Range(“D1”).Value = “不可”

End If

End Sub

このコードは、セルC1の値(点数)によって、セルD1に「優」「良」「可」「不可」のいずれかを表示します。ElseIfを複数使用することで、段階的な条件判定を実現しています。ブロックIf文は、複雑なロジックを記述する際に非常に強力なツールとなります。

Select Case文による条件分岐

Select Case文は、1つの変数や式の値に基づいて、複数の可能な値のうちどれかに合致するかを判定し、対応する処理を実行するのに適した構文です。If文のElseIfを多数連ねるよりも、コードがすっきりと読みやすくなる場合があります。構文は以下のようになります。

Select Case 判定対象の変数や式

Case 値1

‘ 値1に合致した場合の処理1

Case 値2, 値3

‘ 値2または値3に合致した場合の処理2

Case 値4 To 値5

‘ 値4から値5の範囲に合致した場合の処理3

Case Is > 値6

‘ 値6より大きい場合に合致した場合の処理4

Case Else

‘ 上記のどの条件にも合致しない場合の処理

End Select

Select Case文では、「判定対象の変数や式」の値と、各「Case」で指定された値を比較します。最初に合致したCaseブロック内の処理が実行され、その後Select Caseブロック全体を抜けます。複数の値をカンマで区切って指定したり、範囲(To)や比較演算子(Is)を使って条件を指定したりすることも可能です。最後に、どのCaseにも合致しなかった場合に実行される「Case Else」ブロックを指定できます。Case Elseは省略可能ですが、指定しておくと予期しない値に対する処理を定義できて便利です。

例えば、曜日を表す数値(1:日曜日, 2:月曜日, … 7:土曜日)に応じて、その曜日が「平日」か「休日」かを判定するコードは以下のようになります。

Sub SelectCaseExample()

Dim dayOfWeek As Integer

dayOfWeek = Weekday(Date, vbSunday) ‘ 今日の曜日を数値で取得(日曜日=1)

Select Case dayOfWeek

Case 1, 7 ‘ 日曜日または土曜日

MsgBox “今日は休日です。”

Case 2 To 6 ‘ 月曜日から金曜日

MsgBox “今日は平日です。”

Case Else

MsgBox “曜日情報の取得に失敗しました。”

End Select

End Sub

このコードでは、Weekday関数で取得した曜日番号をSelect Case文で判定しています。Case 1, 7で日曜日と土曜日をまとめて休日と判定し、Case 2 To 6で月曜日から金曜日を平日と判定しています。Select Case文を使うことで、複数の条件をすっきりと整理して記述できることがわかります。

ADVERTISEMENT

If文とSelect Case文の使い分け

VBAで条件分岐を行う際に、If文とSelect Case文のどちらを使うべきか迷うことがあるかもしれません。それぞれの構文には得意な場面と不得意な場面があります。適切な方を選択することで、コードの可読性や保守性を向上させることができます。

If文が適している場面

If文は、条件が比較的少なく、AND、OR、NOTなどの論理演算子を使って複雑な条件を組み合わせる必要がある場合に適しています。また、条件が2つ程度で、Else句で処理を分けるようなシンプルな分岐にも向いています。例えば、「A1セルの値が100以上かつ、B1セルの値が50未満である場合」のような、複数の要素を組み合わせた複雑な条件判定にはIf文が便利です。

さらに、条件判定の対象が単一の変数だけでなく、複数の変数や異なる条件を組み合わせる場合もIf文が適しています。例えば、

If Range(“A1”).Value > 10 And Range(“B1”).Value < 20 Then ...

といったような、複数の条件をANDやORで結びつけるようなケースです。Select Case文では、このような複雑な条件を直接記述するのが難しくなります。

Select Case文が適している場面

Select Case文は、1つの変数や式の値に対して、複数の異なる値や範囲のいずれかに合致するかを判定する場合に非常に強力です。例えば、あるセルの値が「赤」「青」「緑」のいずれかであれば特定の色処理を、それ以外であればデフォルト処理を実行したい場合などに、If文でElseIfを連ねるよりもSelect Case文を使った方がコードが短く、意図が明確になります。

具体的には、以下のようなケースでSelect Case文が有効です。

  • 特定の複数の値による分岐: 例:「ステータス」が「完了」、「処理中」、「保留」のいずれかの場合。
  • 値の範囲による分岐: 例:点数が90点以上、80点以上90点未満、…のように段階的に判定する場合。
  • 単一の変数に対する多数の条件: If文でElseIfを10個以上連ねるような場合、Select Case文に書き換えることで可読性が向上します。

例えば、ある製品コードの先頭1文字を見て、製品の種類を判定するような場合、Select Case文が非常に有効です。

Sub ProductTypeExample()

Dim productCode As String

productCode = Range(“E1”).Value

Select Case Left(productCode, 1)

Case “A”

MsgBox “これはAシリーズ製品です。”

Case “B”

MsgBox “これはBシリーズ製品です。”

Case “C”

MsgBox “これはCシリーズ製品です。”

Case Else

MsgBox “不明な製品コードです。”

End Select

End Sub

このように、Select Case文は、1つの判定対象に対して複数の分岐先がある場合に、コードを構造化しやすくする利点があります。

よくある誤操作と注意点

VBAでIf文やSelect Case文を使用する際には、いくつかの注意点や、よくある誤操作があります。これらを理解しておくことで、予期せぬエラーを防ぎ、より堅牢なコードを作成できます。

If文の注意点

・End Ifの記述漏れ: ブロックIf文では、必ず対応する「End If」を記述する必要があります。これを忘れると、構文エラーとなります。特に、ElseやElseIfを多用する場合に、End Ifの対応関係が分かりにくくなることがあります。コードのインデント(字下げ)を正しく行うことで、対応関係を視覚的に把握しやすくなります。

・条件式の誤り: 等号「=」と代入「=」の混同や、比較演算子の誤用はよくあるミスです。例えば、条件判定で「If x = 10 Then」とすべきところを、「If x := 10 Then」のように間違えるとエラーになります。また、論理演算子(And, Or, Not)の使い方が間違っていると、意図しない条件で処理が分岐してしまいます。

・単一行If文での複数処理: 単一行If文は、1つのステートメントしか記述できません。複数の処理を実行したい場合は、ブロックIf文を使用する必要があります。誤って単一行If文で複数の処理を書こうとすると、コンパイルエラーや意図しない動作を引き起こします。

Select Case文の注意点

・Case Elseの必要性: Select Case文では、すべてのCaseに合致しなかった場合の処理を「Case Else」で定義することが推奨されます。これを記述しない場合、どのCaseにも合致しなかったときにエラーにはなりませんが、プログラムが予期しない動作をする可能性があります。特に、判定対象の値が想定外の値を取りうる場合は、Case Elseでエラー処理やデフォルト処理を記述しておくことが重要です。

・Caseの順序: Select Case文は、最初に合致したCaseブロックの処理を実行し、その時点でSelect Caseブロックを抜けます。そのため、Caseの順序によっては、意図した通りの条件分岐にならないことがあります。例えば、Case 1 To 10 と Case 5 のように記述した場合、値が5のときに先にCase 5が判定されるのではなく、Case 1 To 10 が判定される可能性があります。一般的には、より具体的なCaseを先に記述し、汎用的なCaseや範囲指定のCaseを後に記述する方が、意図が明確になります。

・判定対象のデータ型: Select Case文で比較する値のデータ型は、判定対象の変数や式のデータ型と一致している必要があります。異なるデータ型を比較しようとすると、エラーが発生したり、予期しない結果になったりすることがあります。例えば、数値の変数を文字列と比較する場合などは注意が必要です。

セキュリティ警告について

VBAコードを含むブックを開いた際に、「セキュリティ警告」が表示されることがあります。これは、マクロが悪意のあるコードを実行する可能性があるため、Excelがユーザーに注意を促す機能です。通常、信頼できるソースからのブックであれば「コンテンツの有効化」をクリックしてマクロを有効にしますが、不明なソースからのブックではマクロを有効にしないように注意が必要です。

VBAコードを記述・実行する際には、常にセキュリティリスクを考慮し、信頼できる環境でのみマクロを有効にするようにしましょう。また、自分で作成したVBAコードであっても、再配布する際には、そのコードが安全であることを確認することが重要です。

まとめ

この記事では、Excel VBAにおける条件分岐の主要な構文であるIf文とSelect Case文について、その基本的な使い方から、それぞれの特徴、使い分け、そして注意点までを詳しく解説しました。If文は汎用性が高く、単一行での記述からElseIfを使った複雑な分岐まで対応できます。一方、Select Case文は、1つの値に対して複数の条件分岐を行う場合に、コードをより簡潔かつ読みやすく記述できます。これらの構文を使い分けることで、より柔軟で効率的なVBAプログラムを作成できるようになります。今後は、これらの条件分岐構文を使いこなし、より高度なExcel自動化に挑戦してみてください。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】