よく使うステートメント

Do ~ Loop

 同じ処理を繰り返す「ループ処理」で、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 の後ろにある場合でプログラムを組むことに慣れてください。
通常の場合、これで問題なく作業ができます。