ACCESS VBAでのループ処理

VBAでのループ処理

ACCESS VBAで最もよく使う処理は何か?と聞かれたら、条件分岐とループ、と答えます。

それくらいループはよく利用される処理です。

逆に言えば、ループを覚えればかなり多くの機能が作成できるようになります。

今回は、ACCESS VBAでのループ処理をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

ループ処理の方法

ACCESSでループ処理を作るには大きく分けて以下の3つの方法があります。

For … Next

決められた回数だけ、処理を繰り返します。

Do … Loop

条件を満たすまで、もしくは満たしている間、処理を繰り返します。

For Each … Next

配列やコレクションのすべての要素に対して同じ処理を実行します。

この中で私が一番よく使うのはDo…Loopですね。

以下、それぞれを詳しく説明します。

For … Next

For…Nextステートメントは、カウンター変数を用いて決められた回数だけ処理を実行します。

以下の構文で利用します。


 For カウンター変数 = 初期値 to 最終値

   繰り返す処理

 Next カウンター変数

カウンター変数の初期値から始まり、処理を行うごとにカンター変数が足されていき、最終値になるとループを脱出して処理が終了します。

実際のコード例を示します。


Public Sub test_loop()

Dim i As Long
Dim a As Long

For i = 1 To 10

    a = a + 1
    
Next i

Debug.Print a

End Sub

この例ではカウンター変数に i を使い、変数 a の値に1を足す処理をループで実施しています。

カウンター変数はなぜか i を使うことが多いです。

Do … Loop

Do…Loopは条件を満たすまで、もしくは満たしている間、処理を繰り返します。

条件の判定方法は前判定と後判定があり、条件の記述方法もUntilとWhileがあります。

この組み合わせでループの記述方法は4パターンになり、まとめると以下になります。

記述方法判定方法条件に対する動作最低ループ回数
Do Until … Loop前判定条件を満たすまでループ0
Do While … Loop前判定条件を満たしている間ループ0
Do … Loop Until …後判定条件を満たすまでループ1
Do … Loop While …後判定条件を満たしている間ループ1

前判定ではいきなり条件に合致しなかった場合はループに入らずに終了するので、最低ループ回数は0回です。

最低でも1回はループ処理を行いたい場合は後判定を利用しましょう。

実は、条件や処理内容を書き換えることで同じ処理であっても4種類の記述ができます。

そのため、慣れた記述方法で条件の記述を工夫した方が効率が良いかもしれません。

先ほどのFor…Nextで例示した i が10になるまで a に加算する処理をそれぞれでの方法で記載すると以下になります。

Do Until … Loop

Public Sub test_loop1()

Dim i As Long
Dim a As Long

i = 1

Do Until i = 11

    a = a + 1
    i = i + 1

Loop

Debug.Print a

End Sub

i = 11が条件ですが、これはこの条件を満たしたときにループを脱出するため、10ではなく11に設定しています。

Do While … Loop


Public Sub test_loop2()

Dim i As Long
Dim a As Long

i = 1

Do While i < 11

    a = a + 1
    i = i + 1

Loop

Debug.Print a

End Sub

こちらも条件式の記述が変わったのみです。

i < 11の間、処理を実行しますので i が10までは実行されます。

Do … Loop Until …


Public Sub test_loop3()

Dim i As Long
Dim a As Long

i = 1

Do
    a = a + 1
    i = i + 1

Loop Until i = 11

Debug.Print a

End Sub

条件式が後判定に変わりました。

この条件ですと大きな変化はないですが、前判定のDo Until … Loopと比較すると、 i がいきなり11だった場合も1回は処理が行われます。

Do … Loop While …


Public Sub test_loop4()

Dim i As Long
Dim a As Long

i = 1

Do
    a = a + 1
    i = i + 1

Loop While i < 11

Debug.Print a

End Sub

こちらも同様に後判定で、 i がいきなり11だった場合も1回は処理が行われます。

For Each … Next

最後に、For Each … Nextステートメントです。

これは、配列やコレクションのすべての要素に対して同じ処理を実行します。

例えば、フォームにあるコントロールをすべてロックさせる場合に、コントロールをすべて指定していくのは面倒ですよね。

そういった場合に、For Each … Nextを使用すれば簡単にすべてのコントロールに処理を行うことができます。


Public Sub form_lock(form_detail_name As String)

For Each ctl In Forms(form_name).Section(acDetail).Controls
    
    Select Case ctl.ControlType
    
        Case 109, 110, 111
        '109:テキストボックス、110:リストボックス,111:コンボボックスの場合
        
            ctl.Enabled = False
            ctl.Locked = True
            ctl.BackColor = 15921906
        
        Case 106, 108, 112, 119, 122
        '106:チェックボックス、108:連結オブジェクトフレーム、112:サブフォーム、119:ActiveXコントロール、122:トグルボタンの場合

            ctl.Enabled = False
            ctl.Locked = True
            
        Case 104
        '104:コマンドボタンの場合
        
            ctl.Enabled = False
            
    End Select

Next

End Sub

これらの様々なループ処理を使い分ければ、かなりの種類のプロシージャを作成できます。

以上、VBAでのループ処理をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。