まさ工房

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

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

       f:id:m_kbou:20190520093545p:plain

For~Next文は、実行回数の決まった繰り返し処理を行う場合に使用します。
この構文を使う事で、繰り返し処理を短文でスッキリ記述する事ができます。

 

【目次】

 

構文

記述方法は以下の様になります。 

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

For [変数]= [初期値]to[最終値
        [処理内容]
Next

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

[説明]:
[初期値]には開始する最初の値を記述し、[最終値には終了する最後の値を記述します。[変数]には繰り返し処理が実行される都度、[初期値]から[最終値]までの値が順次セットされます。[処理内容]には[変数]の値が[初期値]から[最終値]になるまでの間、実行する処理内容を記述します。内容を纏めると、「[初期値]から[最終値]になるまで[処理内容]を繰り返し実行して下さい。」との意味になります。

 

使い方

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

基本的な使い方

まずは基本的な使い方について説明します。

[記述例]:

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

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

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 1 To 3
        MsgBox 番号
    Next
End Sub

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

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

[処理①]:変数の定義をします
Dimによる変数の定義となります。変数名は「番号」となり、入力できる値は「小数を含む数値のみ」となります。
[処理②]:For~Next文の記述となります
[処理①]で指定した変数:番号に1から3の値を順次セットし、セット毎にMsgBoxで値を表示していきます。よって、1回目の処理では、変数:番号に1がセットされ、MsgBoxでは「1」が表示されます。また、2回目の処理では、変数:番号に2がセットされ、MsgBoxでは「2」が表示されます。最後に、3回目の処理では、変数:番号に3がセットされ、MsgBoxでは「3」が表示されます。

[実行例]:

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

 f:id:m_kbou:20190520093606p:plain

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

f:id:m_kbou:20190520093621p:plain

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

f:id:m_kbou:20190520093633p:plain

基本的な使い方の説明は以上です。

 

Stepを用いた使い方

Stepを用いた変数の増減値を変更する方法について説明します。

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

[記述例①]:

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

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

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 1 To 5 Step 2
        MsgBox 番号
    Next
End Sub

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

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

[処理②]:Stepを用いたFor~Next文の記述となります(足し算方式)
今回はStepが記述された処理の流れとなります。Stepは初期値から最終値までの間を指定された数だけ飛ばして処理を実行する内容となります。よって、通常は処理①で指定した変数:番号に1から5の値を順次セットし、セット毎にMsgBoxで値を表示していくのですが、今回はStepを用いて2ずつ処理を飛ばす処理が記述されているので、1回目の処理では、変数:番号に1がセットされ、MsgBoxでは「1」が表示されます。また、2回目の処理では、1回目処理の変数:番号(1)に2を足し算する事となり、1+2=3が変数:番号にセットされ、MsgBoxでは「3」が表示されます。また、3回目の処理では、2回目処理の変数:番号(3)に2を足し算する事となり、3+2=5が変数:番号にセットされ、MsgBoxでは「5」が表示されます。

[実行例①]:

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

f:id:m_kbou:20190520093606p:plain 

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

f:id:m_kbou:20190520093633p:plain 

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

f:id:m_kbou:20190520105724p:plain

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

[記述例②]:

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

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

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 3 To 1 Step -1
        MsgBox 番号
    Next
End Sub

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

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

[処理②]:Stepを用いたFor~Next文の記述となります(引き算方式)
Stepが記述された二つ目の例題となります。Stepは初期値から最終値までの間を指定された数だけ飛ばして処理を実行する内容になりますが、初期値>最終値の場合はStepに記述する数はマイナス値となります。よって、[処理①]で指定した変数:番号に3から1の値を順次セットし、セット毎にMsgBoxで値を表示していくのですが、今回はStepを用いて-1ずつ処理を飛ばす内容が記述されていますので、1回目の処理では、変数:番号に3がセットされ、MsgBoxでは「3」が表示されます。また、2回目の処理では、1回目処理の変数:番号(3)から1を引き算する事となり、3-1=2が変数:番号にセットされ、MsgBoxでは「2」が表示されます。また、3回目の処理では、2回目処理の変数:番号(2)から1を引き算する事となり、2-1=1が変数:番号にセットされ、MsgBoxでは「1」が表示されます。

[実行例②]:

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

f:id:m_kbou:20190520093633p:plain 

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

f:id:m_kbou:20190520093621p:plain

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

f:id:m_kbou:20190520093606p:plain

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

Stepを用いた変数の増減値を変更する方法についての説明は以上です。

 

Exitを用いた使い方

Exitを用いた処理の強制終了の方法について説明します。
For~Next文の中にExit Forを記述すると、繰り返し処理を途中で中断し、処理を強制的に終了させます。

[記述例]:

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

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

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 1 To 3
        If (番号 = 2) Then
            Exit For
        End If
        MsgBox 番号
    Next
 '↓処理③
    MsgBox "処理が終わりました。"
End Sub

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

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

[処理②]:Exitを用いたFor~Next文の強制終了方法となります
今回の記述は、[処理①]で指定した変数:番号に1から3の値を順次セットし、セット毎にMsgBoxで値を表示するとの内容ですが、変数:番号の値が「2」になった場合は強制的に処理を中断し、For~Next文を抜ける事となります。抜けた後は[処理③]が実行されます。よって、1回目の処理では、変数:番号に1がセットされ、MsgBoxでは「1」が表示されますが、2回目の処理では、変数:番号に2がセットされ、IF文の条件にマッチした事でExir Forが実行され、For~Next文から抜ける事となります。また、抜けると同時に[処理③]が実行され、MsgBoxには「処理が終わりました。」との内容が表示されます。

[実行例]:

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

f:id:m_kbou:20190520093606p:plain

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

f:id:m_kbou:20190520105739p:plain

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

 

GoToを用いた使い方

GoToを用いた処理の読み飛ばし方法について説明します。
For~Next文の中にGoToを記述すると、処理を読み飛ばして次の処理に移る事ができます。

[記述例]:

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

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

Sub サンプル()
    '↓処理①
    Dim 番号 As Double
    '↓処理②
    For 番号 = 1 To 3
        If (番号 = 2) Then
            GoTo 次の処理
        Else
            MsgBox 番号
        End If
次の処理:
        '↓処理③
        MsgBox "次の処理に移ります。"
    Next
End Sub

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

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

[処理②]:GoToを用いたFor~Next文の処理の読み飛ばし方法となります
GoTo文の後には、処理を飛ばす先の名前を記述します。今回の例では「次の処理」(青文字)がそれにあたります。処理を飛ばす先は、プログラム中の任意の場所に追記する事が可能ですが、記述方法は[飛ばす先の名前]+「:」(コロン)で記述します。これを踏まえ、今回の記述は、[処理①]で指定した変数:番号に1から3の値を順次セットし、セット毎にMsgBoxで値を表示するとの内容ですが、変数:番号の値が「2」の場合は処理を読み飛ばし、次の処理に移るとの内容になります。よって、1回目の処理では、変数:番号に1がセットされ、MsgBoxで「1」が表示された後更に[処理③]のMsgBoxで「次の処理へ移ります。」が表示されます。2回目の処理では、変数:番号に2がセットされ、IF文の条件にマッチした事でGoToが実行され、[処理③]のMsgBoxで「次の処理へ移ります。」のみが表示されます。更に、3回目の処理では、変数:番号に3がセットされ、MsgBoxで「3」が表示された後更に[処理③]のMsgBoxで「次の処理へ移ります。」が表示されます。これにより、2回目の処理は読み飛ばされている事がわかります。

[実行例]:

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

f:id:m_kbou:20190520093606p:plain

f:id:m_kbou:20190520110615p:plain

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

f:id:m_kbou:20190520110615p:plain

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

f:id:m_kbou:20190520093633p:plain

f:id:m_kbou:20190520110615p:plain

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

 

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

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

[画面]:

f:id:m_kbou:20190520131923p:plain

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

[記述例]:

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

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

Sub 合否判定()
    '↓処理①
    Dim 行 As Double
    '↓処理②
    For 行 = 2 To 7
        '↓処理③
        If (Cells(行, "B") >= 80) Then
            Cells(行, "C") = "合格"
        Else
            Cells(行, "C") = "不合格"
        End If
    Next
End Sub

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

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

[処理①]:変数の定義をします
Dimによる変数の定義となります。変数名は「行」となり、入力できる値は「小数を含む数値のみ」となります。
[処理②]:For~Next文の記述となります
[処理①]で指定した変数:行に2から7の値を順次セットし、セット毎にB列の対象セル点数が80以上なのか?80未満なのか?をチェックし、結果(合格?不合格?)をC列の対象セルにセットします。具体的に説明すると、1回目の処理では、変数:行に2がセットされるため、[処理③]の判定では対象セルはB2セルとなり、B2セルが60との事から80未満のIF文条件に一致するため、C2セルに「不合格」をセットします。また、2回目の処理では、変数:行に3がセットされるため、[処理③]の判定では対象セルはB3セルとなり、B3セルが80との事から80以上のIF文条件に一致するため、C3セルに「合格」をセットします。同様に3回目(行が4)~6回目(行が7)まで処理を繰り返し行う事で、全個人に対するC列の合否判定結果がセットされます。

[実行例]:

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

f:id:m_kbou:20190520131934p:plain

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

 

おわりに

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