こんにちは!Access VBAの開発現場で、日夜データと格闘お疲れ様です。
今回は、Access開発者が必ず直面する「フォームの表示が重い……」という壁を鮮やかにブチ破る、『DAO.QueryDef』と『非連結フォーム』を組み合わせた超高速化テクニックを伝授します。
「マクロの記録や、フォームのレコードソースに直接テーブルを指定する方法は卒業したけれど、データ量が増えると途端に動きがモッサリする……」
そんな悩みを持っているなら、ここをクリアすれば、あなたのAccess VBAスキルは間違いなくプロの領域に到達します。
今回は、難しい理論を優しく噛み砕きながら、現場でそのまま使える最強のコードと共にお届けしますね。
—
なぜ、普通のフォームはデータが増えると重くなるのか?
まずは敵を知ることから始めましょう。
通常、Accessのフォームを作る際、プロパティの「レコードソース」に重たいテーブルやクエリを直接指定しますよね。
これは、Access(正確にはデータベースエンジンであるJET/ACE)に「フォームが開いた瞬間から、全データの管理と描画を丸投げする」という状態です。数万件のレコードがあれば、Accessはメモリを大量に消費し、ネットワーク(共有サーバー上の.accdbファイル)を行ったり来たりしてフリーズ寸前になります。
救世主:非連結フォーム + QueryDef = 最速の美学
そこで登場するのが今回の主役、「非連結フォーム(データソースを持たないフォーム)」と「DAO.QueryDef(あらかじめコンパイルされた高速なクエリ定義)」のタッグです。
このアプローチの思想はこうです。
1. 重たいデータ処理は、データベースの頭脳であるQueryDefにすべて任せる。
2. 抽出された「必要な分だけのデータ」を、VBAのメモリ空間(配列やループ)にサクッと取り込む。
3. 料理された綺麗なデータだけを、非連結のフォームのコントロールに流し込む。
この仕組みをモノにすれば、どれだけ巨大なデータベースが相手でも、体感速度は驚異的な「一瞬」に変わります。
—
現場で使える!高速データバインド実装コード
それでは、百聞は一見にしかず。実際に非連結フォームへ高速にデータを流し込むVBAコードを見てみましょう。
前提として、フォームには `txtSearch`(検索値入力用テキストボックス)、`cmdSearch`(検索ボタン)、そしてリストビューや非連結のテキストボックス群があると想定してください。今回はシンプルに、検索結果をイミディエイトウインドウへの出力と、フォームへの高速流し込みを行う基本形を示します。
Option Compare Database
Option Explicit
‘ =====================================================================
‘ @Title: QueryDefを活用した非連結フォームの高速データバインド
‘ @Author: チーフアーキテクト
‘ =====================================================================
Private Sub cmdSearch_Click()
On Error GoTo ErrorHandler
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim prm As DAO.Parameter
Dim rs As DAO.Recordset
‘ 1. データベースオブジェクトの取得(現在の接続)
Set db = CurrentDb
‘ —————————————————————–
‘ 2. あらかじめ作成しておいたQueryDefの名前を指定して取得
‘ ※あらかじめデザインビューで「qryFastSearch」という名前の
‘ パラメータクエリを作っておくのがプロの技です。
‘ —————————————————————–
Set qdf = db.QueryDefs(“qryFastSearch”)
‘ 3. フォームから入力された検索条件をパラメータに安全にバインド
‘ (SQLインジェクション対策としても非常に重要です)
qdf.Parameters(“[Forms