Accessを極める:DAO.Recordset「Clone」と「Bookmark」で実現する爆速検索UI
こんにちは。現場で「Accessが重い」「フォームの動きがもっさりする」という悩みに直面したことはありませんか?
多くの開発者は、とりあえずテーブルやクエリをフォームに直接「連結(バインド)」して開発を始めます。しかし、数万件を超えるデータや複雑な計算が絡むようになると、その「便利さ」は「低速」という代償として返ってきます。
今日は、プロの現場で必須となる「非連結フォーム」×「DAO.Recordset」の黄金コンビと、その中核をなす`Clone`と`Bookmark`という強力な武器について解説します。これさえマスターすれば、あなたのAccessアプリケーションは別次元の快適さを手に入れるはずです。
—
1. なぜ「非連結フォーム」を選ぶのか?
「連結フォーム」はAccessの標準機能であり、強力ですが、レコードの読み込みごとにAccessが裏でせわしなく通信を行います。これが原因で、検索やスクロールが重くなるのです。
一方、非連結フォームは、「必要なデータだけをメモリに載せて、プログラムで制御する」スタイル。
- メリット: 圧倒的な動作の軽さ、検索処理の完全なコントロール、意図しないデータ更新の防止。
- 代償: 画面操作をすべてコードで書く必要がある。
ここで登場するのが、DAO(Data Access Objects)の`Clone`と`Bookmark`です。
—
2. 魔法のメソッド:CloneとBookmark
Cloneとは?
`Clone`は、レコードセットの「コピー」を作ります。ただし、物理的なデータのコピーではなく、「同じデータセットを見ている別のポインタ」を生成します。
- フォームで現在表示しているレコードセットをコピーして、裏側で自由に検索やフィルタリングを行っても、画面上の表示には一切影響を与えません。
Bookmarkとは?
`Bookmark`は、いわばレコードの「しおり」です。
- レコードセット内の特定のレコードを一意に指し示すバイナリデータ。
- 検索で見つけたレコードの「しおり」をフォーム側に渡してあげるだけで、Accessは瞬時にそのレコードへジャンプ(同期)してくれます。
—
3. 実践コード:高速検索UIを構築する
以下は、非連結フォーム上の検索ボックスに入力した値をもとに、DAOを使って高速検索を行い、フォームを同期させるコードの雛形です。
‘ 検索ボタンのクリック時イベント
Private Sub btnSearch_Click()
Dim rs As DAO.Recordset
Dim strCriteria As String
‘ フォームのレコードセットをクローンして操作用にする
‘ 画面の表示を乱すことなく、裏側で高速に検索ができる
Set rs = Me.Recordset.Clone
‘ 検索条件の構築 (例: ID検索)
strCriteria = “EmployeeID = ” & Me.txtSearchID.Value
‘ 検索実行
rs.FindFirst strCriteria
‘ 見つかったかどうかを確認
If Not rs.NoMatch Then
‘ 【重要】見つけたレコードのBookmarkをフォームに渡す
‘ これだけでフォームの表示が瞬時に該当レコードへ切り替わる
Me.Bookmark = rs.Bookmark
Else
MsgBox “該当するデータは見つかりませんでした。”, vbExclamation
End
‘ メモリ解放(お作法です)
rs.Close
Set rs = Nothing
End Sub
—
4. ここでつまずく!初心者が陥りやすいエラー
この領域に足を踏み入れると、必ず一度は遭遇する壁があります。
1. `Me.Recordset.Clone` が使えない?
- フォームのレコードソースが設定されていないとエラーになります。まずは `Me.RecordSource = “SELECT FROM …”` と設定してから呼び出してください。
2. `Bookmark`の型不一致
- 「しおり」はVariant型です。自分で無理にデータ型を定義せず、Variant型として扱うのが定石です。
3. メモリリーク
- `Set rs = Nothing` を忘れると、Accessを閉じてもメモリ上にデータが残り続け、動作が徐々に重くなります。オブジェクトを生成したら必ず閉じる(Close)、解放する(Nothing)という習慣を身につけましょう。
—
5. 次のステップへ
`Clone`と`Bookmark`を使いこなせるようになると、Accessのフォームは「単なる入力画面」から「高度な制御インターフェース」へと進化します。
「連結フォームの重さに疲れた」「もっと自分好みに動くUIを作りたい」と思ったら、ぜひこのコードをあなたのプロジェクトに組み込んでみてください。
エンジニアとしての極意:
「便利な機能に頼るだけでなく、その裏側で何が起きているかを制御する」。これが、マクロ卒業への近道であり、伝説のエンジニアへの第一歩です。
ここをクリアしたあなたは、もうAccessの初心者ではありません。自信を持って、次の開発へ進んでください!質問があれば、いつでもコメント欄で待っていますよ。
