ACCESS 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の操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

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