まさ工房

ExcelVBAとAcessDBを利用した業務支援ツールを作成する工房です

【Excelマクロ・VBA】Do~Loop文(繰り返し処理)の使い方を知りたいです。教えて!

      f:id:m_kbou:20190521093132p:plain

Do~Loop文は、「ある条件にあてはまる間」又は「ある条件になるまで」繰り返し処理を行う場合に使用します。但し、記述方法を間違えると永久ループに陥る可能性があるため、十分に注意して記述する必要があります。

 

【目次】

 

構文

Do~Loop文には、記述方法が2つあります。

 (1)Do While~Loopの記述方法

=======================================================================

Do While [条件式]
    [処理内容]
Loop

=======================================================================

[説明]:
[条件式]には繰り返し処理をさせる条件を記述します。但し、「その条件になるまでの間は」との条件式を記述します。また、[処理内容]には繰り返し処理をされている間、実行する内容を記述します。内容を纏めると、「[条件式]にあてはまる間は、[処理内容]を繰り返し実行して下さい。」との意味になります。

 

(2)Do Until~Loopの記述方法

=======================================================================

Do Until [条件式]
    [処理内容]
Loop

=======================================================================

[説明]:
[条件式]には繰り返し処理をさせる条件を記述します。但し、「その条件になるまで」との条件式を記述します。また、[処理内容]には繰り返し処理をされている間、実行する内容を記述します。内容を纏めると、「[条件式]にあてはまるまで、[処理内容]を繰り返し実行して下さい。」との意味になります。

 

使い方

使い方について、具体的に説明していきます。

Do While~Loopの使い方

まずはDo While~Loopの使い方について説明します。

[記述例]:

-------------------------------------------------

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    番号 = 1
    '↓処理③
    Do While 番号 <= 3
        MsgBox 番号
        '↓処理④
        番号 = 番号 + 1
    Loop
End Sub

-------------------------------------------------

※処理の流れは以下の通りとなります。
[処理①]:変数の定義をします
Dimによる変数の定義となります。変数名は「番号」となり、入力できる値は「小数を含む数値のみ」となります。
[処理②]:変数に初期値をセットします
[処理①]で定義した変数:番号に初期値の1をセットします。
[処理③]:Do While~Loop文の記述となります
変数:番号の値が3以下の場合、MsgBoxで値を表示します。1回目の処理では、変数:番号には[処理②]で初期値1がセットされており、1<=3で条件式に当てはまるため、MsgBoxでは「1」が表示されます。また、その後の[処理④]で変数:番号(1)に1が足し算されるため、1+1=2が変数:番号に再セットされます。2回目の処理では、変数:番号には2がセットされており、2<=3で条件式にあてはまるため、MsgBoxでは「2」が表示されます。また、その後の[処理④]で変数:番号(2)に1が足し算されるため、2+1=3が変数:番号に再セットされます。3回目の処理では、変数:番号には3がセットされており、3<=3で条件式にあてはまるため、MsgBoxでは「3」が表示されます。また、その後の[処理④]で変数:番号(3)に1が足し算されるため、3+1=4が変数:番号に再セットされます。4回目の処理では、変数:番号には4がセットされており、4<=3で条件式にあてはまらないため、ここで処理が終了します。
[処理④]:変数:番号のカウントアップ記述となります
ここでは変数:番号のカウントアップを行います。この記述が無い場合、変数:番号は永久的に初期値1のままとなり、永久的に1<=3の条件式が成り立つため、処理がループする事になります。

[実行例]:

・1回目の処理が実行された場合

 f:id:m_kbou:20190520093606p:plain

・2回目の処理が実行された場合

f:id:m_kbou:20190520093621p:plain

・3回目の処理が実行された場合 

f:id:m_kbou:20190520093633p:plain

Do While~Loopの使い方についての説明は以上です。

 

Do Until~Loopの使い方

次に、Do Until~Loopの使い方について説明します。

[記述例]:

-------------------------------------------------

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    番号 = 1
    '↓処理③
    Do Until 番号 = 3
        MsgBox 番号
        '↓処理④
        番号 = 番号 + 1
    Loop
End Sub

-------------------------------------------------

※処理の流れは以下の通りとなります。
[処理②]:変数に初期値をセットします
[処理①]で定義した変数:番号に初期値の1をセットします。
[処理③]:Do Until~Loop文の記述となります
変数:番号の値が3になるまで、MsgBoxで値を表示します。1回目の処理では、変数:番号には[処理②]で初期値1がセットされており、1≠3で条件式に当てはまらないため、MsgBoxでは「1」が表示されます。また、その後の[処理④]で変数:番号(1)に1が足し算されるため、1+1=2が変数:番号に再セットされます。2回目の処理では、変数:番号には2がセットされており、2≠3で条件式にあてはまらないため、MsgBoxでは「2」が表示されます。また、その後の[処理④]で変数:番号(2)に1が足し算されるため、2+1=3が変数:番号に再セットされます。3回目の処理では、変数:番号には3がセットされており、3=3で条件式にあてはまるため、ここで処理が終了します。
[処理④]:変数:番号のカウントアップ記述となります
ここでは変数:番号のカウントアップを行います。この記述が無い場合、変数:番号は永久的に初期値1のままとなり、永久的に1≠3の条件式が成り立つため、処理がループする事になります。

[実行例①]:

・1回目の処理が実行された場合

f:id:m_kbou:20190520093606p:plain 

・2回目の処理が実行された場合

f:id:m_kbou:20190520093621p:plain

Do Until~Loopの使い方についての説明は以上です。

 

Exitを用いた使い方

Exitを用いた処理の強制終了の方法について説明します。
Do~Loop文の中にExit Doを記述すると、繰り返し処理を途中で中断し、処理を強制的に終了させます。(今回はDo Until~Loop文を使用して説明します)

[記述例]:

-------------------------------------------------

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    番号 = 1
    '↓処理③
    Do Until 番号 = 3
        '↓処理④
        If (番号 = 2) Then
            Exit Do
        Else
            MsgBox 番号
        End If
        '↓処理⑤
        番号 = 番号 + 1
    Loop
End Sub

-------------------------------------------------

※処理の流れは以下の通りとなります。
[処理④]:Exitを用いたDo Until~Loop文の強制終了方法となります
今回の記述は、[処理②]で初期値1をセットした変数:番号に1を足し算しながらカウントアップし、MsgBoxで値を表示するとの内容ですが、変数:番号の値が2になった場合は強制的に処理を中断し、Do Until~Loop文を抜ける事となります。よって、1回目の処理では、変数:番号に1がセットされ、MsgBoxでは「1」が表示されますが、2回目の処理では、変数:番号に2がセットされ、IF文の条件にマッチした事でExir Doが実行され、Do Until~Loop文から抜ける事となります。

[実行例]:

・1回目の処理が実行された場合

f:id:m_kbou:20190520093606p:plain

Exitを用いた処理の強制終了についての説明は以上です。

 

GoToを用いた使い方

GoToを用いた処理の読み飛ばし方法について説明します。
Do~Loop文の中にGoToを記述すると、処理を読み飛ばして次の処理に移る事ができます。(今回はDo Until~Loop文を使用して説明します)

[記述例]:

-------------------------------------------------

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    番号 = 1
    '↓処理③
    Do Until 番号 = 3
        '↓処理④
        If (番号 = 2) Then
            GoTo 次の処理
        Else
            MsgBox 番号
        End If
次の処理:
        '↓処理⑤
        番号 = 番号 + 1
        '↓処理⑥
        MsgBox "次の処理に移ります。"
    Loop
End Sub

-------------------------------------------------

[処理④]:GoToを用いたDo Until~Loop文の処理の読み飛ばし方法となります
GoTo文の後には、処理を飛ばす先の名前を記述します。今回の例では「次の処理」(青文字)がそれにあたります。処理を飛ばす先は、プログラム中の任意の場所に追記する事が可能ですが、記述方法は[飛ばす先の名前]+「:」(コロン)で記述します。これを踏まえ、今回の記述は、[処理②]で初期値1をセットした変数:番号に1を足し算しながらカウントアップし、MsgBoxで値を表示するとの内容ですが、変数:番号の値が2の場合は処理を読み飛ばし、次の処理に移るとの処理になります。1回目の処理では、変数:番号に初期値1がセットされ、MsgBoxで「1」が表示された後、更に[処理⑤]で変数:番号(1)に1が足し算されるため、1+1=2が変数:番号に再セットされ、[処理⑥]のMsgBoxで「次の処理へ移ります。」が表示されます。2回目の処理では、変数:番号に2がセットされており、IF文の条件にマッチした事でGoToが実行され、後処理の[処理⑤]及び[処理⑥]が実行されます。[処理⑤]では変数:番号(2)に1が足し算されるため、2+1=3が変数:番号に再セットされ、[処理⑥]のMsgBoxで「次の処理へ移ります。」が表示されます。3回目の処理では、変数:番号には3がセットされており、[処理③]の3=3で条件式にあてはまるため、ここで処理が終了します。

[実行例]:

・1回目の処理が実行された場合

f:id:m_kbou:20190520093606p:plain

f:id:m_kbou:20190520110615p:plain

・2回目の処理が実行された場合

f:id:m_kbou:20190520110615p:plain

GoToを用いた使い方についての説明は以上です。

 

表を使用した繰り返し処理の使い方

最後に、Excel表(以下画面)を元に、Do~Loop構文の使い方についての参考例を紹介します。(今回はDo Until~Loop文を使用して説明します)
参考例では、以下の条件を各個人に対してセットする事とします。
条件は、
・B列の点数が80以上であれば、C列に「合格」をセットする
・B列の点数が80未満であれば、C列に「不合格」をセットする
とします。

[画面]:

f:id:m_kbou:20190520131923p:plain

※<実行>ボタンには、以下の記述例マクロが登録されている事とします。

[記述例]:

-------------------------------------------------

Sub 合否判定()
    '↓処理①
    Dim 行 As Double
    '↓処理②
    行 = 2
    '↓処理③
    Do Until Cells(行, "A") = ""
        '↓処理④
        If (Cells(行, "B") >= 80) Then
            Cells(行, "C") = "合格"
        Else
            Cells(行, "C") = "不合格"
        End If
        '↓処理⑤
        行 = 行 + 1
    Loop
End Sub

-------------------------------------------------

※処理の流れは以下の通りとなります。
[処理①]:変数の定義をします
Dimによる変数の定義となります。変数名は「行」となり、入力できる値は「小数を含む数値のみ」となります。
[処理②]:変数に初期値をセットします
[処理①]で定義した変数:行に初期値の2をセットします。
[処理③]:Do~Loop文の記述となります
今回のDo~Loop文は、[処理②]で初期値2をセットした変数:番号に1を足し算しながらカウントアップし、A列のセルがスペースになるまで処理を繰り返し実施する流れになります。処理内容は、B列の対象セル点数が80以上なのか?80未満なのか?をチェックし、結果(合格?不合格?)をC列の対象セルにセットします。具体的に説明すると、1回目の処理では、変数:行に2がセットされているため、[処理④]の判定では対象セルはB2セルとなり、B2セルが60との事から80未満のIF文条件に一致するため、C2セルに「不合格」をセットします。条件判定が終了した後は、[処理⑤]で変数:行(2)に1が足し算され、2+1=3で変数:行に3が再セットされます。また、2回目の処理では、変数:行に3がセットされるため、[処理④]の判定では対象セルはB3セルとなり、B3セルが80との事から80以上のIF文条件に一致するため、C3セルに「合格」をセットします。条件判定が終了した後は、[処理⑤]で変数:行(3)に1が足し算され、3+1=4で変数:行に4が再セットされます。同様に3回目(行が4)~6回目(行が7)まで処理を繰り返し行う事で、全個人に対するC列の合否判定結果がセットされます。

[実行例]:

結果は以下の様になります

f:id:m_kbou:20190520131934p:plain

表を使用した繰り返し処理の使い方の説明は以上です。

 

おわりに

プログラミング初心者には、繰り返し処理という概念自体が理解しずらいと思います。「なぜ必要なのか?」「どう言う場面で必要なのか?」がわかりずらいとの意見もよく耳にします。上記で説明した内容を元に、自分なりにプログラミングした内容を実行し、動きを十分に理解してもらえればと思います。