LoginSignup
1

More than 3 years have passed since last update.

[VBA] Access2007 64Bit Later Microsoft Office XX.0 Access Database Engine Object Libraryを参照設定せずに使う

Posted at

こんな怪現象には当たらないと思いますが、

32 Bit版はDBEngine.Dao.120を使う
https://qiita.com/Q11Q/items/418670921221c7ddc5fc

32ビット版は解決しました。

解決方法の本質と長所

遅延バインディング

この参照設定できない、という問題から入ると解決方法が見えづらいのですが、遅延バインディングを使う、という方法をとると解決来ます。
もう一つこの方法の特徴があります。

バージョンを超えられる

それはスピードは犠牲にするが、参照設定を回避することでアクセスのバージョン違いを乗り越えられるということです。

64Bit版の解決方法

64Bit版でトラブルがあった時はADODBをバインディングする

これが答えです。
もっともこれは32Bit版でも言えます。

Sub ADODBEngin()
' ADODB.CommandTypeEnum
Const adCmdTable = 2, adCmdText = 1, adCmdUnknown = 8
'ADODB.DataTypeEnum
Const adDate = 7, adArray = 8192, adBigInt = 20, adCurrency = 6, adBoolean = 11, adEmpty = 0, adChar = 129, adWChar = 130
'ADODB.LockTypeEnum のメンバー
Const adLockReadOnly = 1, adLockPessimistic = 2, adLockOptimistic = 3, adLockBatchOptimistic = 4
' ADODB.CursorTypeEnum のメンバー
Const adOpenDynamic = 2, adOpenForwardOnly = 0, adOpenKeyset = 1, adOpenStatic = 3
'CursorLocationEnum
Const adUseClient = 3, adUseServer = 2
'ADODB.CommandTypeEnum のメンバー
Const adCmdFile = 256, adCmdTable = 2, adCmdText = 1, adCmdTableDirect = 512, adCmdUnknown = 8
'Dim FSO As New FileSystemObject
Dim FSO : Set FSO  = CreateObject("Scripting.FileSystemObject")
Dim aCN As Object: Set aCN = CreateObject("ADODB.Connection")
Dim aCM As Object: Set aCM = CreateObject("ADODB.Command") 'Microsoft ActiveX Data Objects 2.8 Library
Dim aRS As Object: Set aRS = CreateObject("ADODB.Recordset")
Dim aSr As Object: Set aSr = CreateObject("ADODB.Stream")
Dim aParam As Object: Set aParam = CreateObject("ADODB.Parameter")
Dim buf As String, sSQL As String, sPath As String
Dim Fld, Flds, tdf, tdfs, Qs, Q, i As Long
Dim cDB
Set cDB = Access.Application.CurrentDb
sPath = Application.CurrentProject.path & "\"
Set aCN = CurrentProject.Connection
Set tdfs = cDB.TableDefs
sPath = CurrentProject.Path
Set Qs = cDB.QueryDefs
Set aCN = CurrentProject.AccessConnection
sPath = CurrentProject.Path & "\"

Stop

Set aCN = Nothing
Set aCM = Nothing
Set aSr = Nothing
Set aRS = Nothing
End Sub

Adodbならではのポイント

CurrentDB

Dim cDB as Dao.Database : Set cDB = CurrentDb

という定番フレーズは使えません。

Dim cDB : Set cDB = Access.Application.CurrentDb

このように型指定せずにApplicationからつなぎます。
これによってテーブルなどに行きます。

CurrentDbのパス

Dim sPath As String : sPath = Access.Application.CurrentProject.path & "\"

これは変わらないのですが、ここで末尾にスラッシュを追加した方があとから楽になることが多いです。

ADODBの接続

ADODBはなんでも接続が必要で、どうも自分自身に接続しないとだめらしいです。
そこの方法が独特です。

AccessConnection

[超重要]CurrentDBにつなぐには.CurrentProject.AccessConnectionを使う場合がある

通常はCurrentProject.Connection

カレントデータベースに接続する方法 : ADO入門講座
Access2000以降のバージョンでは、Accessが開かれるたびに自動的にADOのConnectionオブジェクトが生成され、Accessデータベース (.mdb) でADOオブジェクトライブラリへの隠された参照を設定します。
CurrentProject プロパティ (Access)
connectionプロパティを使用すると、現在の ActiveX データオブジェクト (ADO) connectionオブジェクトとそれに関連するプロパティへの参照を取得できます。 読み取り専用接続です。
注釈
Connection プロパティを使用すると、現在の Access プロジェクト (.adp) または Access データベース オブジェクトの Connection オブジェクトを参照することができます。 Connection プロパティを使用することで、 BeginTrans や CommitTrans のような Connection オブジェクトに対してメソッドを呼び出すことができます。

https://docs.microsoft.com/ja-jp/office/vba/api/access.currentproject.accessconnection
access フォームにバインドされる ADO レコードセットを作成する場合は、 accessconnectionプロパティを使用する必要があります。 ADO 内でレコードセットを更新できる場合でも、フォームが OLE DB Provider for Microsoft Access を使用して作成されていなければ、そのフォームを更新することができません。

ADODBコマンドはActiveConnectionを設定しないと動かない

ここも重要です。このActiveConnectionに CurrentProject.Connection または CurrentProject.AccessConnection をつなぐと、SQL等を実行できるようになります。
aCM.ActiveConnection = aCN

Set aCN = access.Application.CurrentProject.Connection
aCM.ActiveConnection = aCN
aCM.CommandType = 1 'adCmdText

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1