こんにちは。ECF Tech担当
Michiharu.Tです。
Excel VBA入門の第5回です。
今回はプログラムの実行順序をコントロールする制御構文についてご紹介します。くり返しや分岐といった制御方法を学ぶことで、プログラムをより効率的に記述できます。
今回もよろしくお願いいたします。本連載の目次は下記よりご覧頂けます。

[PR]
Excel VBAの実力を認定するVBAエキスパート試験の対策本です。

制御構造
制御構造は、プログラムを構成する処理の流れのことで「順次」「分岐」「反復」の3つがあります。

- 順次:命令を上から順に実行する。
- 分岐:条件に基づき、実行する命令をいずれかに決定する。
- 反復:条件に基づき、同じ命令をくり返す。
制御構文は、このうち分岐と反復を実現する構文です。
条件式
条件式とは、演算結果がTrueまたはFalseと評価される式のことです。TrueとFalseは簡単に言えばYesとNoです。
条件式を作る一般的な方法は、比較演算子を使う方法です。次のような演算子を用いることで、条件式をつくることができます。
| 演算子 | 条件式の例 | 例の意味 |
|---|---|---|
| = | a = 5 | aと5は等しい |
| <> | a <> 5 | aと5は異なる |
| <= | a <= 5 | aは5以下である |
| >= | a >= 5 | aと5以上である |
| < | a < 5 | aは5より小さい |
| > | a > 5 | aは5より大きい |
次のプログラムで動作を確認してみましょう。
Sub マクロ1()
Dim a As Integer
a = 5
Range("A1").value = (a = 5)
Range("A2").value = (a <> 5)
Range("A3").value = (a <= 5)
Range("A4").value = (a >= 5)
Range("A5").value = (a < 5)
Range("A6").value = (a > 5)
End Sub
実行結果は次のようになります。

A1~A6セルに条件式の結果をそれぞれ代入しています。()で囲まれた部分が条件式です。()は無くても問題ないのですが、代入の=と混同して見づらくなるのを防ぐために入れています。
条件式は、式の内容が正しいかどうかの判定が行われます。例えばプログラム中のa = 5は「aは5である」という条件式です。3行目で変数aには5が代入されていますので、「aは5である」は正しい式です。したがって、式の結果が代入されるA1セルは「TRUE」となっています。他の条件式も、上の比較演算子の一覧表を元に確認してみましょう。
If Then Elseステートメント
ここから制御構文に入ります。まずはVBAにおける代表的な分岐構文である「If Then Elseステートメント」です。正式名称が長いので、以降は「Ifステートメント」で表記します。基本的な書き方は次のようになります。
If 条件式1 Then
'条件式1がTrueの場合の処理
ElseIf 条件式2 Then
'条件式2がTrueの場合の処理
Else
'いずれの条件式もFalseの場合の処理
End If
下のプログラムを例に動作を確認してみましょう。
Sub マクロ2()
Dim value
value = Range("A1").value
If value > 10 Then
Range("A2").value = "valueは10より大きい"
ElseIf value < 5 Then
Range("A2").value = "valueは5より小さい"
Else
Range("A2").value = "valueは5~10の値"
End If
End Sub
実行結果は、A1に入っている値によって次のように変化します。A1の値を変更してからマクロを実行する。を何度か試してみましょう。

このマクロではA1セルの値によって、処理を分岐しています。Ifステートメントを使うことで
value > 10の場合value < 5の場合- それ以外の場合
の3つのパターンに分けて処理を書いています。
Ifステートメントは
ElseIf 条件式 Then
'条件式がTrueの場合の処理
の部分を増やすことで、さらに処理パターンを増やすことができます。次のプログラムで確認してみましょう。
Sub マクロ3()
Dim value
value = Range("A1").value
If value = 5 Then
Range("A2").value = "大吉"
ElseIf value = 4 Then
Range("A2").value = "中吉"
ElseIf value = 3 Then
Range("A2").value = "小吉"
ElseIf value = 2 Then
Range("A2").value = "吉"
Else
Range("A2").value = "凶"
End If
End Sub
A1セルの値に応じて、A2セルにおみくじ結果を表示するプログラムです。実行結果は次のようになります。

ElseIfの表記をいくつも使用し、多数の分岐を実現しています。こちらも、A1セルの値を色々変化させて何度か試してみましょう。
Select Caseステートメント
Select Caseステートメントを使うと、式の値に応じた分岐ができます。基本的な文法は次のようになります。
Select Case 変数
Case 値1
'変数が値1の場合の処理
Case 値2
'変数が値2の場合の処理
Case Else
'変数が値1,値2のいずれでもない場合の処理
End Select
先ほどのおみくじプログラムをSelect Caseステートメント使って書きかえると次のようになります。
Sub マクロ4()
Dim value
value = Range("A1").value
Select Case value
Case 5
Range("A2").value = "大吉"
Case 4
Range("A2").value = "中吉"
Case 3
Range("A2").value = "小吉"
Case 2
Range("A2").value = "吉"
Case Else
Range("A2").value = "凶"
End Select
End Sub
Select Case valueと記述していますので、変数valueの値に応じて分岐することになります。たとえば変数valueの値が5ならCase 5の部分に処理がジャンプし、A2に「大吉」が表示されます。Case 値のいずれにも該当しない値だった場合はCase Elseに処理がジャンプします。変数valueが1などの場合が該当します。こちらもA1セルの値を色々変更して、マクロを実行してみましょう。
For Nextステートメント
ここからくり返しを実現する構文をご紹介します。始めにFor Nextステートメントです。基本的な書き方は次のようになります。
For 変数 = 開始値 To 終了値 Step 増加値
'くり返し行いたい処理
Next 変数
上記の文法を説明すると「変数を開始値から終了値まで増加値ずつ増やしながら、くり返し処理を行います。」となります。
実際にプログラム例で体感する方がわかりやすいので、いくつかのプログラム例をご紹介します。
Sub マクロ5()
Dim i
For i = 1 To 10 Step 1
Range("A" & i).value = i
Next i
End Sub
実行すると、下のようにA1~A10セルに1~10の値が入ります。

For i = 1 To 10 Step 1の部分は、「変数iを1~10まで、1ずつ増やしながらくり返す」という意味です。ForとNextで囲んだ範囲をくり返し処理するので、Range("A" & i).value = iの部分が10回実行されます。iはくり返しのたびに「1,2,3・・・・」と値が変化しますので、Range("A" & i)の部分は「A1,A2,A3・・・」という形で、対象セルが変化します。下図はくり返し処理ごとのiの変化を示しています。

これにより、A1~A10セルに1~10のそれぞれの値を設定する処理を実現しています。
Do Whileステートメント
Do Whileステートメントも代表的なくり返し構文の1つです。基本的な書き方は次のようになります。
Do While 条件式
'くり返し行いたい処理
Loop
条件式の判定結果がTrueである間、Do WhileとLoopで囲んだ範囲をくり返し処理します。
次のプログラム例で、Do Whileステートメントの動作を見てみましょう。
Sub マクロ6()
Dim i
i = 1
Do While Range("A" & i).Value <> ""
Range("B" & i).Value = "〇"
i = i + 1
Loop
End Sub
下図左のような状態で実行すると、下図右のような実行結果を得ることができます。

プログラムが行っている処理は、「A列を順番に見ていって、セルに値が入っている間、B列に〇を設定する。」です。
Do Whileステートメントは、くり返し処理のたびに条件式を判定し、条件式がTrueなら、Do WhileとLoopで囲んだ部分の処理を行う。という動作をします。下図はDo Whileステートメント部分の処理の流れを示したものです。
①~③の処理内容は次のとおりです。
- ① 対象セル(A1,A2,A3....)の値が空かどうかを判定する。
- ② B列の各セル(B1,B2,B3....)に
〇をセットする。 - ③ iの値を1加算する。
今回の実行例では、①~③の処理が上図のように4回実行されます。5回目の処理では判定対象のA5セルの値が空です。そのため、条件式がFalseとなるため、くり返し処理が終了します。
制御構文の入れ子
制御構文の中に、制御構文を入れてプログラムを書くことができます。このような構造は入れ子またはネストと呼ばれています。入れ子を使うことでより複雑な処理を実現できます。いくつかのプログラムを題材に、制御構文の入れ子について学びましょう。
特定の値を探す
次のプログラムは、C1セルに設定した値をA列から探すマクロです。
Sub マクロ7()
Dim i As Integer
'1行目から6行目までをくり返し見ていく
For i = 1 To 6
'C1の値と一致するかをチェック
If Range("A" & i).Value = Range("C1").Value Then
'一致したらメッセージを出力
MsgBox i & "行目に見つかりました。"
End If
Next i
End Sub
セルC1の値と一致するものが、A1~A6の間で見つかった場合は次のように動作します。見つからなかった場合は、特に何も起こりません。

このプログラムでは、For Nextステートメントの中にIfステートメントが含まれています。For Nextステートメントの変数iは1~6まで変化するので6回くり返しを行ないます。くり返し処理内でIfステートメントを使うことで、Ifステートメントの条件式は次のように6回の判定を行ないます。
- A1とC1の値は一致しているか
- A2とC1の値は一致しているか
- A3とC1の値は一致しているか
- A4とC1の値は一致しているか
- A5とC1の値は一致しているか
- A6とC1の値は一致しているか
一致していれば、変数iの値を使って「〇行目に見つかりました。」のメッセージを表示しています。
表に各値を設定する
次のプログラムはかけ算九九の表を作成するマクロです。
Sub マクロ8()
Dim i As Integer
Dim j As Integer
For i = 1 To 9 '段の表示
For j = 1 To 9 '段の各かけ算を行う
Cells(i, j).Value = i * j
Next j
Next i
End Sub
くり返し処理の中にくり返し処理を含める二重ループと呼ばれる書き方です。外側のくり返し(For Nextステートメント)の中に、9回のくり返しを行うFor Nextステートメントが含まれています。つまり、外側のくり返し1回のたびに、内側のくり返しが9回実行されます。
外側のくり返しも9回実行されますので、Cells(i, j).Value = i * jの部分は9×9で81回実行されます。変数iとjの値は下表のように変化しますので、i * jの部分で九九のかけ算ができていることになります。

本日はここまでとさせて頂きたいと思います。最後までお読み頂き、ありがとうございました。次回も様々なプログラムをご紹介したいと思います。ひきつづき、よろしくお願いいたします。



