次に、これもプログラミングに欠かせない条件分岐について解説する。まずは、二者択一の条件分岐だ。構文は下記のようになる
If {条件式} Then
{ステートメント}
End If
{ステートメント}とは、この場合「決まった処理を行う命令」のことを指す。
例えば、図4のようなデータがあったとする。
「電話番号」に未入力のセルがあると「電話番号」というシート名の背景色を赤に変化させる、VBAはリスト3のようになる。先ほどのFor〜Nextも使われている。
Option Explicit Private Sub Worksheet_Activate() Dim i As Integer For i = 4 To 9 If IsEmpty(Cells(i, 3)) = True Then ActiveSheet.Tab.Color = RGB(255, 0, 0) Exit For End If Next End Sub
今回は、「電話番号」ワークシートがアクティブになったときに処理を行う。Worksheet_Activate内に処理を記述する。
「セル4」〜「セル9」までをFor〜Next文で繰り返し処理を行い、IsEmpty関数を使って、その中に空白セルがあれば、「電話番号」ワークシートのタブの背景色を赤に変化させている。
空白処理が見つかった時点でExit Forで繰り返し処理から抜けている。この1文を記述しないと、最後まで空白のチェックがされ、最後のセルにデータが入っていると、データが全て入力されていると判断されてしまう。
そこで、空白が見つかった時点で繰り返し処理のループから抜ける必要がある。処理を抜けるには、この場合「Exit For」を使用する。
IsEmpty関数は、指定した値が空ならTrueを返し、それ以外はFalseを返す関数だ。
実行すると図5のようになる。
しかし、このコードではまずい点がある。このままでは「正岡団子」の「電話番号」の空白セルにデータを入力しても、「電話番号」タブが赤になったままなのだ。これを解消するには、指定した条件以外の処理を記述する必要がある。
先のリスト3では二者択一の条件式を使っていた。「データが空ならワークシートのタブを赤にする」で終わっている。よって、「データが入力されたらどうするか」といった処理が記述されていないのだ。そこで、「指定した条件以外の処理」の構文を使って、データが入力されたなら、ワークシートのタブを元の色に戻す処理を書く必要がある。
If {条件式} Then
{ステートメント1}
Else
{ステートメント2}
End If
{ステートメント2}には{ステートメント1}以外の処理を記述する。
リスト3をリスト4のように書き直す。
Private Sub Worksheet_Activate() Dim i As Integer For i = 4 To 9 If IsEmpty(Cells(i, 3)) = True Then ActiveSheet.Tab.Color = RGB(255, 0, 0) Exit For Else ActiveSheet.Tab.Color = RGB(255, 255, 255) End If Next End Sub
赤文字が追加した処理だ。Elseの後に、ワークシートのタブを「白」に戻している。実行画面は省略する。
次は複数の条件に応じて処理を分岐する処理について解説しよう。
If {条件1} Then
{ステートメント1}
ElseIf 条件2} Then
{ステートメント2}
ElseIf 条件3} Then
{ステートメント3}
……
Else
{ステートメントN}
End If
図6のような社員の年齢表があったとする。
この表の中から、年齢が20〜30歳までのセルの背景色を「赤」、30〜40歳までを「青」、50〜60歳までを「緑」、60歳以上を「黄」で塗りつぶしてみよう。マクロはリスト5のようになる。
Option Explicit Private Sub Worksheet_Activate() Dim i As Integer Dim age As Integer For i = 4 To 12 If Range("C" & i).Value >= 20 And Range("C" & i).Value < 30 Then Range("C" & i).Interior.ColorIndex = 3 ElseIf Range("C" & i).Value >= 30 And Range("C" & i).Value <= 40 Then Range("C" & i).Interior.ColorIndex = 5 ElseIf Range("C" & i).Value >= 50 And Range("C" & i).Value < 60 Then Range("C" & i).Interior.ColorIndex = 10 Else Range("C" & i).Interior.ColorIndex = 27 End If Next End Sub
比較演算子を使って複数の条件分岐を行い、年代別にセルの背景色を変えた。
以下の表は、数値の比較で使う比較演算子の種類と意味だ。
演算子 | テスト条件 | 例 |
---|---|---|
=(等しい) | 1番目の式の値と2番目の式の値が等しいかどうか | 23 = 33 ' False 23 = 23 ' True 23 = 12 ' False |
<>(等しくない) | 1番目の式の値と2番目の式の値が等しくないかどうか | 23 <> 33 ' True 23 <> 23 ' False 23 <> 12 ' True |
<(より小さい) | 1番目の式の値が2番目の式の値よりも小さいかどうか | 23 < 33 ' True 23 < 23 ' False 23 < 12 ' False |
>(より大きい) | 1番目の式の値が2番目の式の値よりも大きいかどうか | 23 > 33 ' False 23 > 23 ' False 23 > 12 ' True |
<=(以下) | 1番目の式の値が2番目の式の値よりも小さい、または等しいかどうか | 23 <= 33 ' True 23 <= 23 ' True 23 <= 12 ' False |
>=(以上) | 1番目の式の値が2番目の式の値よりも大きい、または等しいかどうか | 23 >= 33 ' False 23 >= 23 ' True 23 >= 12 ' True |
「Visual Basicにおける比較演算子 - MSDN」より引用 |
数値以外の比較演算子の使い方については「Visual Basicにおける比較演算子 - MSDN」を参照してほしい。
ここで使用している「And」演算子は全ての条件を満たす場合はTrueを返し、それ以外はFalseを返す。
「二項論理演算子」には、これ以外に「Or」演算子がある。これはいずれかの条件を満たす場合はTrue、それ以外はFalseを返す。
簡単に言うとAndは「かつ」、Orは「または」という意味だ。AndやOrなど「二項論理演算子」の種類と意味については「Visual Basicの論理演算子とビット処理演算子 - MSDN」を参照してほしい。
実行すると図7のように表示される。この場合実行とは、「社員年齢」というワークシートがアクティブになったとき(Activate)を指す。
Copyright © ITmedia, Inc. All Rights Reserved.