連載
» 2016年08月10日 05時00分 公開

プログラムの肝! 条件分岐と繰り返しの基本文法とさまざまな書き方Excelマクロ/VBAで始める業務自動化プログラミング入門(6)(2/4 ページ)

[薬師寺国安,PROJECT KySS]

If〜Thenによる二者択一の条件分岐

 次に、これもプログラミングに欠かせない条件分岐について解説する。まずは、二者択一の条件分岐だ。構文は下記のようになる

If〜Then構文

If {条件式} Then

 {ステートメント}

End If


 {ステートメント}とは、この場合「決まった処理を行う命令」のことを指す。

 例えば、図4のようなデータがあったとする。

図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
リスト3 電話番号欄に未入力の箇所があると「電話番号」というシート名の背景色が「赤」になる

 今回は、「電話番号」ワークシートがアクティブになったときに処理を行う。Worksheet_Activate内に処理を記述する。

 「セル4」〜「セル9」までをFor〜Next文で繰り返し処理を行い、IsEmpty関数を使って、その中に空白セルがあれば、「電話番号」ワークシートのタブの背景色を赤に変化させている。

Exit Forで繰り返し処理から抜ける

 空白処理が見つかった時点でExit Forで繰り返し処理から抜けている。この1文を記述しないと、最後まで空白のチェックがされ、最後のセルにデータが入っていると、データが全て入力されていると判断されてしまう。

 そこで、空白が見つかった時点で繰り返し処理のループから抜ける必要がある。処理を抜けるには、この場合「Exit For」を使用する。

IsEmpty関数は、指定した値が空かどうか判定

 IsEmpty関数は、指定した値が空ならTrueを返し、それ以外はFalseを返す関数だ。

実行結果

 実行すると図5のようになる。

図5 電話番号に空白のデータがあると「電話番号」シートのタブの背景色が赤のグラデーションになる。Sheet2をアクティブにすると「電話番号」タブは赤で塗りつぶされる

 しかし、このコードではまずい点がある。このままでは「正岡団子」の「電話番号」の空白セルにデータを入力しても、「電話番号」タブが赤になったままなのだ。これを解消するには、指定した条件以外の処理を記述する必要がある。

Elseで指定した条件以外の処理

 先のリスト3では二者択一の条件式を使っていた。「データが空ならワークシートのタブを赤にする」で終わっている。よって、「データが入力されたらどうするか」といった処理が記述されていないのだ。そこで、「指定した条件以外の処理」の構文を使って、データが入力されたなら、ワークシートのタブを元の色に戻す処理を書く必要がある。

If〜Then〜Else構文

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
リスト4 空白セルにデータが入力された場合は、ワークシートタブの色を元に戻する処理を追加

 赤文字が追加した処理だ。Elseの後に、ワークシートのタブを「白」に戻している。実行画面は省略する。

ElseIfで複数の条件に応じた条件分岐処理

 次は複数の条件に応じて処理を分岐する処理について解説しよう。

If〜Then〜ElseIf〜Else構文

If {条件1} Then

 {ステートメント1}

ElseIf 条件2} Then

 {ステートメント2}

ElseIf 条件3} Then

 {ステートメント3}

……

Else

 {ステートメントN}

End If


 図6のような社員の年齢表があったとする。

図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
リスト5 年代別にセルの背景色を変えた

条件分岐でよく出てくる「比較演算子」を使う

 比較演算子を使って複数の条件分岐を行い、年代別にセルの背景色を変えた。

 以下の表は、数値の比較で使う比較演算子の種類と意味だ。

表 主な比較演算子の種類と意味
演算子 テスト条件
=(等しい) 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)を指す。

図7 年代別に年齢の背景色が色分けされた

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。