こんにちは。ECF Tech担当
Michiharu.Tです。
Excel VBA入門の第5回です。
今回はプログラムの実行順序をコントロールする制御構文についてご紹介します。くり返しや分岐といった制御方法を学ぶことで、プログラムをより効率的に記述できます。
今回もよろしくお願いいたします。本連載の目次は下記よりご覧頂けます。
制御構造
制御構造は、プログラムを構成する処理の流れのことで「順次」「分岐」「反復」の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となるため、くり返し処理が終了します。
本日はここまでとさせて頂きたいと思います。最後までお読み頂き、ありがとうございました。次回も様々なプログラムをご紹介したいと思います。ひきつづき、よろしくお願いいたします。