Accessシステムの運用期間が長くなると、利用者から「以前より画面表示が遅い」「ボタンを押してから反応するまで時間がかかる」という相談を受けることがあります。
結論から言うと、設定テーブルの値を毎回DLookupで取得するのではなく、VBA側でキャッシュする仕組みを作ることで処理速度を大幅に改善できます。
最近の当サイトではJSON連携、重複データ対策、設定テーブル活用、監査ログなど実務的なテーマを多数紹介しています。そこで今回は少し視点を変えて、多くのAccessシステムで見落とされがちな「設定値キャッシュ機能」の実装方法を紹介します。
キャッシュとは
キャッシュとは、一度取得したデータをメモリ上に保持し、再利用する仕組みです。
例えば設定テーブルがあるとします。
| 設定名 | 設定値 |
|---|---|
| 保存先 | C:\DATA |
| 管理者メール | test@example.com |
| 税率 | 10 |
通常は必要になるたびに取得します。
DLookup("設定値", _
"T_SETTING", _
"設定名='保存先'")
しかし何百回も実行すると速度低下の原因になります。
なぜキャッシュが必要なのか
次のような処理では特に差が出ます。
- CSV取込
- Excel出力
- PDF作成
- バッチ処理
- フォーム表示
例えば1000件処理の中で毎回DLookupを実行すると、
1000回検索
↓
テーブルアクセス
↓
速度低下
になります。
一度取得して保持するだけで大きく改善できます。
設定値キャッシュの考え方
流れは非常にシンプルです。
起動時
↓
設定テーブル読込
↓
メモリ保存
↓
利用時はメモリ参照
これが基本構成です。
逆引き① Dictionaryを利用したい
もっともおすすめの方法です。
Public gDic As Object
Set gDic = _
CreateObject("Scripting.Dictionary")
キャッシュ領域になります。
逆引き② 設定値を読込みたい
起動時に一括取得します。
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset( _
"T_SETTING")
Do Until rs.EOF
gDic.Add _
rs!設定名, _
rs!設定値
rs.MoveNext
Loop
一度だけ読込みます。
逆引き③ キャッシュから取得したい
利用時は高速です。
strFolder = _
gDic("保存先")
DLookupは不要になります。
逆引き④ 存在チェックをしたい
安全に取得します。
If gDic.Exists("保存先") Then
strFolder = _
gDic("保存先")
End If
エラー防止になります。
逆引き⑤ 共通関数化したい
実務ではおすすめです。
Public Function GetSetting( _
ByVal KeyName As String) _
As String
If gDic.Exists(KeyName) Then
GetSetting = _
gDic(KeyName)
End If
End Function
利用側は簡潔になります。
MsgBox _
GetSetting("保存先")
実践例① CSV取込システム
よくあるケースです。
設定テーブル
↓
CSV保存先取得
↓
自動取込
毎回DLookupを実行しなくて済みます。
実践例② PDF出力
帳票作成時に便利です。
strPDFPath = _
GetSetting("PDF保存先")
保守性も向上します。
実践例③ メール自動送信
通知先の管理です。
strMail = _
GetSetting("管理者メール")
設定変更にも柔軟に対応できます。
実践例④ 夜間バッチ処理
タスクスケジューラとの組み合わせでも有効です。タスクスケジューラによる自動運用の記事でも、自動処理やログ管理の重要性が紹介されています。 [latest-inf…system.com]
Access起動
↓
設定読込
↓
CSV取込
↓
集計処理
↓
PDF出力
大量処理ほど効果が出ます。
キャッシュ更新の考え方
設定変更が発生した場合です。
Call LoadSetting
を再実行します。
設定変更
↓
再読込
↓
最新状態反映
を実現できます。
ログ管理と組み合わせる
運用時にはログ管理もおすすめです。
読込日時
件数
結果
実行者
を保存します。
監査や障害調査に活用できます。
Copilot活用術① キャッシュ機能作成
Copilotへ次のように依頼します。
Access VBAで
設定テーブルを
Dictionaryへ格納する
共通関数を作成してください
エラー処理付きでお願いします
基本コードをすぐに生成できます。
Copilot活用術② レビュー実施
既存コードを貼り付けます。
パフォーマンス改善案を
教えてください
すると、
- DLookup削減
- レコードセット改善
- 関数化
- 共通化
などを提案してくれます。
Copilot活用術③ システム全体診断
以下のような依頼も有効です。
Access VBAです
処理速度改善ポイントを
一覧化してください
改善候補を網羅的に確認できます。
パフォーマンス改善で重要なポイント
DLookupの乱用を避ける
便利ですが多用すると遅くなります。
設定値は起動時取得
都度検索しない設計が重要です。
共通関数化する
保守しやすくなります。
ログ取得を行う
速度改善前後を比較できます。
定期レビューする
Copilotで定期的に改善案を確認します。
AI時代でも重要な設計思想
近年はCopilotの活用によってコード生成が容易になっています。当サイトでも動的SQL作成や重複データ対策など、Copilotを活用した開発効率化を多数紹介しています。 [latest-inf…system.com], [latest-inf…system.com]
しかし本当に重要なのは、
- 無駄な処理を減らす
- 保守しやすくする
- 再利用可能にする
という設計です。
キャッシュ機能は派手ではありませんが、システム運用の安定化と高速化に大きく貢献します。
まとめ
Accessシステムでは設定テーブルを利用するケースが非常に多くあります。
しかし毎回DLookupで取得すると、
- 表示速度低下
- バッチ処理遅延
- サーバー負荷増加
につながります。
設定値キャッシュ機能を導入することで、
- 高速化
- 保守性向上
- 共通化
- 障害削減
を実現できます。
さらにCopilotを活用することで、
- キャッシュ機能作成
- コードレビュー
- 性能改善分析
- 共通化設計
まで効率的に進められます。
長期運用を前提とするAccessシステムでは、ぜひ標準機能として導入を検討してみてください。


コメント