VBAのプログラムは、上から下へという流れで処理されていきます。しかし、さまざまな条件に応じて、その流れ方を部分的に変更したい場合もあります。そのような処理を「条件分岐」といいます。
Ifステートメントによる条件分岐 |
- 「If〜」ステートメントは、「もし〜なら・・・・する」という命令
- 条件式が真(True)であるとき指定した処理が実行される
- 「If」に続く分岐の仕方や記述の仕方によっていくつかの構文がある
|
■1行のIfステートメント
基本構文:
If 条件式 Then 命令文
- 「もし〜なら・・・・する」の「・・・・する」の部分が1命令の場合に使う
使用例:
Dim iintLoop As Integer
For iintLoop = 1 To 10
If iintLoop < 5 Then Debug.Print iintLoop
Next iintLoop
■If〜End If構文
基本構文:
If 条件式 Then
〜〜〜〜〜〜
〜〜〜〜〜〜
〜〜〜〜〜〜
End If
- 「もし〜なら・・・・する」の「・・・・する」の部分が複数行に渡る場合に使う
- 条件式が真であるとき、IfとEnd Ifで囲まれた部分が実行される
使用例:
Dim iintLoop As Integer
For iintLoop = 1 To 10
If iintLoop < 5 Then
Debug.Print iintLoop
Debug.Print iintLoop * 2
End If
Next iintLoop
■If〜Else〜End If構文
基本構文:
If 条件式 Then
〜〜〜〜〜〜
〜〜〜〜〜〜
Else
〜〜〜〜〜〜
〜〜〜〜〜〜
End If
- 「もし〜なら・・・・して、そうでなければ****する」というように、条件によって2つの処理を切り替えたい場合に使う
- 「もし〜なら」の条件式が真のときはIfとElseで囲まれた部分が実行される
- 偽のときはElseとEnd Ifで囲まれた部分が実行される
使用例:
For iintLoop = 1 To 10
If iintLoop < 5 Then
Debug.Print "5未満です"
Else
Debug.Print "5以上です"
End If
Next iintLoop
■If〜ElseIf〜End If構文
基本構文:
If 条件式1 Then
〜〜〜処理A〜〜〜
〜〜〜〜〜〜
ElseIf 条件式2 Then
〜〜〜処理B〜〜〜
〜〜〜〜〜〜
Else
〜〜〜処理C〜〜〜
〜〜〜〜〜〜
End If
- 条件式1に当てはまるときは処理Aが実行される
- 条件式1には当てはまらないが条件式2には当てはまるときは処理Bが実行される(ElseIfは複数記述可)
- 条件式1にも条件式2にも当てはまらないときは処理Cが実行される(省略可)
- 「If〜Else〜End If」をさらに高度にしたもので、分岐条件が2つ以上ある場合に使う
- 複数のIf構文をネストする(入れ子状にする)こともできる
使用例:
For iintLoop = 1 To 10
If iintLoop < 5 Then
Debug.Print "5未満です"
ElseIf iintLoop < 8 Then
Debug.Print "5以上8未満です"
Else
Debug.Print "8以上です"
End If
Next iintLoop
■サブルーチン
全体的な処理は分岐しても、その一部分はまったく同じ処理をするようなケースがあります。たとえば次のような構造になっている場合です。
このケースでは、条件式1が真のときは処理Xのみを、条件式2が真のときは処理Yのみを、いずれでもないときは処理Xと処理Yの両方を実行します。
このようなとき、共通的な一連の処理(処理Xや処理Y)を別の場所にまとめておき、「GoSub〜Return」ステートメントを使って呼び出すようにすると、プログラムをシンプルにすることができます。別の場所のひとまとまりを「サブルーチン」を呼びます。サブルーチンは、Ifステートメントに限らずさまざまな場所で利用できます。
これを使うと、上記の例は次のように書くことができます。
- Gosub命令で、指定したラベルで始まるサブルーチンへジャンプします。
- 「SubProcX:」のように、任意の名称と「:(コロン)」を組み合わせて宣言された行を「ラベル」と呼びます。この行は実行されませんが、コードの行を識別するしおりの役割を果たします。
- Return命令で、元の本流に戻ります。
- 途中でプロシージャを強制的に抜けるには、「Exit Sub」あるいは「Exit Function」を記述します。
IIf関数 |
処理の流れを変えるのではなく、1つの変数に代入する値を条件によって切り替えるような場合には、「IIf」関数が便利です。この関数では、1番目の引数に条件式を指定し、もしそれが真であれば2番目の引数を、そうでなければ3番目の引数を返します。
Dim strData As String
strData = IIf(Year(Date) > 2009, "未来", "今年か過去")
Debug.Print strData
|
Select Caseステートメントによる条件分岐 |
基本的には、Ifステートメントを使うことでどんな条件分岐も処理できます。しかし、「“同じ変数に対して”条件比較を繰り返す」ような場合には、「Select Case」ステートメントを使うことによって、プログラムをすっきりさせることができます。また、似た条件式を何度も書かずに済みため、記述ミスを減らすこともできます。
この構文では、「Select Case」の次に指定した変数の値と各「Case」節の値を順番に比較し、Case節の値と一致したとき、その次に書かれたコードを実行します。そして、次のCase節が出てきたところで「End Select」へジャンプして、分岐処理を抜けます。
|
基本構文:
Select Case 変数
Case 値1
〜〜〜処理A〜〜〜
〜〜〜〜〜〜
Case 値2
〜〜〜処理B〜〜〜
〜〜〜〜〜〜
Case 値3
〜〜〜処理C〜〜〜
〜〜〜〜〜〜
Case Else
〜〜〜処理D〜〜〜
〜〜〜〜〜〜
End Select
- 変数の値が値1と等しいとき処理Aが実行される
- 同様に、変数の値が値2と等しいときは処理Bが、値3と等しいときはは処理Cが実行される
- 変数の値がいずれのCase節の値とも一致しない場合は処理Dが実行される
- 各Case節の命令文(処理Aなど)は複数行記述できる
- Case節はいくつでも設定できる
使用例:
Dim intGakunen As Integer
intGakunen = 1 ←ここを変えてみる
Select Case intGakunen
Case 1
Debug.Print "1年生です!"
Case 2
Debug.Print "2年生です!"
Case 3
Debug.Print "3年生です!"
Case 4
Debug.Print "4年生です!"
Case Else
Debug.Print "学年に誤りがあります!"
End Select
Case節の応用 |
Case節には、単一の値ではなく、複数の値や、値の範囲を指定することもできます。
- Case 1, 2, 5
変数値が1または2または5であるとき処理を行う
- Case 1 To 3
変数値が1から3の範囲であるとき処理を行う
- Case Is > 100
変数値が100より大きいとき処理を行う
|
Choose関数 |
各Case節でまったく違う処理を行なうのではなく、すべてのCase節が同じ変数に値を代入するような操作であれば、「Choose」関数に置き換えることによってプログラムをシンプルにすることができます。
例:
今日の曜日を表示する例:
Debug.Print Choose(Format(Date, "w") ,"日", "月",
"火", "水", "木", "金", "土")
Choose関数では、1番目の引数が分岐条件式となります。その式の値が「1」のときは2番目の引数の値(“日”)が、「2」のときは3番目の引数の値(“月”)が返されます。つまり、分岐条件式の値が1、2、3、4、5というような単純な値を返すときにだけ使うことができます。「1以上3以下」のような条件を扱うことはできません。
|
|