ACCESS実行環境の微妙な違いでハマったこと

32bitのmdb形式Accessアプリを最新の64bit accde形式にアップグレードして、配布しようとしたのですが、致命的と思えるエラーに遭遇して断念。 段階を踏んで、まずは32bitのaccdeにすることにしたものの、それでも、様々なエラーに見舞われ、かつ、なかなか解決策にたどり着けなかったので、同様のエラーに遭遇した際の参考までに、今回の経験を書いておくことにしました。 特に、なかなか解決の糸口を掴めなかったは、以下のエラーです。
(1)「VBAプロジェクトを読み込めない」というエラー (2)WMIでのRegistry書き込み失敗 (3)Access起動時のセキュリティ警告回避 (4)runmacroアクションの実行の取り消し

(1)「VBAプロジェクトを読み込めない」というエラー

以下のような、エラーメッセージです。  結論を先に書くと、解決の糸口となるキーワードは、NLS、バージョン6.2、バージョン6.3 などでした。これらで、検索すると、Microsoftの情報にたどり着けるのではないでしょうか。 私の場合、下記の情報をもとに解決できました。 Windows 10 バージョン 2004 (20H1) / 20H2 上で 半角カナのフォームを含んだ Access ファイルでエラーが発生する (microsoft.com) 要するに、32bitと64bitの違いによるエラーとかではなく、Windows10のUpdateバージョンの違いによるものだったわけです。 mdbファイルをaccdeにするのは、名前を指定して保存で、まずaccdbにしておいて、次にaccdeにするだけです。 VBAコードも ConnectionStringを修正するくらいで、動作することを自前の環境では確認していました。 ところが、ユーザ環境では、前述のエラーにより、VABを読み込めず、VBAなしのフォームだけになってしまいます。 64bitと32bitの違いのせいでないなら、Runtime環境のためと思い、正規版のAccessを入れてみても変わらず、途方にくれました。 いろいろ情報を探り、ようやくたどり着いたのが、先のmicrosoftのサイトでした。 客先環境が、Windows10 20H2。一方、こちらにあるのは、Windows10 1909と20H2で、32bitのAccess2019を置いているのが「1909」、64bitのAccess2019の方が「20H2」環境でした。 Microsoftの解説に従って、Registryの設定を変えたところ、エラーを解消できることが分かりました。 フォームの名称を全部見直すなどということにならず安堵した次第。  

(2)WMIでのRegistry書き込みに失敗

これも結論を先に書くと、Registryの書き込みには、管理者権限で実行する必要があったということです。 ユーザ環境で、上記(1)のためのRegistryを設定する機能を、こちらを参考にしたVBAコードで用意しました。  
'registry操作  HKEY_LOCAL_MACHINE = &H80000002 srrPath = "SYSTEM\CurrentControlSet\Control\Nls\Sorting\Versions" sKey="" '文字列値の取得 Reg.GetStringValue &HKEY_LOCAL_MACHINE, str_path, str_key, sRet '文字列値"0006020F"の書き込み lRet = oClass.SetStringValue(&HKEY_LOCAL_MACHINE, strPath, sKey, "0006020F")
  ところが、Regstryの読み込みはできるのに、書き込みには失敗してしまします。  sKeyの設定にミスがあるのかなど、さんざん悩んだ末、たどり着いたのは、管理者権限で実行する必要があるという情報。 まず、管理者でAccessを立ち上げたのち、作成したAccessファイルを開くという手順を踏めば、書き込できることが判明しました。 ユーザに手作業でRegistryの書き換えをしてもらうような事態は、何とか回避できたのでした。

(3)Access起動時のセキュリティ警告回避

正規版のAccessがあるなら、トラストセンターを設定すれば良いのですが、Runtime環境なら、トラストセンターの設定に相当するRegistryの設定が必要です。 Registry設定については、信頼する場所に関する設定情報は見つかったのですが、マクロの設定の方を見過ごしていて、いささか手こずりました。 これらに関するRegistryの設定は以下の通りです。
  • (1)信頼できる場所
    •   1)設定箇所:\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security\Trusted Locations
    •   2)キー:「Location+番号」というキーを追加
    •   3)設定値:文字列値で、実行ファイルのあるパスを指定
  • (2)マクロの設定
    •   1)設定箇所:\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security
    •   2)キー:VBAWarnnings
    •   3)設定値:REG_DWORD型で、「1」(※全てのマクロを有効にする)
 

(4)マクロ実行の取り消し

表示されたのは、下記のエラーメッセージです。
エラーメッセージ:「runmacro アクションの実行は取り消されました」
  こちらは、正解かどうかはわかりませんが、タイミングの見直しということで、エラーは回避できるようになりました。 指定のスケジュールで起動するAccessアプリ(A)がAccessアプリ(B)を起動し、自動処理を行ったのち、ともに終了するという、正規版Access環境では機能した仕組みが、Runtime環境では前述のエラーとか、2046エラーなどになったのでした。 タイミングの見直しとは、(A)に起動された(B)がマクロを含む処理を終えたのち、自らをQuitしていたのを変えて、(B)の一連の処理とQuitを(A)側で操作し、その後、(A)自身をQuitするようにしたことで、前述のエラーを吐くことも、プロセスが残るようなこともなくなったのです。 むろん、Rutime環境ではCreateObjectが使えないので、GetObjectにするという変更も行っています。 詳しいことは分かってませんが結果オーライというところです。  

おまけ(AccessRuntimeがあればExcel出力もできた)

ハマったことではないのですが、怪我の功名で、EXCELファイルの出力が、EXCELなしでも、実行できることが分かりました。 つまり、Officeがなくても、無償のAccessRuntimeがあれば、以下が可能でした。
DoCmd.OutputTo acOutputQuery, str_File, "ExcelWorkbook(*.xlsx)"
  例えばLibreOfficeやKingSoftの環境でも使えそうです。  

まとめ

MicroSoftから提供される環境が一見同じような為、ユーザ環境が多様になっていることに気づかず、同じアプリケーションが機能したり、しなかったりといったトラブルに遭遇しました。 一方で、無料のRutimeで済むのが分かったこともあります。 解決のための情報、そこにたどり着くための手掛かりとなる情報が、より容易に見つかるようになればと思い、経験を記載してみました。 参考になれば幸いです。

コメント

タイトルとURLをコピーしました