Access VBAを掌握する:DAO.RecordsetのCloneとBookmarkで実現する「極限の高速検索UI」
Access開発において、多くのエンジニアが「非連結フォーム」を採用する理由は明確だ。パフォーマンス、排他制御、そして何より「データの完全なコントロール」を手に入れるためだ。
しかし、非連結フォームにおいて「検索結果から該当レコードへジャンプし、さらに前後のレコードへ移動する」というUIを実装しようとした途端、多くの者が躓く。`DLookup`を乱発し、その都度クエリを投げ、フォームを再リクエリして……。そんな非効率な実装は、今すぐ捨て去るべきだ。
真のエンジニアは、「DAO.RecordsetのClone」と「Bookmark」を操る。これこそが、Accessのメモリ空間を最大限に活用し、爆速の検索体験を実現する唯一無二の定石だ。
—
1. なぜ「再クエリ」ではなく「クローン」なのか
多くの初学者は、検索のたびに `Me.Requery` を実行する。だが、これはサーバーやローカルDBへの不要なI/Oを発生させ、フォームのチラつきやカーソル位置の喪失を招く。
対して `Recordset.Clone` は、既に開かれているレコードセットの「参照」をメモリ上にコピーするだけだ。データそのものは複製されない。クローンは元のレコードセットの「現在位置(カレントレコード)」を共有しないため、UI側のカーソル位置を一切汚さずに、バックグラウンドで高速な検索処理を完結できる。
2. 実装の極意:Bookmarkによる同期
クローン上で目的のレコードを特定した後、その `Bookmark` プロパティをフォームの `Recordset.Bookmark` に代入する。これだけで、フォームは瞬時に該当レコードへ「テレポート」する。
実装コード:堅牢な検索ロジック
以下は、実務でそのまま利用可能な検索モジュールだ。エラーハンドリングを徹底し、境界値チェックを組み込んでいる。
”’
”’
”’ 検索対象の主キー
Public Sub SyncRecordToBookmark(ByVal targetID As Long)
Dim rsClone As DAO.Recordset
‘ フォームのレコードセットをクローン
‘ メモリ効率とパフォーマンスの観点から、必ず明示的にSetする
Set rsClone = Me.RecordsetClone
On Error GoTo Err_Handler
‘ 検索実行(FindFirstはインデックスが効くフィールドに対して実行すること)
rsClone.FindFirst “ID = ” & targetID
‘ 検索結果の検証
If Not rsClone.NoMatch Then
‘ ブックマークを同期し、フォームの表示を更新
Me.Bookmark = rsClone.Bookmark
Else
MsgBox “対象のレコードは見つかりませんでした。”, vbExclamation
End If
Exit_Proc:
‘ オブジェクトの解放(ライフサイクル管理の基本)
If Not rsClone Is Nothing Then rsClone.Close
Set rsClone = Nothing
Exit Sub
Err_Handler:
MsgBox “検索中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume Exit_Proc
End Sub
—
3. プロダクションコードにおける「3つの鉄則」
このコードを現場で運用する際、以下の3点を徹底しなければ、いずれ「謎のバグ」に頭を抱えることになる。
① インデックスは「呼吸」と同じ
`FindFirst` メソッドを使用する場合、検索対象フィールドにインデックスが設定されていないと、パフォーマンスは劇的に低下する。Accessにとって「インデックスなしの検索」は全件走査(フルスキャン)を意味する。数万件のテーブルでこれをやれば、UIは固まる。
② クローンのライフサイクルを制御せよ
`Set rsClone = Me.RecordsetClone` で生成したオブジェクトは、プロシージャを抜ける前に必ず `Nothing` を代入してメモリを解放する癖をつけよ。これを怠ると、Accessのメモリリークの温床となり、長時間稼働後の不安定さを引き起こす。
③ 非連結フォームと同期の罠
もしフォームが「非連結」ではなく、データソースと直接バインドしている場合、`Bookmark` の同期は非常に強力だ。しかし、フォーム側の `Recordset` が `Dynaset`(更新可能)であるかを確認すること。Snapshot設定になっている場合、同期後に編集しようとするとエラーが発生する。
—
結論:Accessを「ただのツール」で終わらせないために
DAOを理解することは、Accessというアプリケーションの心臓部に触れることと同義だ。`Clone` と `Bookmark` を使いこなすだけで、あなたの作るUIは一気にプロフェッショナルな挙動を見せるようになる。
「検索ボタンを押すと画面がチラついて、最後尾まで飛ばされる」という素人仕様は卒業しよう。メモリ上の参照を操り、必要な瞬間に必要な位置へジャンプする。 これこそが、業務を劇的に効率化するエンジニアの「所作」なのだ。
さあ、今すぐコードを書き換え、Accessの真のポテンシャルを解放してほしい。
