VBA入門
繰り返し処理(Do Loop)

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2021-08-21

第17回.繰り返し処理(Do Loop)


繰り返し処理として前回はFor~Nextをやりました。
今回はDo~Loopです。


For~Nextに比べると使用頻度は落ちますが、必ず覚える必要があるものです。

For~Nextは、繰り返す回数をあらかじめ指定するものでしたが、
Do~Loopは、繰り返す回数ではなく、繰り返す条件を指定するものです。


Do~Loopの構文

Do [{While | Until} condition]
  [statements]
  [Exit Do]
  [statements]

Loop

または、次の構文を使用できます。

Do
  [statements]
  [Exit Do]
  [statements]

Loop [{While | Until} condition]

condition 省略可能です。
真 (True) または偽 (False) を評価する数式、あるいは文字列式を指定します。
引数 condition の値が Null 値の場合、引数 condition は偽 (False) であるとみなされます。
statements 引数 condition が真 (True) である間、または引数 condition が真 (True) になるまで繰り返し実行される、
任意の行数のステートメントを記述します。

これは、Excelのヘルプからの抜粋です。
これを読んでわかるなら苦労しないし、このサイトは訪れないと思いますので、
もう少し詳しく、説明します。
余分なものを消して、さらに日本語で書くと

Do [While 条件式]
  ・・・処理・・・
Loop

または、

Do [Until 条件式]
  ・・・処理・・・
Loop

Whileは、条件を満たす間、・・・処理・・・を実行します。
Untilは、条件を満たす迄、・・・処理・・・を実行します。

次のような書き方もありますが、特に覚えなくても良いでしょう。

Do
  ・・・処理・・・

Loop [{While | Until} 条件式]

これは、必ず1回は処理を行い、処理の後で条件判定されます。


条件式

真(True)か偽(False)を評価する数式または文字列式を指定します。

数式とは、数値と比較演算子・論理演算子の組み合わせ、
文字列式とは、文字列と比較演算子・論理演算子の組み合わせです。

比較演算子 意味
= 等しい
<> 等しくない
> より大きい
>= 以上
< より小さい
<= 以下

論理演算子 意味
And 論理積
Or 論理和
Xor 排他論理和
Eqv 論理等価
Imp 論理包含

And、Or、Notだけ理解できていれば問題ありません。


Do Loop 例文

Do Loopの例文です。

A1セルからA10セルに、1を入れる場合です。

Sub 練習1()
  Dim i
  i = 1
  Do While i <= 10
    Cells(i, 1) = 1
    i = i + 1
  Loop
End Sub

または

Sub 練習2()
  Dim i
  i = 1
  Do Until i > 10
    Cells(i, 1) = 1
    i = i + 1
  Loop
End Sub
※.Valueは省略しています。

Whileは、条件を満たす間
Untilは、条件を満たす迄

従って、
WhileUntilの条件は、補集合の関係になります。
つまり、

Not(Whileの条件) = Untilの条件
Whileの条件 = Not(Untilの条件)

このような関係になります。

また、
i = 1
これは、変数iに1を入れています。
そして、
i = i + 1
これは、変数iに1を足して、変数iに入れ直しています。
つまり、変数iは1増える事になります。
1行ずつ説明を書くと

Sub 練習1()
  Dim i        '変数iを宣言
  i = 1         '変数iに1を入れる
  Do While i <= 10  '変数iが10以下の間処理を続ける
    Cells(i, 1) = 1 'A列のi行に1を入れる
    i = i + 1     '変数iを1増やす
  Loop        'Doの処理範囲はここまで
End Sub

マクロVBAコードとコメントを見比べながら、しっかりと理解してください。

For~Nextの Step 2 のように、1行置きに処理したい場合は、
i = i + 2
こうすれば良い事は直ぐに理解できるでしょう。

WhileUntilは、どちらを使ってもよいです。
ただし、基本的にはどちらか一方を主に使うようにしましょう。
混在して使うと、プログラムが読みづらくなってしまう場合があります。


Exit Do

Exit Doは、Do~Loopのループを抜けます。

指定の条件になる前に、
Do~Loopのループ処理を終了したい場合に使用します。
良く使う場合としては、

Do
 処理を終了したい時に、Exit Do
Loop

このように、Doに終了条件を書かずに、
そのループの中で、終了条件を判定し、処理を終了する場合です。


Do~Loopのネスト(入れ子)

縦10行、横10列に1を入れる場合です。

Sub 練習3()
  Dim i, j
  i = 1
  Do Until i > 10
    j = 1
    Do Until j > 10
      Cells(i, j) = 1
      j = j + 1
    Loop
    i = i + 1
  Loop
End Sub

F8ステップインで実行して、内側のDoから外側のDoに移る様子を確認して下さい。

Do~Loopのネストは、概ね3段階までにしましょう。


最後に一言

Do~Loopは、For~Nextに比べると使用頻度も落ちますし、使い方が少々難しくなります。
しかしVBAが上達していき、いろいろな処理を書き始めると、繰り返し回数が不明な場合も増えてきます。

例えばフォルダ内の全ファイルを処理する場合や、
外部入力が完了するまでVBA内で待っているというような場合には必須になってきます。
もちろん、これらが必要になった時に詳細を確認すれば良いです。
まずは、基本文型を把握しておいてください。




同じテーマ「マクロVBA入門」の記事

第14回.文字の結合(&アンパサンド)と継続行(_アンダーバー)
第15回.四則演算と注釈(コメント)
第16回.繰り返し処理(For Next)
第17回.繰り返し処理(Do Loop)
第18回.最終行の取得(End,Rows.Count)
第19回.総合練習問題1
第20回.条件分岐(IF)
第21回.条件分岐(ElseIf)
第22回.条件分岐(Select Case)
第23回.メッセージボックス(MsgBox関数)
第24回.インプットボックス(InputBox関数)


新着記事NEW ・・・新着記事一覧を見る

シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)
列幅不足による###表示や指数表示を判定する|VBA技術解説(2023-07-12)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-07-04)
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ