5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-10-25

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

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

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

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

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

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

【Access】GUIDを使用して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に↑の記述を書くと、フォームをデザインビューなどで開けなくなりました。
(なので、いちいちコードをコメントアウトしてからデザインビューに切り替える必要アリ。)

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?