教えて!ExcelVBA!

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

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

f:id:m_kbou:20200417211522p:plain

Do~Loop文は、「ある条件にあてはまる間」又は「ある条件になるまで」繰り返し処理(ループ処理)を行う場合に使用します。ExcelVBAでは、同じ事を繰り返し実行するプログラミングは頻繁に出てきます。そのため、ExcelVBAを使いこなすためにはDo~Loop文を確実に理解しておく必要があります。特に、Do~Loop文は実行回数が決まっていない繰り返し処理のため、記述方法を間違えると永久ループに陥る可能性があり、注意が必要となります。この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でループ処理の継続条件に当てはまることから「1」が表示されます。その後に変数:番号に1+1=2がセットされます。

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

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

---------------------------------
4回目の処理では変数:番号に4がセットされていますが、4<=3でループ処理の継続条件に当てはまらないことから、ここで処理が終了します。

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

f:id:m_kbou:20210205150305p:plain

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

[実行例]:

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

f:id:m_kbou:20210226184454p: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

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

 

Do Until~Loopの使い方

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

[プログラミング例]:

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になるまで処理継続)にあてはまらないことから、ここで処理が終了します。

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

f:id:m_kbou:20210205150337p:plain

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

[実行例]:

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

f:id:m_kbou:20210226203220p:plain

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

f:id:m_kbou:20190520093606p:plain 

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

f:id:m_kbou:20190520093621p:plain

[サンプル]:

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

drive.google.com

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

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

[処理①]:変数定義
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が実行され、ループ処理が終了します。

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

f:id:m_kbou:20210205150402p:plain

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

[実行例]:

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

f:id:m_kbou:20210226203817p:plain

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

f:id:m_kbou:20190520093606p:plain

[サンプル]:

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

drive.google.com

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

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

[処理①]:変数定義
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になるまで処理継続)にあてはまらないことから、ここで処理が終了します。

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

f:id:m_kbou:20210205150444p:plain

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

[実行例]:

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

f:id:m_kbou:20210226204148p:plain

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

f:id:m_kbou:20190520093606p:plain

f:id:m_kbou:20190520110615p:plain

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

f:id:m_kbou:20190520110615p:plain

[サンプル]:

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

drive.google.com

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

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

[実行例]:

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

f:id:m_kbou:20210226204924p:plain

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

f:id:m_kbou:20210226204939p:plain

[サンプル]:

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

drive.google.com

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

 

おわりに

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