Access VBAでADOを使用し始めると、レコード移動をコードで実装しなければならない場面に出くわすことがあります。ADOにおけるレコード移動を覚えると、より迅速に、かつ細やかなデータ処理を効率良く行えるようになるため、是非覚えておきたい方法です。
そこで、今回はADO中でレコード移動する方法について紹介します。
なお、ADOの使い方については、以下の記事をご参照ください。
サンプルデータの準備
レコード移動の過程を視覚的に理解しやすくするため、「T_ADOのレコード移動」テーブルを作成し、「ID」、「氏名」及び「生年月日」フィールドを作成します。また、これらフィールドのデータ型は、それぞれ、「オートナンバー型」、「短いテキスト」及び「日付/時刻型」とします。
そして表1に示すようにサンプルデータを登録します。
表1 サンプルデータ
ID | 氏名 | 生年月日 |
1 | 田山 武司 | 1981/12/15 |
2 | 奥平 凛花 | 1971/12/23 |
3 | 那須 美海 | 1965/11/18 |
4 | 野本 景子 | 1981/09/01 |
5 | 伊賀 絢音 | 1957/04/05 |
さて、次からはADOによるレコード移動の種類について見ていきましょう。
ADOによるレコード移動
ADOでレコード移動する際には、次の4つの方法が挙げられます。
・MoveFirst: 現在のレコードの位置を、レコードセット内の先頭レコードに移動する。
・MoveLast: 現在のレコードの位置を、レコードセット内の最終レコードに移動する。
・MoveNext: 現在のレコードの位置を、最終レコードに向けて1つ前方移動する。
※最終レコードでMoveNextを呼び出すと、End Of File(EOF)がTrueになる。
・MovePrevious: 現在のレコードの位置を先頭レコードに向けて1つ後方移動する。
※先頭レコードでMovePreviousを呼び出すと、Beginning Of File(BOF)がTrueになる。
なお、各メソッドの前にはレコードセットのオブジェクトを指定する必要がありますので、ご注意ください。
以上の内容をまとめたものを図1に示します。

このように、ADOにおいてはレコード移動が自由にできるため、これを活用することでクエリでの処理やSQL文での処理以上に細かなデータ処理ができるようになります。
次からは、サンプルデータを用いて具体的な処理を見ていきましょう。
コードの実装
さっそく、次のコードを標準モジュールに実装してください。
Public Sub ADO_RecordMove() 'ADOを使うための変数宣言 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'ADOによるデータベース接続 Set cn = CurrentProject.Connection rs.Open "T_ADOのレコード移動", cn, adOpenKeyset, adLockOptimistic '① データベース接続時のレコード位置 Debug.Print rs!ID & ", " & rs!氏名 & ", " & rs!生年月日 '② 最終レコードへ移動 rs.MoveLast Debug.Print rs!ID & ", " & rs!氏名 & ", " & rs!生年月日 '③ 最終レコードからループ文で一つずつ前にレコード移動 'Beginning Of File: BOFになったらループを抜ける。 Do Until rs.BOF = True'移動前のレコード
Debug.Print rs!ID & ", " & rs!氏名 & ", " & rs!生年月日
'レコードを一つ前に戻る
rs.MovePrevious
Loop '④ 先頭レコードへ移動 rs.MoveFirst Debug.Print rs!ID & ", " & rs!氏名 & ", " & rs!生年月日 '⑤ 先頭レコードからループ文で一つずつ次のレコードへ移動 'End Of File: EOFになったらループを抜ける。 Do Until rs.EOF = TrueDebug.Print rs!ID & ", " & rs!氏名 & ", " & rs!生年月日
rs.MoveNext
Loop 'データベース接続の解除処理 rs.Close cn.Close Set cn = Nothing End Sub
実装した際のVBA画面は図2のようになります。

それでは、実装したコードについて見ていきましょう。
まずは、ADOによるデータベース接続をするための変数宣言をします。そして、ADOによりカレントデータベースに接続し、「T_ADOのレコード移動」テーブルを開きます。
①では、データベースに接続した際のカレントレコードにおける各フィールドの値を「Debug.Print」を用いてイミディエイトウィンドウに表示させる処理です。ここで、「rs!~」の表記は当該レコード中の「~」フィールドの値を返すことを意味しています。
②では、「MoveLast」により最終レコードに移動し、その際のレコードの内容を表示させています。
③では、Do Loop文と「MovePrevious」を用いて、最終レコードから一つずつ前にレコード移動する処理をし、BOFになったらループを抜けるようにしています。
④では、「MoveFirst」により先頭レコードへ移動し、その際のレコードの内容を表示させています。
⑤では、Do Loop文と「MoveNext」を用いて、先頭レコードから一つずつ次のレコードへ移動する処理をし、EOFになったらループを抜けるようにしています。
そして、データベースの接続解除の処理をしてルーチンとしては終了となります。
実装したコードの動作検証
先ほど作成したコードにカーソルを合わせた後、VBA画面上部にある「▶」アイコンをクリックします。これにより、実装したコードにより処理がされ、イミディエイトウィンドウに結果が表示されます(図3)。

いかがでしょうか。図3に示す結果が得られたと思います。ここで、図3中の丸数字は図2中のコメントアウトで各ステップの説明のために記載した丸数字と一致させています。
①ではデータベース接続時のレコード位置、②では最終レコード移動時、③では最終レコードからBOFへの移動時、④では先頭レコード移動時、そして、⑤では先頭レコードからEOFへの移動時の結果がそれぞれ返されています。
このように、各メソッドを組み合わせ、かつ「rs!~」でフィールドを指定することで細かくデータの更新や修正をすることも可能です。また、今回は「T_ADOのレコード移動」テーブルを開きましたが、SQL文で必要レコードを抽出すれば、さらにスピーディな処理も実現できます。
まとめ
今回は、ADOにおいてレコード移動する方法を紹介しました。
サンプルでは5レコードに対する処理をしましたが、If文等を上手く組み合わせればレコード移動時に分岐処理をすることもでき、大量レコードを自由自在に効率良く処理できるため、無限の可能性を秘めています。
是非、今回ご紹介した方法を踏まえて業務効率の改善を図っていただければと思います。
Accessに興味を持たれた方は、是非お手元に用意されてみてはいかがでしょうか。
また、今回紹介した方法は専門書でも紹介されていますので、ご参考にしてください。
スポンサーリンク
コメント