
VBA Do (While または Until) Loop ステートメントとは?~繰返し処理の解説と使用例~
目次
1.繰り返し処理について
繰り返し処理を実行したいとき、Do Loopステートメントを使用します。
決められた回数を繰り返す処理では For Nextステートメントを主に使用します。
Do Loopステートメントはレコード操作や、入力チェック処理などに使用します。
1-1.Do Loopステートメント
Do Loopステートメントは条件式に対して繰り返し処理を実行するキーワードが2種類あります。
条件式を満たしている間の「While」と、条件式を満たすまでの「Until」です。
そして条件式の位置には「実行前」と「実行後」があります。
1-1-1.実行前判断と実行後判断
【実行前判断】
- 実行前判断では、Do Loopステートメントの最初に条件式があります。
- 条件を満たさないとDo Loopステートメント内の処理を実行しません。
Do (While または Until) 条件式
処理
Loop
【実行後判断】
- 実行後判断では、Do Loopステートメントの最後に条件式があります。
- 条件を満たしていなくても1回はDo Loopステートメント内の処理を実行します。
Do
処理
Loop (While または Until) 条件式
1-1-2.While キーワード と Until キーワード
キーワードには、条件式を満たしている間の「While」と、条件式を満たすまでの「Until」があります。
「While」キーワードは「Until」キーワードに書き換えることができます。どちらのキーワードを使うのか、それぞれに相応しい使い方というのものがあると思います。
例えば、レコードの読み込み条件の場合、「終了しない間」は「終了するまで」に書き換えることができます。
' ' Do While Not RS.EOF ' 終了しない間 Do Until RS.EOF ' 終了するまで Debug.Print RS.Fields(0) RS.MoveNext Loop '
決められた回数(カウンタ)条件の場合、「1~99の間」は「100になるまで」に書き換えることができます。
' lngCount = 1 ' Do While lngCount < 100 ' 1~99の間 Do Until lngCount >= 100 ' 100になるまで Debug.Print lngCount lngCount = lngCount + 1 Loop '
プログラムを開発するうえで「While」キーワードか「Until」キーワードか、使い分けに悩むケースがあると思いますが、コードの解析に時間をかけない、かけさせないこと、仕様書にある値をそのまま利用し、内容をすぐに確認できることが重要です。
また、上記のようなコメントを利用して、覚書や仕様に関わる説明文を記述することも重要です。
2.Do Loopステートメントの使用例
2-1.Exitステートメントの使用例
繰り返し処理から強制的に抜け出したい場合は、Exitステートメントを使用します。Do Loopステートメントの場合は 「Exit Do」と記述します。
Sample1の7行目の「Exit Do」はInputBoxの[キャンセルボタン]のクリックに対応します。[OKボタン]のクリックの場合は、Do Loopステートメントの実行後判断を使用し、日付が入力されるまで繰り返し処理を行います。
Sub Sample1() Dim strValue As String Do strValue = InputBox("日付を入力してください", , Date) If strValue = "" Then Exit Do ' キャンセルの対応 Loop Until IsDate(strValue) End Sub
2-2.ADOを利用したレコード操作の使用例
Do Loopステートメントの代表的な使い方としてレコード操作があります。
Sample2のDo Loopステートメントは、“m_resource”レコードが終了するまで、繰り返しDebug.Print処理を実行する記述です。EOFとは、Recordset オブジェクトのプロパテイの1つで、最終レコードの次にあたるときに True を返します。
8行目の条件式の記述は、「Do Until RS.EOF = True」のTrue を省略した記述です。
どちらの記述でも正しく動作します。テーブル名 “m_resource” を作成し、下記のコードを実行してください。
False の記述は、「Do While RS.EOF = False」または、「Do While Not RS.EOF」と記述します。
8行目のコメントを除いて、9行目にコメントをして実行してください。
Sub Sample2() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = CN.Execute("m_resource") ' Do While Not RS.EOF ' Not終了の間 Do Until RS.EOF ' 終了するまで Debug.Print RS.Fields(0) RS.MoveNext Loop RS.Close CN.Close Set RS = Nothing Set CN = Nothing End Sub
2-3.無限ループ
Do Loopステートメントは、条件式や繰り返し処理が適切ではないと無限に処理が続き、処理が終わらない「無限ループ」が発生することがあります。
下記コードは3行目のIfステートメントの条件式を満たすときしか「RS.MoveNext」は実行されません。条件式を満たさない場合、カレントレコードは移動しません。その場合は無限ループが発生します。
' Do Until RS.EOF ' 終了するまで If RS.Fields(0) > 0 then Debug.Print RS.Fields(0) RS.MoveNext End If Loop '
強制終了する場合、[Ctrl] + [Break] キー を押します。
3.さいごに
VBEのコードを記述する際には、わかりやすい流れとすることがもっとも重要です。見た目も、インデントや、コメントを利用した覚書をしっかり行ってください。
そして、無限ループやエラーが仮に発生しても、容易にメンテナンスが可能なコードの記述を常に心がけていただきたいと思います。
コメント