AccessVBAについて徹底解説!

VBA Do (While または Until) Loop ステートメントについて ~繰返し処理の解説と使用例~

Shirota

Shirota

開発エンジニア/AccessVBA/ExcelVBA/ボールド歴1年


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のコードを記述する際には、わかりやすい流れとすることがもっとも重要です。見た目も、インデントや、コメントを利用した覚書をしっかり行ってください。

そして、無限ループやエラーが仮に発生しても、容易にメンテナンスが可能なコードの記述を常に心がけていただきたいと思います。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中