Access VBAの深淵へ:RecordsetCloneとFilterで実現する「爆速検索」の真髄
こんにちは。Accessという巨大なデータエンジンを使いこなそうと足掻くあなたへ。
これまで「検索ボタンを押すたびにクエリを書き換えて再描画する」という非効率なやり方に疲弊していませんか? それ、実はAccessの性能を半分も引き出せていません。
今回は、Accessのメモリ上で高速にデータを操る「RecordsetClone」と「Filterプロパティ」を用いた、プロ仕様の検索エンジン構築術を伝授します。これを知れば、あなたのアプリは劇的に軽快になり、ユーザーから「このツール、なぜこんなに速いの?」と驚かれるはずです。
—
1. なぜ「クエリ書き換え」ではいけないのか?
初学者の多くは、検索のたびに `CurrentDb.QueryDefs(“q検索”).SQL = “SELECT…”` のようにクエリを上書きしようとします。
しかし、これは「毎回テーブルへアクセスし、SQLを解析し、再描画をかける」という重い処理を繰り返す行為です。データが増えれば増えるほど、Accessは悲鳴を上げます。
そこで登場するのが、フォームが既に保持しているメモリ上のデータ(RecordsetClone)を利用する手法です。
—
2. 魔法のメソッド「RecordsetClone」とは
Accessのフォームには、実は「裏側で読み込んでいるデータセット」の複製が隠されています。これを `RecordsetClone` と呼びます。
このクローンは、フォームの表示を一切変えずに、裏で自由に検索・並べ替えができる作業領域です。ここにフィルタをかけ、その結果をフォームに「同期」させることで、爆速の検索体験が実現します。
—
3. 実践:高速検索エンジンの実装コード
以下のコードは、フォーム上に配置した「検索テキストボックス(txtKey)」に入力された文字で、リストを瞬時に絞り込むプロシージャです。
Private Sub txtKey_Change()
‘ 1. 現在のフォームのレコードセットのクローンを取得
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone
‘ 2. 検索キーワードの取得(Changeイベントは入力があるたびに発火)
Dim strKey As String
strKey = Me.txtKey.Text
‘ 3. フィルタ文字列の作成(例:氏名フィールドを部分一致検索)
‘ ※LIKE演算子で前後をアスタリスクで囲むのがポイント
If Len(strKey) > 0 Then
rs.Filter = “氏名 LIKE ‘” & strKey & “‘”
Else
‘ キーワードが空ならフィルタ解除
rs.Filter = “”
End If
‘ 4. フィルタリング後のレコードセットを再定義
‘ ここで絞り込まれた結果をフォームに渡します
Set Me.Recordset = rs.OpenRecordset
‘ 5. メモリ解放(重要:DAOオブジェクトは必ず閉じる)
rs.Close
Set rs = Nothing
End Sub
このコードの「賢い」ポイント
- イベントの選択: `AfterUpdate` ではなく `Change` イベントを使うことで、キーを打つたびに検索結果が追従する「ライブ検索」を実現しています。
- メモリ効率: `CurrentDb` を呼び出さず、フォームのメモリ上のコピーを操作するため、ネットワーク負荷が極めて低いです。
—
4. 初学者が陥りやすい「落とし穴」
この手法を使う際、以下の2点だけは必ず覚えておいてください。
① `Me.Recordset` に代入した後の「ブックマーク」問題
フィルタをかけると、フォームの現在の位置(カレントレコード)が変わってしまうことがあります。もし特定のレコード位置を維持したい場合は、`rs.Bookmark` を保存して、フィルタ後に復元する処理を追加する必要があります。
② 文字列の引用符(クォーテーション)のエラー
フィルタ文字列を作る際、`’(シングルクォート)` の扱いでエラーが出ることがあります。検索対象に `’` が含まれている場合などは、`Replace関数` でエスケープ処理を行うのがプロのたしなみです。
—
5. まとめ:Accessを「ツール」から「武器」へ
今回紹介した `RecordsetClone` によるフィルタリングは、Access開発の基礎であり、同時に「パフォーマンスを意識した設計」の入り口です。
- クエリの動的生成は「重い」
- フォームのメモリ(RecordsetClone)は「速い」
この原則を理解できたなら、あなたはもうマクロの記録を卒業したエンジニアの卵です。ここをクリアすれば、次は「非同期通信」や「クラスモジュール」といった、より深い世界が待っています。
まずはあなたのフォームで、このコードを試してみてください。そのレスポンスの速さに、きっと驚くはずですよ。
それでは、また次回の深淵でお会いしましょう。健闘を祈ります。
