(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の環境でも使えそうです。
コメント