【入門編】DAO.RecordsetのCloneとBookmarkで実現する非連結フォームでの高速検索UI – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:非連結フォームで「高速検索UI」を構築する極意

こんにちは。Accessの迷宮を探索し続け、数々のシステムを自動化してきたエンジニアです。

Access開発において、「フォームは便利だが、データ量が増えると重くなる」「非連結フォームにしたいが、操作性が落ちるのは嫌だ」というジレンマに直面したことはありませんか?

今回は、DAO.Recordsetの「Clone」と「Bookmark」という、Accessの心臓部に深く切り込む技術を使って、非連結フォームでもまるでネイティブのような高速検索UIを実現する方法を伝授します。

ここを理解すれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Accessのオブジェクトモデルを自在に操る、プロの入り口に立っているのです。

1. なぜ「Clone」と「Bookmark」なのか?

Accessのフォームには強力なデータ連結機能がありますが、巨大なテーブルを直接バインドすると、検索のたびにUIがフリーズし、ユーザーにストレスを与えます。

そこで登場するのが「クローン」です。

  • Clone(クローン): フォームが持っているレコードセットの「コピー」を作ります。メモリ上に展開されるため、検索しても画面描画(リペイント)の負荷がかかりません。
  • Bookmark(ブックマーク): レコードの「指し示し」です。クローン側で検索した位置を、フォーム側に即座に反映させるための「同期キー」となります。

これらを組み合わせることで、「裏側で爆速検索し、表側でその位置にジャンプする」という、洗練されたUIが完成します。

2. 実装コード:高速検索エンジンの構築

まずは、以下のコードを見てください。検索用のテキストボックスに値を入力し、ボタンを押すと目的のレコードへ瞬時にジャンプする仕組みです。

‘ 検索ボタンのクリックイベント
Private Sub btnSearch_Click()
Dim rs As DAO.Recordset
Dim strTarget As String

‘ 検索対象を取得
strTarget = Me.txtSearch.Value

‘ 1. フォームのレコードセットをクローンしてメモリ上に展開
Set rs = Me.RecordsetClone

‘ 2. 高速なFindFirstメソッドで検索
‘ IDや名前など、インデックスが貼られたフィールドを検索するのが鉄則
rs.FindFirst “EmployeeName = ‘” & strTarget & “‘”

‘ 3. 検索結果の判定
If rs.NoMatch Then
MsgBox “該当するデータは見つかりませんでした。”, vbInformation
Else
‘ 4. Bookmarkを同期させる魔法のコード
‘ これにより、フォームの表示位置が一致するレコードへ瞬時に移動する
Me.Bookmark = rs.Bookmark
End If

‘ オブジェクトの解放(メモリ管理はプロの基本)
Set rs = Nothing
End Sub

このコードのポイント

  • Me.RecordsetClone: これを呼び出すと、フォームの現在のデータをメモリ上の独立したインスタンスとして扱えます。
  • rs.NoMatch: 検索が失敗した時の処理です。これがないと、該当なしの時にAccessがエラーを吐いて止まってしまいます。
  • Me.Bookmark = rs.Bookmark: これが今回一番伝えたかった核心です。異なるレコードセット間で、物理的な位置関係を同期させる唯一無二の手段です。

3. 陥りやすい罠と対策

初心者がこの実装でよくやる「失敗」を先回りして教えます。

① インデックスを貼っていない

`FindFirst` は強力ですが、検索対象のフィールド(例:EmployeeName)にインデックスが設定されていないと、検索速度は劇的に低下します。「検索に使うフィールドにはインデックスを貼る」。これはデータベース設計の鉄則です。

② 明示的なメモリ解放の忘れ

`Set rs = Nothing` を忘れると、Accessのメモリ内にゴミが溜まり続けます。数千回、数万回の検索を繰り返すうちに、Accessは徐々に重くなり、最終的にクラッシュします。エンジニアとして、使ったリソースは必ず自分で片付ける癖をつけましょう。

最後に:なぜ「ここ」を学ぶべきなのか

多くの人が、Accessの標準機能だけで限界を感じて挫折します。しかし、このように「オブジェクトの裏側の挙動」を意識できるようになると、Accessは単なる「事務ツール」から「高度な業務システム基盤」へと変貌を遂げます。

CloneとBookmarkを掌握したあなたは、もう「標準機能が足りない」と嘆くことはありません。自らロジックを組み、欲しい動きを作り出せるのですから。

さあ、あなたのAccessを、もっと速く、もっと賢いものへ。
次のステップとして、DAOを使いこなした「非連結フォームでのデータ更新」に挑戦してみるのも面白いかもしれませんよ。

何か分からないことがあれば、いつでも聞いてくださいね。あなたのエンジニアリングライフを応援しています!

タイトルとURLをコピーしました