Accessで開発したツールを配布したら相手と自分のオフィスのバージョンが異なり、
起動時に参照設定のエラーが出ちゃうっていう
Access開発でまれによくあるやつの対処。
使用者のPCごとに毎回手動で参照設定を変えるのは面倒なので
VBAでバージョン判定して参照設定を。
参照設定をVBAから行う方法は2つ。
- ライブラリのフルパスを指定(AddFromFile)
- GUIDを指定(AddFromGuid)
フルパスを指定する方法は複数人に配布するには不向きなので、
今回はGUIDを指定して設定する方法。
GUIDを調べる
必要な情報はGUIDとそのバージョン(メジャー&マイナー)。
ついでにオフィスのバージョンも確認。
Sub survey_guid()
Dim Ref As Reference
Debug.Print "VERSION:" & Application.Version
For Each Ref In References
Debug.Print "NAME:" & Ref.Name & " GUID:" & Ref.Guid & " MAJOR:" & Ref.Major & " MINOR:" & Ref.Minor
Next
Set Ref = Nothing
End Sub
実際の参照設定と見比べるとこんな感じ。
参照設定のウィンドウと同じ順番で出力されている。
(英語OSに日本語Officeをインストールしている関係で一部文字化けしています。)
今回VBAで参照設定したいのはADO Ext.XX とExcel object Library。
2つの画面から各ライブラリのGUIDとそのメジャーバージョン・マイナーバージョンが特定できる。
ADO
NAME:ADOX GUID:{00000600-0000-0010-8000-00AA006D2EA4} MAJOR:6 MINOR:0
Excel object Library
NAME:Excel GUID:{00020813-0000-0000-C000-000000000046} MAJOR:1 MINOR:7
画面と結果はOffice2010。
使用される可能性のあるOfficeのバージョンでそれぞれ同様の調査をする。
参照設定
上記で取得したGUIDとバージョンを使用して参照設定。
今回はAccess起動時に開くフォームのForm_Loadイベントに記載し、
office2010と2007の利用者がいる場合を想定。
Private Sub Form_Load()
Dim Ref As Reference
Const strADO As String = "{00000600-0000-0010-8000-00AA006D2EA4}"
Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"
On Error Resume Next
If Application.Version = 14# Then
Set Ref = References.AddFromGuid(strADO, 6, 0)
Set Ref = References.AddFromGuid(strExcel, 1, 7)
ElseIf Application.Version = 12# Then
Set Ref = References.AddFromGuid(strADO, 2, 8)
Set Ref = References.AddFromGuid(strExcel, 1, 6)
End If
Set Ref = Nothing
End Sub
オフィスのバージョンを取得しバージョンごとに条件分岐、
References.AddFromGuid("GUID", メジャーバージョン, マイナーバージョン)
これで各ライブラリの参照設定をする。
エラー処理は手抜き。
すでに参照設定されている場合にはエラーNo.32813が返ってくるので、必要に合わせてエラー処理を。
(参照設定は保存されるので、エラー32813に対して何らかのエラー処理
をしておかないと、2回目以降に起動した際エラーが発生する。)
(上記同様の理由で配布時には一度参照設定を外してから配布することを忘れずに。)
※もっとスマートな方法ご存知の方いれば教えてください。