教えて!ExcelVBA!

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

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

f:id:m_kbou:20200418102426p:plain

For~Next文は、実行回数の決まった繰り返し処理(ループ処理)を行う場合に使用します。この構文を使う事で、繰り返し処理を短文でスッキリ記述する事ができます。ExcelVBAでは、同じ事を繰り返し実行するプログラミングは頻繁に出てきます。そのため、ExcelVBAを使いこなすためにはFor~Next文を確実に理解しておく必要があります。このFor~Next文の使い方について紹介します。

 

 

構文

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

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

[説明]:

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

 

使い方

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

基本的な使い方

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

[プログラミング例]:

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」が表示されます。

f:id:m_kbou:20210205132830p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226080155p:plain

②最初の処理結果は以下の様に表示されます。MsgBoxで「1」が表示されます。

 f:id:m_kbou:20190520093606p:plain

③次の処理結果は以下の様に表示されます。MsgBoxで「2」が表示されます。

f:id:m_kbou:20190520093621p:plain

④最後の処理結果は以下の様に表示されます。MsgBoxで「3」が表示されます。

f:id:m_kbou:20190520093633p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

Stepを用いた使い方

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

[プログラミング例①]:

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」が表示されます。

f:id:m_kbou:20210205133712p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例①]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226080802p:plain

②最初の処理結果は以下の様に表示されます。MsgBoxで「1」が表示されます。

f:id:m_kbou:20190520093606p:plain 

③次の処理結果は以下の様に表示されます。MsgBoxで「3」が表示されます。

f:id:m_kbou:20190520093633p:plain 

④最後の処理結果は以下の様に表示されます。MsgBoxで「5」が表示されます。

f:id:m_kbou:20190520105724p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

Stepを用いたプログラミング例①の説明は以上です。

[プログラミング例②]:

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」が表示されます。

f:id:m_kbou:20210205134052p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例②]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226081302p:plain

②最初の処理結果は以下の様に表示されます。MsgBoxで「3」が表示されます。

f:id:m_kbou:20190520093633p:plain 

③次の処理結果は以下の様に表示されます。MsgBoxで「2」が表示されます。

f:id:m_kbou:20190520093621p:plain

④最後の処理結果は以下の様に表示されます。MsgBoxで「1」が表示されます。

f:id:m_kbou:20190520093606p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

Stepを用いたプログラミング例②の説明は以上です。

 

Exitを用いた使い方

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

[プログラミング例]:

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で「処理が終わりました。」を表示させます。

f:id:m_kbou:20210205134705p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226082025p:plain

②最初の処理結果は以下の様に表示されます。MsgBoxで「1」が表示されます。

f:id:m_kbou:20190520093606p:plain

③次の処理結果は以下の様に表示されます。ExitによりFor~Next文を抜けるため、MsgBoxで「処理が終わりました。」が表示されます。

f:id:m_kbou:20190520105739p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

GoToを用いた使い方

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

[プログラミング例]:

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回目の処理が読み飛ばされた事がわかります。

f:id:m_kbou:20210205135346p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226082707p:plain

②最初の処理結果は以下の様に表示されます。MsgBoxで「1」が表示された後に「次の処理に移ります。」が表示されます。

f:id:m_kbou:20190520093606p:plain

f:id:m_kbou:20190520110615p:plain

③次に処理結果は以下の様に表示されます。条件によりGoTo文で読み飛ばしされたため、MsgBoxで「次の処理に移ります。」が表示されます。

f:id:m_kbou:20190520110615p:plain

④最後に処理結果は以下の様に表示されます。MsgBoxで「3」が表示された後に「次の処理に移ります。」が表示されます。

f:id:m_kbou:20190520093633p:plain

f:id:m_kbou:20190520110615p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

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

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

[画面]:

f:id:m_kbou:20190520131923p:plain

[プログラミング例]:

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:20210205135954p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

①<実行>ボタンには上記のプログラミング例のプログラムが登録されています。この<実行>ボタンをクリックします。(※ボタンの作り方やボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210226083110p:plain

②処理結果は以下の様になります。C列の合否判定に結果が表示されます。

f:id:m_kbou:20190520131934p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

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

 

おわりに

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