プログラムの肝! 条件分岐と繰り返しの基本文法とさまざまな書き方:Excelマクロ/VBAで始める業務自動化プログラミング入門(6)(2/4 ページ)
プログラミング初心者を対象にExcelマクロ/VBAを使った業務自動化プログラムの作り方を一から解説します。今回は、For〜Next、Step、If〜Then、Else、Exit、比較演算子、Select〜Case、Do While/Until〜Loopの使い方などを解説する【Windows 10、Excel 2016に対応】。
If〜Thenによる二者択一の条件分岐
次に、これもプログラミングに欠かせない条件分岐について解説する。まずは、二者択一の条件分岐だ。構文は下記のようになる
If〜Then構文
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で繰り返し処理から抜ける
空白処理が見つかった時点でExit Forで繰り返し処理から抜けている。この1文を記述しないと、最後まで空白のチェックがされ、最後のセルにデータが入っていると、データが全て入力されていると判断されてしまう。
そこで、空白が見つかった時点で繰り返し処理のループから抜ける必要がある。処理を抜けるには、この場合「Exit For」を使用する。
IsEmpty関数は、指定した値が空かどうか判定
IsEmpty関数は、指定した値が空ならTrueを返し、それ以外はFalseを返す関数だ。
実行結果
実行すると図5のようになる。
しかし、このコードではまずい点がある。このままでは「正岡団子」の「電話番号」の空白セルにデータを入力しても、「電話番号」タブが赤になったままなのだ。これを解消するには、指定した条件以外の処理を記述する必要がある。
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
赤文字が追加した処理だ。Elseの後に、ワークシートのタブを「白」に戻している。実行画面は省略する。
ElseIfで複数の条件に応じた条件分岐処理
次は複数の条件に応じて処理を分岐する処理について解説しよう。
If〜Then〜ElseIf〜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.
関連記事
- Excelマクロ/VBAリファレンス用途別・キーワード別一覧超まとめ
- ピボットテーブルとは何か──「そもそも、何をする機能か」を理解する
Excelを通じて「ピボットテーブル」の基礎を学び、データ分析を実践するまでを習得する本連載。初回はピボットテーブルの基礎と、「どんなことができるのか」を解説する。 - どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう。