条件を満たす場合と満たさない場合で異なる処理を実行したり、条件を満たすまで同じ処理を繰り返し実行したりするなどの、コードの実行方法を制御する仕組みを「制御構造」といいます。
主な制御構造には、条件分岐とループ構造があります。
制御構造 | 構文 | 説明 |
---|---|---|
条件分岐 | 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ブロックにまとめています。