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

スポンサーリンク

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の初心者ではありません。自信を持って、次の開発へ進んでください!質問があれば、いつでもコメント欄で待っていますよ。

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