こんにちは! Access VBAでの開発、日々の業務お疲れ様です。
マクロの記録から一歩踏み出し、「自分でプログラムを書いてシステムを動かしたい!」という熱意、本当に素晴らしいですね。
今回は、Access VBAの中級者へのステップアップとして、避けて通れない「ADO(ActiveX Data Objects)」、そしてそのパフォーマンスを極限まで引き出す「接続プーリングを意識したコネクションの再利用戦略」についてお話しします。
「何それ、難しそう…」と思いましたか?
大丈夫です。ここをクリアすれば、あなたの書くプログラムは見違えるほどキビキビ動き、「おっ、できるな!」と周りを唸らせるレベルに到達できます。一緒に優しく紐解いていきましょう!
—
1. なぜ毎回 `Open` と `Close` を繰り返してはいけないのか?
VBAでデータベースを操作するとき、こんなコードを書いていませんか?
Sub ダメな例()
Dim i As Long
For i = 1 to 100
Dim conn As Object
Set conn = CreateObject(“ADODB.Connection”)
conn.Open “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Data\Sample.accdb;”
‘ ここで何かしらの処理をする
conn.Close
Set conn = Nothing
Next i
End Sub
一見、ちゃんと閉じていて綺麗に見えますよね。しかし、プログラミングの世界では、「データベースに接続する(Open)」という動作は、想像を絶するほど重い(コストが高い)処理なのです。
家に入るときに、毎回「玄関の鍵を開け、セキュリティを解除し、電気を通し…」とやっていたら、部屋に入るだけでヘトヘトになりますよね。データベース接続もこれと同じです。100回ループさせれば、データベースとの間で100回も重たい「握手」を交わすことになり、プログラムが猛烈に遅くなります。
解決の鍵:コネクションの「使い回し(再利用)」
これを解決するのが、「アプリケーション全体で1つのコネクションを維持し、必要な時に使い回す」という戦略です。
—
2. ADOコネクションのライフサイクルを設計する
アクセスの世界では、標準モジュールにグローバル変数(あるいはモジュールレベル変数)として `ADODB.Connection` を1つだけ保持させ、プログラムの起動時に開き、終了時に閉じるというライフサイクル設計が王道です。
さらに、ADOが持っている「接続プーリング(Connection Pooling)」という仕組みを味方につけます。接続プーリングとは、OSやプロバイダが「さっき使った接続、取っておいてあげるから、すぐまた使うならそのまま貸すよ!」と裏でこっそり使い回してくれる神機能です。
それでは、実際に現場で使える「コネクション管理モジュール」のコードを見てみましょう。
—
3. 実装:安全かつ高速なコネクション管理モジュール
VBAの標準モジュールを1つ追加し、以下のように記述してください。ここをクリアすれば、データベース処理の基本はバッチリです!
‘ Option Explicit は必ず書きましょう(変数の宣言漏れを防ぐため)
Option Explicit
‘ アプリケーション全体で共有するコネクション変数
Private g_Con As ADODB.Connection
”
‘ データベース接続を取得する関数(シングルトンパターン風)
‘ 呼び出すたびにOpenするのではなく、すでに開いていればそれを返します。
”
Public Function GetConnection() As ADODB.Connection
‘ コネクションが未作成、または閉じていたら新しく作る
If g_Con Is Nothing Then
Set g_Con = New ADODB.Connection
‘ 接続文字列を設定(パスはご自身の環境に合わせて変更してください)
g_Con.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & CurrentProject.Path & “\Sample.accdb;”
g_Con.Open
Else
‘ 萬が一、何らかの理由で閉じられてしまっていた場合の保険
If g_Con.State = adStateClosed Then
g_Con.Open
End If
End If
‘ 呼び出し元にコネクションを引き渡す
Set GetConnection = g_Con
End Function
”
‘ アプリケーション終了時に必ず呼び出すクリーンアップ処理
”
Public Sub CloseConnection()
On Error Resume Next
If Not g_Con Is Nothing Then
If g_Con.State = adStateOpen Then
g_Con.Close
End If
Set g_Con = Nothing
End If
On Error GoTo 0
End Sub
このコードのポイント
1. `GetConnection` 関数: 何回この関数を呼んでも、最初に開いたコネクションを使い回します。毎回 `Open` しないため、爆速で動作します。
2. `CurrentProject.Path`: データベースと同じフォルダにあるファイルを指すため、PCが変わってもパス迷子になりません。現場で重宝するテクニックです。
3. `CloseConnection` サブ: アプリケーションを終了するとき(またはメイン画面を閉じるとき)に1回だけ呼び出し、綺麗にメモリを解放します。
—
4. 現場でありがちな「エラー」と対策
コネクションを使い回すようになると、初心者の方が必ずと言っていいほど直面するトラップがあります。
トラップ:「接続はすでに開いています」エラー
複数人での同時操作や、エラー処理の途中でコネクションの状態がおかしくなったときに出るエラーです。
【対策】
先ほどのコードのように、`g_Con.State = adStateClosed` かどうかを判定するガード節を必ず挟むようにしましょう。ADOの `State` プロパティを確認する癖をつけるだけで、エラーの9割は防げます。
—
まとめ
いかがでしょうか?
- 毎回Open/Closeするのは、重たい玄関のドアを何回も開け閉めするようなもの。
- コネクションはモジュールレベルで保持し、必要な場所で「使い回す」。
- 接続プーリングの恩恵を受けられるように、綺麗なライフサイクルを設計する。
この「接続の再利用戦略」を取り入れるだけで、あなたのAccessアプリはプロ顔負のパフォーマンスを発揮するようになります。
基礎からしっかりとアーキテクチャを意識したコードを書けるようになると、VBAを書くのが何倍も楽しくなりますよ。ぜひ、明日からの開発に取り入れてみてくださいね!
