質問: New ADODB.Stream ``` 上記のコードの Set New のところで 下記のエラーがでます。 ``` 実行時エラー '-2147024770(8007007e)': オートメーションエラーです。 指定されたモジュールが見つかりません。 ``` 異常な環境の 参照設定は、変化なしで Microsoft AxtiveX Data Objects 6.1 Library "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" このようになっています。 解決方法ご存知の方おられましたら、教えてください。 検索しまくりましたが、解決策はみつかりませんでした。
回答: > > 正常動作するほうは、32bit版Excelをインストールしたことがあり削除してから64bit版Excelをインストールしました。 > > 異常動作するほうは、64bit版Excelしかいれてないです。 > > > エラーの出る環境でExcel 2016 32bit版をインストールしてみましたが状況は変わらずでした。 > > > `msado15.dll`はMDACと呼ばれるコンポーネントの一部です。MDACは元々Officeチームが開発しOfficeに同梱されていたものですが、単独で使われる需要が増えたためWindowsに同梱されるようになりました。この時点では32bitバージョンしか存在していません。Windows Vista以降はWindowsチームが開発を引き継ぎ単体配布されなくなりましたが、64bitバージョンも提供されるようになっています。 このような経緯のため32bit版Excelをインストールしたかどうかは無関係です。 > > Excelを起動し直すとなぜか登録が下記の32bitのものに切り替わります。 > > > 問題のPCで新規ユーザーを作成して切り分け確認をしてみてください。新規ユーザーで再現しなければユーザープロファイルの破損が疑われます。再現すればPC自体の破損です。投稿内容を読む限り前者と推測しますが、確かなことは言えません。 > > 32bit版フォルダの中身を64bit版フォルダの中身で上書きしたところ、無事に動いています。 > > > Program Files下とは言えWindowsに同梱されるファイルですのでこのような行為は推奨できません。よく言う「何もしていないのに壊れた」の一因になります。 ともあれこのような行為を行うのであればユーザープロファイル・PC自体がどのように破損していても不思議ではありません。 > > 海外掲示板などをみていると、これは、MDAC地獄というもののようです。 > > 今回の場合は、海外掲示板で紹介されている"CompChecker"というプログラムを入れても修復不可能でした。 > > > 海外掲示板の投稿者がどこまで把握できていての投稿かは分かりかねますが、少なくとも`CompChecker`はWindows XP/2003までしか対応していないようです。Vista以降や64bit版MDACは考慮できていないわけで、このツールでのチェック結果にあまり意味がありません。 > > Excel VBA は、参照設定するライブラリのパス指定が自動化されているらしく > > > どこまで説明したものか...結局、Windowsを再インストールされてみては? なのですが...。 `msado15.dll`を含むActiveX DLLは実行コードとは別にタイプライブラリと呼ばれる型情報を持っていてLIBIDという識別子で管理されています。`Microsoft AxtiveX Data Objects 6.1 Library`のLIBIDは`{B691E011-1797-432E-907A-4D8C69339129}`でありレジストリの`HKEY_CLASSES_ROOT\TypeLib`下に見つかるはずです。また各クラスもCLSIDで管理されていて`ADODB.Stream`クラスのCLSIDは`{00000566-0000-0010-8000-00aa006d2ea4}`でありレジストリの`HKEY_CLASSES_ROOT\CLSID`下に見つかるはずです。更にインターフェース(...略) ここでExcel VBAのソースコードは`.xlsm`ファイルに保存されるわけで、別PCで開いても正しく動作させるため`C:\Program Files\Common Files\System\ado\msado15.dll`というファイルPathは参考情報にとどめ、前述のLIBIDやCLSIDを優先します。(同じPathに同じDLLが存在する保証はありませんし。) そのため、参照設定をした際に`C:\Program Files\~`を設定したとしても`msado15.dll`に格納されているLIBID `{B691E011-1797-432E-907A-4D8C69339129}`が記録され、再度開く際にはレジストリに設定されているパスから開きます。開きなおすと`C:\Program Files (x86)\~`に更新されるのはレジストリにそう登録されているからと推測します。 `HKEY_CLASSES_ROOT`ハイブのレジストリを参照しているわけですが、この実体は`HKEY_LOCAL_MACHINE\Software\Classes`と`HKEY_CURRENT_USER\Software\Classes`をマージ.aspx)したものでどちらが破損しているかで状況が変わります。更に64bit Windows上の32bitアプリケーションから参照した場合はさらに複雑なルールでマージ.aspx)されます。 正常に動作するPCとこれらのレジストリを比較してみることで破損状況を確認することはできますが、破損個所がここだけに限られるか疑問ですし、Windowsの再インストールをお勧めします。