同じ処理を繰り返す「ループ処理」で、For ~ Next がありますが、これはあらかじめ決められた回数(カウンター変数)を繰り返すことになります。
これに対し、ある一定の条件の下で「ループ処理」を行うのに「Do ~ Loop」ステートメントがあります。
これも条件式によって、「Do While ~ Loop」と「Do Until ~ Loop」の二つに分かれます。
それぞれについて解説します。
Do While ~ Loop
Do Whle 条件式
条件式が真( True / 条件が満たされている )の場合に繰り返される処
Loop
Do While ~ Loopステートメントは、For ~ Next と異なり、処理回数を指定する代わりに、特定の条件を指定します。
そしてその条件が真、つまり条件が満たされている間は、同じ処理を繰り返します。
そしてその条件が偽、すなわち満たされなくなった時、その繰り返し処理をスキップしてそのループから抜け出し、次の処理に移ります。

ある商品の在庫数が各支店から毎日終業時に送られてきます。
集計ボタンを押すことにより、3支店の合計数が「合計」欄に表示されるマクロです。
Sub DOループ_1()
Dim Az As Long ‘①
Dim Bz As Long ‘②
Dim Cz As Long ‘③
Dim DT As Long ‘④
Dim RW As Long ‘⑤
RW = 3 ‘⑥
DT = Cells(3, 3).Value ‘⑦
Do While DT > 0 ‘⑧
‘⑨
Az = Cells(RW, 5).Value
Bz = Cells(RW, 6).Value
Cz = Cells(RW, 7).Value
‘⑩
Cells(RW, 8) = Az + Bz + Cz
RW = RW + 1 ‘⑪
DT = Cells(RW, 3).Value ‘⑫
Loop
End Sub
① A支店の在庫数の変数 型は数字
② B支店の在庫数の変数 型は数字
③ C支店の在庫数の変数 型は数字
④ 「日」の変数 型は数字
⑤ 日報のセルの行番号の変数 型は数字
⑥ 日報スタート時の行番号をRWに入れる
⑦ 日報初日の「日」をDTに入れる
⑧ DT(「日」)が1以上の間は⑨~⑫の処理を繰り返す
DT(「日」)が1以上でなくなったら Loopより抜け出す
ーーー ここからが繰り返す処理内容
⑨ Az・Bz・Cz にその日の在庫数を取り込みます。
⑩ 合計欄にA ・B・C店の合計在庫数を表示します。
⑪ 翌日データを処理するため、行番号を一つ増やします。
⑫ 次の「日」をDTに代入します。
ーーー ここまでが繰り返す処置内容
Loop で ⑧へ戻る
⑦でDT=19になれば、再度処理を繰り返します。
そして次の日を再度読み込みますが、「日」は空欄ですので DT=0 となります。
⑧に戻った段階で、条件と合わないためLoopを離れることになります。
結果は

Do While DT>0 としているので、もし10月1日か2日ににこのマクロを動かしたとしたら、データが全くない状態です。
当然ながら最初から DT=0 ですので、何の処理もなされないままLoopを抜け出すことになります。
Do Until ~ Loop
Do Until 条件式
条件式が偽( False / 条件が満たされない )の場合に繰り返される処理
Loop
Do Until ~ Loopステートメントは Do While の場合と異なり、条件が偽(False)の間は処理を繰り返し、真(True)になったところで Loop を抜け出し次の処理に移ります。
つまり「〇〇ではない限り処理を繰り返す」と捉えた方がわかりやすいです。

Do While ~ Loop では以上のように合計が表示された日報でした。
今度はこの合計数量が11,000個以上の場合は「許容在庫」と備考欄に記載することにします。
11,000個を下回った段階でこのループから抜け出し、「要 仕入発注」と仕入発注を促す注意文を備考欄に表示するようにします。
Sub DOループ_2()
Dim TL As Long ‘①
Dim RW As Long ‘②
RW = 3 ‘③
TL = Cells(3, 8).Value ‘④
Do Until TL < 11000 ‘⑤
’⑥
Cells(RW, 9) = “許容在庫”
RW = RW + 1 ‘⑦
TL = Cells(RW, 8).Value ‘⑧
Loop
‘⑨
If Range(“C3”) <> “” Then
Cells(RW, 9).Value = “要 仕入発注”
End If
End Sub
① 合計数を代入する変数 型は数字
② 日報のセル番号を代入する変数 型は数字
③ 初日のセル番号をRWに代入
④ 初日の合計数をTLに代入
⑤ 合計数が 11,000個を下回るまで(11,000個を下回らない限り)⑥~⑧の処理を繰り返します。
この日本語での表現が難しいです。
冒頭では、Do While は「条件式が偽の間は処理を繰り返す」と言いました。
つまり「合計数が11,000個を下回る」が偽の間は処理を繰り返すことの意味になります。
よって「合計数が11,000個を下回ってない間は⑥~⑧の処理を繰り返すことになります。
ーーー ここからが繰り返す処理内容
⑥ 備考欄に「許容在庫」と記載する。
⑦ 翌日データを処理するため、行番号を一つ増やします。
⑧翌日の合計数をTLに代入します。
ーーー ここまでが繰り返す処理内容
Loop で ⑤へ戻る
⑨ Loopを抜け出した後の処理
Loopを抜け出したということは、在庫数が11,000個を下回ったということです。
よって、備考欄に「要 仕入発注」の記載をおこないます。
但しここで「 If Range(“C3”) <> “” Then 」の If 文があります。
これは日報に何も記載がない場合、つまり10月1日・2日が休日で何の記載もない場合は「要 仕入発注」を記載する必要がないためです。
Do ~ Loop While / Do ~ Loop Until
Do
繰り返す処理
Loop While 条件式
Do
繰り返す処理
Loop Until 条件式
このように 「While 条件式」や「Until 条件式」を Loop の後ろに書くこともあります。
この場合、条件式の真・偽の判断は Do の後ろにある場合と基本的に同じです。
しかし「繰り返す処理」が条件式の真・偽にかかわらず、最初の1回は実行されます。
先ほど説明しました「支店別〇〇在庫日報」では、結果は同じように見えます。
ところが全くデータが入っていない状態、つまり10月1日と2日の場合は次のようになります。
Do ~ Loop While の場合

最初の合計欄に「0」が記載されます。
Do ~ Loop Until の場合

最初の合計欄に「許容在庫」が記載されます。
このように見れば、While や Until をLoop の後ろに記載する必要がないように思えるかもしれませんが、条件によっては必要になる場合も考えられます。
最初のうちは Do の後ろにある場合でプログラムを組むことに慣れてください。
通常の場合、これで問題なく作業ができます。

