こんな環境でお困りの方にお役立ていただけるかと思います。(いるかな・・・?)
・現在Win7→Win10切り替え中で、社内でOffice2013と2016が混在している。
・Accessツールがまだ現役で、サーバー上で共有して使用している。
・そのAccessツールで、Excelのobject libraryの参照設定を追加している。
・Office2016ユーザーがそのAccessツールを使用した後に、Office2013ユーザーが使用しようとすると、参照設定が「不可」になっていてVBAが実行できない。
##①Qiita記事を参考に、VBAで参照設定の切り替え→失敗
Access・参照設定・エラー みたいな感じで検索したら、上記の記事がヒットしたので小躍りして同じようにVBAを書いてみました。
結果・・・・撃沈。
記事の環境はAccessを配布していて、、共有して使用しているわけじゃないので、一度設定したものを切り替えるものではない。内容をちゃんと読まずに飛びついたのが原因。
しかも、上位のObject Libraryの参照設定されているaccdbファイルを、下位の環境で開くと、「参照不可」となってVBAからのコントロールが効かないことが判明。
Excel神の記事 マクロで参照設定を操作する
・・・ということはつまり、共有しているaccdbファイルのObject libraryが参照不可にならないように、ファイルを閉じる時に参照設定をRemoveすればよいですね!
##②Form Unloadに参照設定をRemoveするVBAを追加→失敗
VBAで参照設定を設定・解除する(ACCESS)
こちらの記事を参照して、フォームのForm Uload部に参照設定をRemoveするコードを記述したのですが、なんとOffice2013ユーザーがファイルを使用すると、エラーでファイルが閉じられないという事態が発生。(2016ユーザーでは発生せず。原因不明。エラーメッセージ控えるの忘れました。)
##①と②を組み合わせてなんとか実装!
そこで、Removeするコードを、オフィスのバージョンを見て分岐させることにしました。
参照不可になるのは、上位互換ができないからで、2013ユーザーの場合には参照設定をRemoveしなくても問題ないため、2016ユーザーが使用した際にのみ、参照設定のRemoveを実行することにしました。
【Form_Unload】
Private Sub Form_Unload(Cancel As Integer)
Dim Ref As Reference
Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"
If Application.Version = 16# Then
For Each Ref In References
If Ref.Name = "Excel" Then
On Error Resume Next
Application.References.Remove Ref
End If
Next Ref
End If
End Sub
「On Error Resume Next」でエラーをスキップしているのは、次の行で「中断モードでは入力できません 」というエラーが発生して止まってしまうからなのですが、止まってしまうだけでRemoveはされているので、強制的に進ませることにしました。(原因不明)
これで、2016ユーザーがファイルを閉じた場合のみ、Excelの参照設定がRemoveされるので、最初のQiita記事通りに参照設定をするコードを書いてあげればよいだけです。
【Form_load】
Private Sub Form_Load()
Dim Ref As Reference
Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"
On Error Resume Next
If Application.Version = 16# Then
Set Ref = References.AddFromGuid(strExcel, 1, 9)
ElseIf Application.Version = 15# Then
Set Ref = References.AddFromGuid(strExcel, 1, 8)
End If
Set Ref = Nothing
End Sub
こんなことで昨日3時間ほど費やしてしまったので、同じようにお困りの方がいればと思い記事にしてみました。(いないか・・・)
##20191028追記
今朝、Office2013ユーザーが使用したところエラーが発生・・・
どうやら、フォームを閉じてからファイルを閉じればきちんと動作するんだけど、ウィンドウの右上の×ボタンでバスんと閉じると動作しない模様。
ユーザーからは、「設定すればいいんんだからいいよ」と言われたけど、そういわれるとよけいに悔しい・・・・。
で、しつこく検索したら、ビンゴな記事が!
Officeのバージョン混在の環境でExcel, AccessのVBAプログラムを動かす
・・・っていうか、まさにコレじゃん!最初っからコレヒットできてればよかったじゃん!
というわけで、こちらの記事の通り、Form_Unloadには下記を記載して×ボタンから閉じられないようにして、
Private Sub Form_Unload(Cancel As Integer)
Cancel = True
End Sub
フォームにでっかい終了ボタンを作成して、そこのボタンに解除のコードを記述して、Application.Quitで終了させるようにしました。
Dim Ref As Reference
Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"
If Application.Version = 16# Then
For Each Ref In References
If Ref.Name = "Excel" Then
On Error Resume Next
Application.References.Remove Ref
End If
Next Ref
End If
Application.Quit
End Sub
(今、「ボタンでかすぎ!」と笑われました・・・)
尚、Form_Unloadに↑の記述を書くと、フォームをデザインビューなどで開けなくなりました。
(なので、いちいちコードをコメントアウトしてからデザインビューに切り替える必要アリ。)