カテゴリ

VBA/ASPなど

Access2010 以降、DAOの標準ライブラリが "Microsoft Office 14.0 Access database engine Object Library" となりました。

これにより、Access2010 で作成したDAOを利用したAccessVBAアプリケーションが、2010より古いバージョンで動かなくなることがあります。
"Microsoft Office 14.0 Access database engine Object Library" の代わりに "Microsoft DAO 3.6 Object Library" を参照設定で指定すれば旧バージョンでの動作は可能ですが、今度はAccess2010 64bit 版で動かなくなります。

※"Microsoft DAO 3.6 Object Library" が64bitで動かないため。

いろいろ悩んで、ひとまず、条件付きコンパイルを利用して起動時に動的に参照設定を行うことで解消してみました。
同じファイルを複数の環境で実行した場合を考え、実際には起動時に

  • 一度 DAO に対する参照設定を外す
  • 改めて、環境に合わせて参照設定をする

ように考えてみました。

Access2010 からは条件付きコンパイルに利用できる定数として、

  • VBA7 :VBAのバージョンがVBA7ならTrue
  • Win64 :実行環境が64bitならTrue(実際にはOSではなくOfficeのbitの模様)

が導入されているので、それを利用します。
ただ、勉強不足で従来のDAOが動く環境を厳密には特定できていないため、

  • VBA7かつ64bit環境なら"Microsoft Office 14.0 Access database engine Object Library"
  • それ以外なら従来のDAO3.6を参照設定してみて、エラーなら "Microsoft Office 14.0 Access database engine Object Library"を参照

としました。

Option Compare Database
Option Explicit

' 起動時にこれを実行(起動時に開くフォームの Load イベントなどから実行する)
Sub chk_dao_ref()
    ' 参照設定を外す
    remove_dao

' 条件付きコンパイル
#If VBA7 And Win64 Then    ' VBA7 and 64bit の場合
    set_acedao
#Else
    set_dao36
#End If
    
End Sub


' ひとまず既にあるDAOの参照設定を解除
Private Sub remove_dao()
    On Error Resume Next
    References.Remove References.Item("DAO")
    On Error GoTo 0
End Sub


' ACEDAO(2010 64bit 用DAO) の参照設定
Private Sub set_acedao()
    Dim Ref As Reference
    
    Set Ref = References.AddFromGuid("{4AC9E1DA-5BAD-4AC7-86E3-24F4CDCECA28}", 12, 0)
    Set Ref = Nothing
End Sub

' DAO3.6(従来のDAO) の参照設定
Private Sub set_dao36()
    Dim Ref As Reference
    
    On Error Resume Next
        Set Ref = References.AddFromGuid("{00025E01-0000-0000-C000-000000000046}", 5, 0)
        Set Ref = Nothing

        If Len(Err.Description) > 0 Then set_acedao
    On Error GoTo 0
End Sub

コメント