教えて!ExcelVBA!

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

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

       f:id:m_kbou:20200418102426p: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が変数:番号にセットされるため「1」が表示されます。

2回目の処理では2が変数:番号にセットされるため 「2」が表示されます。

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

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

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

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

[処理②]:Stepを用いたFor~Next文の記述(足し算方式)
Stepは[初期値]から[最終値]までの間を指定した数だけ飛ばして処理を実行します。よって、通常は
変数:番号に1から5の値を順次セットし、セット毎に MsgBoxで表示していくのですが、今回のケースではStepを使用して2つずつ飛ばした値を表示させます。

1回目の処理では1が変数:番号にセットされるため「1」が表示されます。

2回目の処理では2つ飛ばした1+2=3が変数:番号にセットされるため 「3」が表示されます。

3回目の処理でも2つ飛ばした3+2=5が変数:番号にセットされるため 「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

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

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

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

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

1回目の処理では3が変数:番号にセットされるため「3」が表示されます。

2回目の処理では-1つ飛ばした3-1=2が変数:番号にセットされるため 「2」が表示されます。

3回目の処理でも-1つ飛ばした2-1=1が変数:番号にセットされるため「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

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

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

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

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

1回目の処理では1が変数:番号にセットされるため「1」が表示されます。

2回目の処理では2が変数:番号にセットされますが、IF文の分岐条件に一致する事からループ処理を抜け[処理③]が実行されます。

[処理③]:処理終了メッセージ
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

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

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

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

[処理②]:GoToを用いたFor~Next文の処理の読み飛ばし方法
GoToは指定した場所に処理を飛ばす記述となります。今回は変数:番号に1から3の値を順次セットしMsgBoxで値を表示させますが、IF文による条件で変数:番号の値が2の場合は処理を読み飛ばし、次の処理に移ります。

1回目の処理では1が変数:番号にセットされるため「1」が表示された後に「次の処理に移ります。」が表示されます。

2回目の処理では2が変数:番号にセットされますが、IF文の分岐条件に一致する事からGoTo処理が実行され「次の処理に移ります。」のみが表示されます。

3回目の処理では3が変数:番号にセットされるため 「3」が表示された後に「次の処理に移ります。」が表示されます。これにより、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の値を順次セットし、IF文を使用したB列セル点数が80以上なのか?80未満なのか?をチェックして、結果(合格?不合格?)をC列セルにセットします。

1回目の処理では2が変数:番号にセットされるため、判定対象セルはB2セルとなり、B2セルが60との事からIF文80未満の条件に一致するため、C2セルに「不合格」をセットします。

2回目の処理では3が変数:番号にセットされるため、判定対象セルはB3セルとなり、B3セルが80との事からIF文80以上の条件に一致するため、C3セルに「合格」をセットします。

3回目の処理では4が変数:番号にセットされるため、判定対象セルはB4セルとなり、B4セルが50との事からIF文80未満の条件に一致するため、C4セルに「不合格」をセットします。

4回目の処理では5が変数:番号にセットされるため、判定対象セルはB5セルとなり、B5セルが75との事からIF文80未満の条件に一致するため、C5セルに「不合格」をセットします。

5回目の処理では6が変数:番号にセットされるため、判定対象セルはB6セルとなり、B6セルが63との事からIF文80未満の条件に一致するため、C6セルに「不合格」をセットします。

6回目の処理では7が変数:番号にセットされるため、判定対象セルはB7セルとなり、B7セルが100との事からIF文80以上の条件に一致するため、C7セルに「合格」をセットします。

[実行例]:

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

f:id:m_kbou:20190520131934p:plain

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

 

おわりに

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