VBAの制御構造(条件分岐)

投稿日: 2024年5月26日

条件を満たす場合と満たさない場合で異なる処理を実行したり、条件を満たすまで同じ処理を繰り返し実行したりするなどの、コードの実行方法を制御する仕組みを「制御構造」といいます。

主な制御構造には、条件分岐とループ構造があります。

制御構造構文説明
条件分岐If…Then…Else 文条件に応じて異なるコードを実行します。
Select Case 文特定の変数の値に基づいて異なるコードを実行します。
ループ構造For…Next ループ指定した回数だけコードを繰り返します。
For Each…Next ループコレクションや配列の各要素に対して繰り返し処理を行います。
Do While…Loop ループ条件が真である限り、コードを繰り返します。
Do Until…Loop ループ条件が偽である限り、コードを繰り返します。

条件分岐 If…Then…Else 文

基本的なIf…Then…Else文

基本的な構文

If 条件式 Then
  処理
End If

以下は、InputBoxに数値を入力させ、その数値が10以上かどうかをチェックし、それに応じてメッセージを表示する簡単な例を以下に示します。
CDbl関数は、引数をDouble型(倍精度浮動小数点数型)に変換します。

Sub CheckNumber()
    Dim userInput As String
    Dim userNumber As Double
    
    ' InputBoxでユーザーに数値を入力させる
    userInput = InputBox("数値を入力してください:", "数値チェック")
    
    ' Double型(倍精度浮動小数点数型)に変換します
    userNumber = CDbl(userInput)
        
    ' 数値が10以上かどうかをチェック
    If userNumber >= 10 Then
        MsgBox "入力された数値は10以上です。", vbInformation, "結果"
    End If

End Sub

数値が10以上かどうかを判定し、結果に応じてメッセージボックスを表示します。

処理条件を条件式とそれ以外にする方法もあります。

Elseを使って処理をわける

If 条件式 Then
  処理
Else
  処理
End If

以下は10以上かどうかをチェックし、10以上の場合のメッセージと10未満の場合のメッセージを表示したものです。

Sub CheckNumber()
    Dim userInput As String
    Dim userNumber As Double
    
    ' InputBoxでユーザーに数値を入力させる
    userInput = InputBox("数値を入力してください:", "数値チェック")
    
    ' Double型(倍精度浮動小数点数型)に変換します
    userNumber = CDbl(userInput)
        
    ' 数値が10以上かどうかをチェック
    If userNumber >= 10 Then
        MsgBox "入力された数値は10以上です。", vbInformation, "結果"
    Else
        MsgBox "入力された数値は10未満です。", vbExclamation, "結果"
    End If

End Sub

次に条件を更に増やしたい場合はElseIFを使用します。

ElseIFを使って処理条件を増やす

If 条件式 Then
  処理

ElseIf 条件式 Then
  処理
Else
  処理
End If

ElseIfを使用した例

以下はElseIfを使用し条件を更に追加したものになります。

Sub CheckNumber()
    Dim userInput As String
    Dim userNumber As Double
    
    ' InputBoxでユーザーに数値を入力させる
    userInput = InputBox("数値を入力してください:", "数値チェック")
    
    ' Double型(倍精度浮動小数点数型)に変換します
    userNumber = CDbl(userInput)
        
    ' 数値が10以上かどうかをチェック
    If userNumber > 20 Then
        MsgBox "入力された数値は20より大きいですす。", vbInformation, "結果"
    ElseIf userNumber >= 10 Then
        MsgBox "入力された数値は10以上20以下です。", vbInformation, "結果"
    Else
        MsgBox "入力された数値は10未満です。", vbExclamation, "結果"
    End If

End Sub

Ifの条件に更にIFを入れる入れ子(ネスト)することもできます。

入れ子のIf…Then…Else文

以下は条件が複雑な場合、If…Then…Else文を入れ子(ネスト)する方法になります。
IsNumeric関数は値が数値変換可能かチェックします。

Sub CheckNumber()
    Dim userInput As String
    Dim userNumber As Double
    
    ' InputBoxでユーザーに数値を入力させる
    userInput = InputBox("数値を入力してください:", "数値チェック")
    
    ' 数値かどうかをチェック
    If IsNumeric(userInput) Then
        userNumber = CDbl(userInput)
        
        ' 数値が10以上かどうかをチェック
        If userNumber >= 10 Then
            MsgBox "入力された数値は10以上です。", vbInformation, "結果"
        Else
            MsgBox "入力された数値は10未満です。", vbExclamation, "結果"
        End If
    Else
        MsgBox "有効な数値を入力してください。", vbCritical, "エラー"
    End If
End Sub

以上でネストする方法ですが、Excel VBAのIf…Then…Else文におけるネストの制限について、公式なドキュメントでは明確な上限は記載されていませんが、VBAの構造とメモリの制約に依存します。
一般的に、ネストが深くなるとコードの可読性とメンテナンス性が低下するため、ネストのレベルは適度に抑えることが推奨されます。
実際には、通常の用途で20〜30レベル程度までのネストは問題なく機能しますが、それ以上になるとパフォーマンスやエラーの発生リスクが増加する可能性があります。
ちなみにEXCEL関数のIf関数は、最大 64 個の IF文をネストすることができます。

複数の値で条件分岐

If文で複数の値を条件とする場合、論理演算子を使用して条件を組み合わせることができます。以下に、例として曜日を入力させて平日か週末かを判定するコードを示します。

Sub CheckDayWithIf()
    Dim userInput As String
    
    ' InputBoxでユーザーに曜日を入力させる
    userInput = InputBox("曜日を入力してください(例:月曜日、火曜日など):", "曜日チェック")
    
    ' 平日か週末かをチェックする
    If userInput = "月曜日" Or userInput = "火曜日" Or userInput = "水曜日" Or userInput = "木曜日" Or userInput = "金曜日" Then
        MsgBox "平日です。", vbInformation, "結果"
    ElseIf userInput = "土曜日" Or userInput = "日曜日" Then
        MsgBox "週末です。", vbInformation, "結果"
    Else
        MsgBox "入力された曜日は認識されませんでした。", vbExclamation, "エラー"
    End If
End Sub

この方法を使えば、複数の値を条件に含めることができます。Or演算子を使用して、いくつかの条件を組み合わせることが可能です。

条件分岐 Select Case 文

Select Caseステートメントは、1つの条件判断の対象に対して複数の条件を設定して判断処理を行います。
If文は、条件が真か偽かを評価して分岐する構文です。それに対してSelect Case文は、特定の変数または式の値に基づいて分岐する構文です。特定の値に対して異なる処理を行う場合に使われます。

基本的な構文

Select Case 条件判断の対象
 Case 条件式1
  対象が条件式1を満たすときの処理
 Case 条件式2
  対象が条件式2を満たすときの処理
 Case Else
  対象がすべての条件を満たさないときの処理
End Select

Sub CheckNumberWithSelectCase()
    Dim userInput As String
    Dim userNumber As Double
    
    ' InputBoxでユーザーに数値を入力させる
    userInput = InputBox("数値を入力してください:", "数値チェック")
    
    userNumber = CDbl(userInput)
    
    ' Select Case文で数値の範囲に応じたメッセージを表示
    Select Case userNumber
        Case Is < 10
            MsgBox "入力された数値は10未満です。", vbExclamation, "結果"
        Case 10 To 19
            MsgBox "入力された数値は10以上20未満です。", vbInformation, "結果"
        Case 20 To 29
            MsgBox "入力された数値は20以上30未満です。", vbInformation, "結果"
        Case Else
            MsgBox "入力された数値は30以上です。", vbInformation, "結果"
    End Select
End Sub

Select Case文を使って、入力された数値に応じてメッセージを表示します。上記は数値ですが文字列の場合はどうでしょうか、以下に特定の文字のときに返答するSelect Case文になります。

Sub CheckStringWithSelectCase()
    Dim userInput As String
    
    ' InputBoxでユーザーに文字列を入力させる
    userInput = InputBox("文字列を入力してください:", "文字列チェック")
    
    ' Select Case文で文字列に応じたメッセージを表示
    Select Case userInput
        Case "こんにちは"
            MsgBox "こんにちは!元気ですか?", vbInformation, "挨拶"
        Case "さようなら"
            MsgBox "さようなら!また会いましょう!", vbInformation, "挨拶"
        Case "ありがとう"
            MsgBox "どういたしまして!", vbInformation, "感謝"
        Case "はい"
            MsgBox "はい、了解しました。", vbInformation, "承認"
        Case "いいえ"
            MsgBox "いいえ、承知しました。", vbInformation, "拒否"
        Case Else
            MsgBox "入力された文字列は認識されませんでした。", vbExclamation, "エラー"
    End Select
End Sub

複数の値や範囲の指定

Caseの後に複数の値や範囲を指定することもできます。例えば、ユーザーに曜日を入力させ、平日か週末かを判定する例を考えてみましょう。

Sub CheckDayWithSelectCase()
    Dim userInput As String
    
    ' InputBoxでユーザーに曜日を入力させる
    userInput = InputBox("曜日を入力してください(例:月曜日、火曜日など):", "曜日チェック")
    
    ' Select Case文で曜日に応じたメッセージを表示
    Select Case userInput
        Case "月曜日", "火曜日", "水曜日", "木曜日", "金曜日"
            MsgBox "平日です。", vbInformation, "結果"
        Case "土曜日", "日曜日"
            MsgBox "週末です。", vbInformation, "結果"
        Case Else
            MsgBox "入力された曜日は認識されませんでした。", vbExclamation, "エラー"
    End Select
End Sub

Case “月曜日”, “火曜日”, “水曜日”, “木曜日”, “金曜日”のように、カンマで区切って複数の値を一つのCaseブロックにまとめています。
これにより、平日をまとめて扱うことができます。Case “土曜日”, “日曜日”のように、週末も同様に一つのCaseブロックにまとめています。

記事