こんな怪現象には当たらないと思いますが、
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