「制御構文」とは?
VBAなどのプログラム言語には「制御構文」というものがあります。
制御構文とは、プログラミングにおいて、処理を分岐させたり、繰り返したりする事です。
まずはVBAの制御構文の1つ「If~Else」について解説します。
制御構文「If~Else ステートメント」について
まず最初は「If~Else ステートメント」について解説します。
この「ステートメント」の意味ですが、プログラミングの世界では一つの構成単位、文やブロック、などとも呼ばれています。
つまり1つの制御構文の範囲の事を意味しています。
以下に「If~Else」を用いたサンプルを用意しました。
Sub test9()
Dim Num As Integer
Num = 10
If Num >= 5 Then
MsgBox "Numは5以上です。"
Else
MsgBox "Numは5以上ではありません。"
End If
End Sub
まず変数Numに10を代入しています。
次に、「If Num >= 5 Then」と書かれており、「End If」と記述された行があります。
ここまでが「If~Else ステートメント」です。
この「If~Else ステートメント」を1つずつ解説していきます。
まず「If~Else」の構文は以下の通りになります。
If <条件式> Then
最初に「If」を書き、次に「条件式」を書いて、最後に「Then」を書きます。
このサンプルの条件式は「Num >= 5」であり、比較演算子を使って変数Numが5以上である事を確認しています。
比較演算子は、比較がその通りなら「True(真)」、そうでなければ「False(偽)」を返します。
IF文は、「True(真)」と「False(偽)」によって、プログラム実行の条件分岐します。
つまり、以下「画像2」のように条件分岐されます。
- 条件式が「True(真)」の場合、「If~Else」の間のプログラムが実行される
- 条件式が「False(偽)」の場合、「Else~End If」の間のプログラムが実行される
この場合は、変数Numが「10」であるため、「True(真)」になります。
よって、「MsgBox “Numは5以上です。”」が実行されます。
このように、プログラムでは何か条件に応じて、処理を分岐させたい場合があります。
「IF~ELSE ステートメント」(IF文)を使う事により、プログラムの処理を分岐させる事が可能です。
「ElseIf」について
先程のサンプルでは、処理を2つに分岐しました。
しかし中には、もっと条件分岐させたいケースもあります。
そんな時に使うのが「ElseIf <条件式> Then」です。
以下のサンプルを見て下さい。
Sub test9a()
Dim Num As Integer
Num = 10
If Num <= 5 Then
MsgBox "Numは5以下です。"
ElseIf Num = 20 Then
MsgBox "Numは20です。"
ElseIf Num = 30 Then
MsgBox "Numは30です。"
Else
MsgBox "Numは5以下でも20でも30でもありません。"
End If
End Sub
「If」と「Else」の間に「ElseIf Num = 20 Then」と「ElseIf Num = 30 Then」が加わっています。
これは次のように処理が行われます。
- 「If Num <= 5 Then」の条件式を判定し、「True(真)」なら「If Num <= 5 Then」~「ElseIf Num = 20 Then」の間のプログラムを実行
- 「If Num <= 5 Then」が「False(偽)」なら、「ElseIf Num = 20 Then」の条件式を判定し、「True(真)」なら「ElseIf Num = 20 Then」~「ElseIf Num = 30 Then」の間のプログラムを実行
- 「If Num <= 5 Then」・「ElseIf Num = 20 Then」が「False(偽)」なら、「ElseIf Num = 30 Then」の条件式を判定し、「True(真)」なら「ElseIf Num = 30 Then」~「Else」の間のプログラムを実行
- 「If Num <= 5 Then」・「ElseIf Num = 20 Then」・「ElseIf Num = 30 Then」が「False(偽)」なら、「Else」~「End If」の間のプログラムを実行
文字で書くと分かりにくいので、要するに「画像3」のように「IF」と「ElseIf」毎に条件をチェックして、処理を分岐します。
「If~Else ステートメント」では、分岐は必ず1つしか実行されません。
例えば「MsgBox “Numは5以下です。”」と「MsgBox “Numは30です。”」は、それぞれ条件で分岐された時の処理のため、両方のコードが実行されることはありません。
<補足情報>「論理演算子」を組み合わせた条件分岐と「Elseについて」
「論理演算子」を組み合わせた条件分岐
<条件式>を複雑にする事で、高度な条件分岐をする事ができます。
例えば以下に2つのサンプルコードを見て下さい。
Sub test9b1()
Dim Num As Integer
Num = 10
'<条件式1>
If Num >= 5 Then
MsgBox "Numは5以上です。"
'<条件式2>
ElseIf Num <= 15 Then
MsgBox "Numは15以下です。"
Else
MsgBox "Numは5以上ではありません。"
End If
End Sub
Sub test9b2()
Dim Num As Integer
Num = 10
If Num >= 5 And Num <= 15 Then
MsgBox "Numは5以上・15以下です。"
Else
MsgBox "Numは5以上・15以下ではありません。"
End If
End Sub
関数「test9b1()」と「test9b2()」を用意しました。
まず「test9b1()」を実行すると、「<条件式1>」が「True(真)」であるため、「MsgBox “Numは5以上です。”」が実行されます。
ところが「<条件式2>」を見ると、変数Numが15以下である事を確認しています。
変数Numは「10」のため、この「<条件式2>」も「True(真)」です。
しかし、既に「<条件式1>」が「True(真)」で、プログラムが実行されているため、そのまま「End If」に行き、「<条件式2>」の判定が行われません。
では、「変数Numが5以上、15以下」を判定するには、どうすれば良いでしょうか?
そこで論理演算子を使います。
「test9b2()」は論理演算子の「And」を使って条件式を書いています。
If Num >= 5 And Num <= 15 Then
この条件式は「5以上 かつ 15以下」という条件です。
変数Numは「10」のため、この条件に当てはまり、「True(真)」になるため「MsgBox “Numは15以下です。”」が実行されます。
このように、論理演算子を組み合わせる事で、IF文の条件分岐を複雑化させ、様々な条件を指定してプログラムを実行させる事が可能になります。
「Else」は省略可能
IF分で、特にElseの処理が必要なければ省略して書くことも可能です。
If Num >= 5 And Num <= 15 Then
MsgBox "Numは5以上・15以下です。"
End If