概要
Access以外でAccessを参照設定してNz関数を使うと不可視のAccessインスタンスができる、場合によっては正しく終了せずに見えないまま残る。
Nz関数とは
公式のリファレンスでは普通の使い方の話だけ。
ここには書かれていないがNz関数はAccessの中に含まれる関数なので実行にはAccessのインスタンスが必要らしい。
?Nz(Null, "ぬるぽ") 'ぬるぽと表示される
その関係でAccessを参照設定したExcelからイミディエイトで上記を実行してすぐに、cmd.exeでtasklistを行うとACCESS.EXEが起動している。
実行してしばらくすると消えているので基本的には実行後に終了するようになっているはずなのだが、何かのミスでAccessのインスタンスが残ることがある。
対処法
この見えないAccessがあるときにaccdbファイルなどAccessのファイルを開くとその見えないインスタンスで開かれてしまって正常に開かれているにも関わらず見えないという状態が発生する。
こうなってしまった場合はcmdから「taskkill /f /im access.exe」で強制終了させるというのが一つ。
GetObject(, "Access.Application").Visible = True
またはイミディエイトでGetObjectを使ってAccessを捕まえて見えるようにすることでも対応できる。
代替手段
Public Function Nz(ByVal Value_ As Variant, Optional IfNull_ As Variant) As Variant
If IsNull(Value_) Then
Nz = IfNull_
Else
Nz = Value_
End If
End Function
Access.Nzが呼び出されないように自作の関数で上書きしてしまう。
かなり雑な作りだがだいたいこれでなんとかなる。
余談
逆もまた然りで、AccessからExcelを参照設定してWorksheetFunctionのメソッドを使った場合も同じように不可視のExcelインスタンスが立ち上がるかもしれない(未調査)。