連結フォームの呪縛を解く:DAO.Recordset CloneとBookmarkで構築する「極限の検索UI」
Access開発において、「連結フォーム」は諸刃の剣だ。小規模なCRUD操作には最適だが、数万件規模のレコード、複雑な検索条件、あるいはトランザクション処理が絡むエンタープライズ領域に足を踏み入れた瞬間、その「過度な自動化」はパフォーマンスの足枷となり、メモリリークの温床となる。
シニアエンジニアである諸君なら理解しているはずだ。真に堅牢なシステムを構築するには、UIとデータソースを切り離し、「非連結フォーム」をDAOで制御するという選択肢が不可欠である。
今回は、DAO.Recordsetの`Clone`と`Bookmark`を駆使し、非連結フォームでネイティブ以上の検索レスポンスを実現するアーキテクチャを紐解く。
—
なぜ「Clone」と「Bookmark」なのか
非連結フォームにおける検索処理で最も重いのは、GUIへの再描画と同期処理だ。多くの開発者が、検索のたびに `Recordset.FindFirst` を実行し、フォームの `Recordset` を直接操作しようとする。これは愚策だ。
`Clone` メソッドは、元のRecordsetの「参照」をコピーする。データそのものを複製するのではない。メモリを消費せず、独立した「カーソル位置」を保持できるこの特性こそが、検索とUI同期を分離する鍵となる。
極限のパフォーマンスを実現する設計指針
1. データソースの分離: フォームのRecordsetは検索用、表示用とは別に管理する。
2. Bookmarkによる同期: 検索用Recordsetで位置を特定し、フォームのBookmarkへ値を代入するだけで、描画同期はWindows APIの裏側で最適化される。
3. 明示的なメモリ解放: VBAの参照カウンタを信用するな。`Nothing`代入は必須の儀式だ。
—
実装:高速検索エンジン・プロトタイプ
以下に、実戦で即座に通用する検索同期モジュールのコアロジックを提示する。
‘ フォームモジュール内に実装する高速検索ロジック
Private Sub ExecuteFastSearch(strCriteria As String)
Dim rsClone As DAO.Recordset
‘ フォームのRecordsetをクローン(メモリ負荷は極小)
Set rsClone = Me.RecordsetClone
‘ 検索実行
rsClone.FindFirst strCriteria
If Not rsClone.NoMatch Then
‘ Bookmarkを同期させることで、UIカーソルを瞬時に移動
Me.Bookmark = rsClone.Bookmark
‘ 成功時のログ出力やGUI制御
Debug.Print “Record found at: ” & rsClone.AbsolutePosition
Else
MsgBox “該当データが見つかりません。”, vbInformation
End If
‘ 重要:オブジェクトの明示的解放
‘ VBAのガベージコレクタを待つ必要はない。即座に開放する
rsClone.Close
Set rsClone = Nothing
End Sub
—
シニアエンジニアのための深掘り:パフォーマンスの重み
1. Windows APIによる描画抑制
上記コードでも十分高速だが、数万件をループ処理で検索・同期する場合は、フォームの描画がボトルネックになる。`Echo False` を併用するのも手だが、より厳密にやるならば、`LockWindowUpdate` APIを呼び出し、再描画を完全に止めてから同期を行うことで、UIのちらつきを完璧に排除できる。
2. レガシー環境とDAOの最適化
Access 2010以降、ACEエンジンは進化したが、古い `.mdb` 形式のデータベースを扱う場合、`dbOpenSnapshot` を指定したクローンの方がパフォーマンスが良いケースが多い。
‘ スナップショットとして開くことで、ロック競合を回避し高速化
Set rsClone = Me.Recordset.Clone
この際、`Recordset`の種類(DynasetかSnapshotか)を意識することは、マルチユーザー環境におけるデッドロック回避の基本である。
3. メモリ管理の極意
VBAにおける `Set obj = Nothing` は、単なるお作法ではない。特にフォームを動的に生成・破棄するシステムでは、参照が残ると「隠れたインスタンス」がメモリに居座り、数日間の稼働でシステムが肥大化する。`Class_Terminate` イベントを適切に記述し、オブジェクトの生存期間を厳密に管理せよ。
—
結びに代えて:技術的矜持
「Accessは簡易ツールに過ぎない」と蔑む者に、このアーキテクチャを見せてやればいい。適切な設計とDAOの深い理解があれば、Accessは巨大なERPシステムすら凌駕する高速インターフェースに変貌する。
我々が追うべきは、環境に依存する楽なコードではない。ハードウェアの限界を引き出し、メモリの最後の一バイトまで制御下に置くという、アーキテクトとしての矜持だ。
この「Clone & Bookmark」という極めて古典的かつ強力な武器を、諸君の次期プロジェクトの基盤に組み込んでほしい。コードは語る。書いた者の技術レベルと、システムへの愛を。
