【初心者向け】動かして学ぶExcel VBA入門(5)

Excel VBA

こんにちは。ECF Tech担当
Michiharu.Tです。

Excel VBA入門の第5回です。

今回はプログラムの実行順序をコントロールする制御構文についてご紹介します。くり返しや分岐といった制御方法を学ぶことで、プログラムをより効率的に記述できます。

今回もよろしくお願いいたします。本連載の目次は下記よりご覧頂けます。

【初心者向け】動かして学ぶExcel VBA入門
Excel VBAを動かしながら学べる連載をお送りしています。目次第1回Excel VBAとはExcelマクロを動かしてみようExcelマクロの保存第2回セルに値を設定セルの削除オブジェクト、プロパティ、メソッド第3回ワークシートの指定様々...

制御構造

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

制御構造

  • 順次:命令を上から順に実行する。
  • 分岐:条件に基づき、実行する命令をいずれかに決定する。
  • 反復:条件に基づき、同じ命令をくり返す。

制御構文は、このうち分岐と反復を実現する構文です。

条件式

条件式とは、演算結果がTrueまたはFalseと評価される式のことです。TrueFalseは簡単に言えばYesNoです。

条件式を作る一般的な方法は、比較演算子を使う方法です。次のような演算子を用いることで、条件式をつくることができます。

演算子 条件式の例 例の意味
= 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

実行結果は次のようになります。
マクロ1結果

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の値を変更してからマクロを実行する。を何度か試してみましょう。

マクロ1結果

このマクロでは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の値が入ります。

マクロ結果4

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

For Nextの動き

これにより、A1~A10セルに1~10のそれぞれの値を設定する処理を実現しています。

Do Whileステートメント

Do Whileステートメントも代表的なくり返し構文の1つです。基本的な書き方は次のようになります。

Do While 条件式
    'くり返し行いたい処理
Loop

条件式の判定結果がTrueである間、Do WhileLoopで囲んだ範囲をくり返し処理します。

次のプログラム例で、Do Whileステートメントの動作を見てみましょう。

Sub マクロ6()
    Dim i
    i = 1
    Do While Range("A" & i).Value <> ""
        Range("B" & i).Value = "〇"
        i = i + 1
    Loop
End Sub

下図左のような状態で実行すると、下図右のような実行結果を得ることができます。

マクロ結果5

プログラムが行っている処理は、「A列を順番に見ていって、セルに値が入っている間、B列に〇を設定する。」です。

Do Whileステートメントは、くり返し処理のたびに条件式を判定し、条件式がTrueなら、Do WhileLoopで囲んだ部分の処理を行う。という動作をします。下図はDo Whileステートメント部分の処理の流れを示したものです。

①~③の処理内容は次のとおりです。

  • ① 対象セル(A1,A2,A3....)の値が空かどうかを判定する。
  • ② B列の各セル(B1,B2,B3....)にをセットする。
  • ③ iの値を1加算する。

今回の実行例では、①~③の処理が上図のように4回実行されます。5回目の処理では判定対象のA5セルの値が空です。そのため、条件式がFalseとなるため、くり返し処理が終了します。

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

タイトルとURLをコピーしました