
AccessとSQL Serverを連携させる方法として「リンクテーブル+CurrentDb.Execute」は手軽ですが、大量データ処理ではパフォーマンスが著しく低下するケースもあります。
この記事では、ADO(ActiveX Data Objects)を使って直接SQL Serverに接続し、
SQLを高速で実行する方法を解説します。
■ なぜリンクテーブルでは遅いのか?
リンクテーブルは便利ですが、裏ではAccessがSQL Serverとの間で逐次データのやり取りを行います。
そのため、以下のような処理で極端に遅くなることがあります:
- 数千件以上のINSERT・UPDATE・DELETE
- テーブルの再構築(DELETE+INSERTなど)
- 複雑なJOINを含むクエリ
■ 直接接続のメリット
- SQL ServerにSQLを直接送るため処理速度が段違いに高速
- VBA側で接続やトランザクションを制御可能
- リンクテーブル不要なので構成がシンプル
■ ADOを使った接続関数(再利用可能)
Function GetDBConnection() As ADODB.Connection
On Error GoTo ErrHandler
Dim serverName As String
Dim dbName As String
Dim userID As String
Dim pass As String
' 接続情報を記入
serverName = "サーバー名"
dbName = "データベース名"
userID = "ユーザー名"
pass = "パスワード"
' グローバル変数 g_cnn を接続オブジェクトとして使用
With g_cnn
.Provider = "MSOLEDBSQL"
.Properties("Data Source").Value = serverName
.Properties("Initial Catalog").Value = dbName
.Properties("User ID").Value = userID
.Properties("Password").Value = pass
.CommandTimeout = 0
.ConnectionTimeout = 0
.Open
End With
If Not g_cnn Is Nothing Then
Debug.Print Now & " サーバー接続成功:" & serverName
End If
Set GetDBConnection = g_cnn
Exit Function
ErrHandler:
MsgBox "データベースへの接続に失敗しました。" & vbCrLf & "再度お試しください。", vbExclamation
Set GetDBConnection = Nothing
End Function
▼ 補足
Debug.Print
はイミディエイトウィンドウに出力されます- グローバル変数
g_cnn As ADODB.Connection
を標準モジュールで宣言しておくと便利です
■ 接続解除関数
Sub CloseDBConnection(ByRef g_cnn As ADODB.Connection)
On Error Resume Next
If Not g_cnn Is Nothing Then
If g_cnn.State <> adStateClosed Then
g_cnn.Close
Debug.Print Now & " 接続解除"
End If
Set g_cnn = Nothing
End If
On Error GoTo 0
End Sub
リソースリークを防ぐため、処理後は明示的に接続を解除しましょう。
■ 接続ドライバに関する注意点
ドライバ名 | 備考 |
---|---|
MSOLEDBSQL | 推奨(Microsoftの最新版) |
SQLOLEDB | 古いが一部互換性あり |
SQLNCLI11 等 | SQL Server Native Client |
MSOLEDBSQL
は、Microsoftがサポートしている最新のOLE DBドライバです。
可能な限りこちらを使用することを推奨します。
ドライバがインストールされていない場合、Microsoft公式サイトから入手できます。
■ よくあるエラーと対策
エラー内容 | 原因 | 対処法 |
---|---|---|
接続に失敗 | 認証情報のミス | ユーザー名・パスワードを再確認 |
プロバイダーが見つかりません | MSOLEDBSQL未インストール | ドライバをインストールする |
接続がタイムアウトする | ネットワークやファイアウォール | DBAにポート開放を依頼 |
■ まとめ
Access VBAで大量のデータをSQL Serverに対して処理する場合、
ADO接続を使って直接SQLを実行するのがもっとも効率的です。
コードを関数化しておくことで再利用性が高くなり、他プロジェクトでも活用できます。
■ 関連リンク
■ 関連キーワード例
- Access VBA SQL Server 直接接続
- ADO Access SQL Server 接続方法
- Access VBA ADODB.Connection
- SQL Server 接続 エラー Access
- MSOLEDBSQL Access 接続文字列