【Access】Officeのバージョンと参照設定問題

こんな環境でお困りの方にお役立ていただけるかと思います。（いるかな・・・？）

・現在Win7→Win10切り替え中で、社内でOffice2013と2016が混在している。

・Accessツールがまだ現役で、サーバー上で共有して使用している。

・そのAccessツールで、Excelのobject libraryの参照設定を追加している。

・Office2016ユーザーがそのAccessツールを使用した後に、Office2013ユーザーが使用しようとすると、参照設定が「不可」になっていてVBAが実行できない。

##①Qiita記事を参考に、VBAで参照設定の切り替え→失敗

[【Access】GUIDを使用してVBAから参照設定を行う](https://qiita.com/kaolyn/items/3ea9e02fb13f060699ce)

Access・参照設定・エラー　みたいな感じで検索したら、上記の記事がヒットしたので小躍りして同じようにVBAを書いてみました。

結果・・・・撃沈。

記事の環境はAccessを配布していて、、共有して使用しているわけじゃないので、一度設定したものを切り替えるものではない。内容をちゃんと読まずに飛びついたのが原因。

しかも、上位のObject Libraryの参照設定されているaccdbファイルを、下位の環境で開くと、「参照不可」となってVBAからのコントロールが効かないことが判明。

Excel神の記事　[マクロで参照設定を操作する](http://officetanaka.net/excel/vba/tips/tips100.htm)


・・・ということはつまり、共有しているaccdbファイルのObject libraryが参照不可にならないように、ファイルを閉じる時に参照設定をRemoveすればよいですね！

##②Form Unloadに参照設定をRemoveするVBAを追加→失敗
[VBAで参照設定を設定・解除する（ACCESS）](http://www.iltt.info/page/information/contents/20100113.htm)

こちらの記事を参照して、フォームの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プログラムを動かす](https://ameblo.jp/kenchaz/entry-12252928334.html)

・・・っていうか、まさにコレじゃん！最初っからコレヒットできてればよかったじゃん！

というわけで、こちらの記事の通り、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に↑の記述を書くと、フォームをデザインビューなどで開けなくなりました。
（なので、いちいちコードをコメントアウトしてからデザインビューに切り替える必要アリ。）