教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について説明していきます。

【ExcelVBA 構文】Do~Loop文(繰り返し処理)の使い方を知りたいです。教えて!

       f:id:m_kbou:20200417211522p: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の使い方について説明します。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

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

Sub サンプル()

    '↓処理①
    Dim 番号 As Double
   
    '↓処理②
    番号 = 1
   
    '↓処理③
    Do While 番号 <= 3
        MsgBox 番号
        番号 = 番号 + 1
    Loop

End Sub

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

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:変数に初期値セット
[処理①]で定義した変数:番号に初期値の1をセットします。

[処理③]:Do While~Loop文の記述
変数:番号の値が3以下の間はMsgBoxで値を表示します。

1回目の処理では初期値の1が変数:番号にセットされているため、1<=3でループ処理の継続条件に当てはまることから「1」が表示されます。その後に変数:番号に1+1=2がセットされます。

2回目の処理では変数:番号に2がセットされているため、2<=3でループ処理の継続条件に当てはまることから「2」が表示されます。その後に変数:番号に2+1=3がセットされます。

3回目の処理では変数:番号に3がセットされているため、3<=3でループ処理の継続条件に当てはまることから「3」が表示されます。その後に3+1=4が変数:番号にセットされます。

4回目の処理では変数:番号に4がセットされていますが、4<=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の使い方について説明します。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

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

Sub サンプル()

    '↓処理①
    Dim 番号 As Double
   
    '↓処理②
    番号 = 1
   
    '↓処理③
    Do Until 番号 = 3
        MsgBox 番号
        番号 = 番号 + 1
    Loop

End Sub

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

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:変数に初期値セット
[処理①]で定義した変数:番号に初期値の1をセットします。

[処理③]:Do Until~Loop文の記述
変数:番号の値が3になるまで MsgBoxで値を表示します。

1回目の処理では変数:番号には初期値の1がセットされているため、1≠3でループ処理の継続条件(3=3になるまで処理継続)に当てはまることから「1」が表示されます。その後に変数:番号に1+1=2がセットされます。

2回目の処理では変数:番号には2がセットされているため、2≠3でループ処理の継続条件(3=3になるまで処理継続)にあてはまることから「2」が表示されます。その後に変数:番号に2+1=3がセットされます。

3回目の処理では変数:番号には3がセットされているため、3=3でループ処理の継続条件(3=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文を使用して説明します)

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

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

Sub サンプル()

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

End Sub

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

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:変数に初期値セット
[処理①]で定義した変数:番号に初期値の1をセットします。

[処理③]:Exitを用いたDo Until~Loop文の強制終了
変数:番号の値が3になるまで MsgBoxで値を表示しますがIF文の条件判断により変数:番号の値が2になった場合には強制的に処理を中断し、ループ処理を抜ける事となります。

1回目の処理では変数:番号には初期値の1がセットされているため、1≠3でループ処理の継続条件(3=3になるまで処理継続)にあてはまり、かつ、IF文の条件判断(2=2ならば)にあてはまらない事から「1」が表示されます。その後に変数:番号に1+1=2がセットされます。

2回目の処理では変数:番号には2がセットされているため、2≠3でループ処理の継続条件(3=3になるまで処理継続)にあてはまりますが、IF文の条件判断(2=2ならば)にあてはまる事からExir Doが実行され、ループ処理が終了します。

[実行例]:

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

f:id:m_kbou:20190520093606p:plain

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

 

GoToを用いた使い方

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

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

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

Sub サンプル()

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

End Sub

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

処理の流れは以下の通りとなります。

[処理①]:変数の定義
Dimによる変数の定義となります。

[処理②]:変数に初期値セット
[処理①]で定義した変数:番号に初期値の1をセットします。

[処理③]:GoToを用いたDo Until~Loop文の処理読み飛ばし

GoToは指定した場所に処理を飛ばす記述となります。ループ処理では変数:番号の値が3になるまで MsgBoxで値を表示しますがIF文の条件判断により変数:番号の値が2になった場合にはGoToにて処理を読み飛ばし、次の処理に移ります。

1回目の処理では変数:番号には初期値の1がセットされているため、1≠3でループ処理の継続条件(3=3になるまで処理継続)にあてはまり、かつ、IF文の条件判断(2=2ならば)にあてはまらない事から「1」が表示されます。その後に変数:番号に1+1=2がセットされ、更に「次の処理に移ります。」が表示されます。

2回目の処理では変数:番号には2がセットされているため、2≠3でループ処理の継続条件(3=3になるまで処理継続)にあてはまり、更に、IF文の条件判断(2=2ならば)にもあてはまる事からGoTo処理が実行され、指定した場所まで処理が飛びます。その後に変数:番号に2+1=3がセットされ、「次の処理に移ります。」のみが表示されます。

3回目の処理では変数:番号には3がセットされているため、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

※<実行>ボタンには、以下の記述例合否判定プロシージャが登録されている事とします。

[記述例]:

※以下の記述例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方については、VBEの開き方を参考にして下さい。

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

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 Until~Loop文の記述
今回のループ処理では、変数:行に1を足し算しながらカウントアップし、A列のセルがスペースになるまで処理を繰り返す流れとなります。また、IF文を使用したB列セルの点数が80以上なのか?80未満なのか?をチェックして、結果(合格?不合格?)をC列セルにセットします。

1回目の処理では初期値の2が変数:行にセットされているため、A2セルがスペースか否かを判定します。A2セルはスペースで無いため、合否判定対象セルがB2セルとなり、B2セルが60との事からIF文80未満の条件に一致するため、C2セルに「不合格」をセットします。その後に変数:行に2+1=3がセットされます。

2回目の処理では3が変数:番号にセットされているため、A3セルがスペースか否かを判定します。A3セルはスペースで無いため、合否判定対象セルはB3セルとなり、B3セルが80との事からIF文80以上の条件に一致するため、C3セルに「合格」をセットします。その後に変数:行に3+1=4がセットされます。

3回目の処理では4が変数:行にセットされているため、A4セルがスペースか否かを判定します。A4セルはスペースで無いため、合否判定対象セルはB4セルとなり、B4セルが50との事からIF文80未満の条件に一致するため、C4セルに「不合格」をセットします。その後に変数:行に4+1=5がセットされます。

4回目の処理では5が変数:行にセットされているため、A5セルがスペースか否かを判定します。A5セルはスペースで無いため、合否判定対象セルはB5セルとなり、B5セルが75との事からIF文80未満の条件に一致するため、C5セルに「不合格」をセットします。その後に変数:行に5+1=6がセットされます。

5回目の処理では6が変数:行にセットされているため、A6セルがスペースか否かを判定します。A6セルはスペースで無いため、合否判定対象セルはB6セルとなり、B6セルが63との事からIF文80未満の条件に一致するため、C6セルに「不合格」をセットします。その後に変数:行に6+1=7がセットされます。

6回目の処理では7が変数:行にセットされているため、A7セルがスペースか否かを判定します。A7セルはスペースで無いため、合否判定対象セルはB7セルとなり、B7セルが100との事からIF文80以上の条件に一致するため、C7セルに「合格」をセットします。その後に変数:行に7+1=8がセットされます。 

7回目の処理では8が変数:行にセットされているため、A8セルがスペースか否かを判定します。A8セルはスペースであるため、ループ処理が終了します。 

[実行例]:

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

f:id:m_kbou:20190520131934p:plain

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

 

おわりに

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