これまで説明してきた変数と関数だけでも結構気の利いた処理ができます。でも、もっと複雑な処理をするためには、もう少しプログラムらしいことを学ぶ必要があります。今回はプログラムの3つ目の要素「条件分岐」について説明します。
条件分岐とは
文字通り、「条件に従って処理を分岐」するものです。
プログラムは基本的に上流から下流へと処理が流れていきます。「マクロの記録」を使って作成したプログラムは、ユーザーの操作の流れをそのまま記録したものですので、非常に単純な流れになっています。
[処理A]
↓
[処理B]
↓
[処理C]
大抵の処理はこのような順次実行(シーケンシャル)のプログラムで事足りると思いますが、ちょっと手の込んだ(気の利いた)処理が必要な場合もあります。
たとえば、「検索した文字列が太字の場合は、フォントをMSゴシックに変更するが、それ以外の場合は太字を解除してハイライト表示する」など、一度の処理では対処できないことがあります。
[条件] → [処理B]
↓
[処理A]
これをプログラムで処理するのが、「If-Thenステートメント」です。
If-Thenステートメント
VBAでは次のような書式になります。
If 条件 Then
処理A
Else
処理B
End If
条件が満たされた場合、処理Aを実行し、条件が満たされない場合、処理Bを実行します。先程の例をIf-Thenステートメントで表してみます。
If 文字列が太字 Then
フォントをMSゴシックに変更する
Else
フォントの太字を解除して
ハイライト表示にする
End If
おわかりいただけたでしょうか。これがIf-Thenステートメントの基本形です。
処理Aだけが必要な場合は、Else部分は不要です。
If 文字列が太字 Then
フォントをMSゴシックに変更する
End if
この場合、太字以外のフォントは処理されません。このようにシンプルな処理の場合、このステートメントは1行で書くこともできます。
If 文字列が太字 Then フォントをMSゴシックにする
*この場合、End IFは不要です。また、見やすさという点から、1行での処理はお勧めしません。
さらに条件を追加することもできます。
If 条件1 Then
処理A
ElseIf 条件2 Then
処理B
ElseIf 条件3 Then
処理C
ElseIf 条件4 Then
処理D
...
End If
このように「ElseIf-Then」を入れることで複数の条件で処理できます。
条件について
ここで条件について説明します。
If-Thenステートメントに使用される条件とは「True(真)」か「False(偽)」かを判定する式です。条件が「True」(条件が満たされた)場合にのみThen以下の処理が実行されます。この条件式に使用されるのが、前回説明した「比較演算子」と「論理演算子」です。
例)
文字数 > 10
フォント = 太字
文字列 = "テスト" And フォント = 斜体
入れ子
If-Thenステートメントの中にさらにIf-Thenステートメントを挿入することができます(入れ子構造)。
If 条件1 Then
If 条件2 then
処理A
Else
処理B
End If
Else
If 条件3 Then
処理C
Else
処理D
End If
End If
さらに複雑な入れ子構造も可能ですが、ほどほどにしないとエラー&処理速度の低下の元になります。読みやすく、シンプルな処理を目指してください。
Select Caseステートメント
先に挙げた「If-Then-ElseIf~」ですが、これは条件1、条件2…と1度に1回しか分岐が行われません。また、ElseIfの数が増えるほど複雑になり見た目もよくありません。そこで、もう少しスマートに処理できる「Select Caseステートメント」があります。これは、ある式の結果に応じて処理を変えたい場合に使用します。書式は次のとおりです。
Select Case 評価変数
Case 評価値1
処理A
Case 値2
評価処理B
Case 値3
評価処理C
...
End Select
「評価変数」は条件とは異なります。条件はTrueまたはFalseですが、評価変数は値(文字列を含む)です。例を挙げてみます。
Select Case 時給
Case 0
MsgBox "休み?"
Case 1 to 1999
MsgBox "不調?"
Case 2000 to 2999
MsgBox "まあ普通だね。"
Case 3000 to 4999
MsgBox "好調!"
Case Is >= 5000
MsgBox "絶好調!"
End Select
例は今ひとつですが、何となくおわかりいただけたでしょうか。
今回は条件分岐について説明しました。条件分岐は、あまりプログラムであることを意識せずに論理的に考えることが大切だと思います。
次回は反復処理について説明します。これも条件分岐の一種です。
では、また。