Excel 64bit VBA で new ADODB.Streamが失敗する

投稿者: Anonymous

環境は、Mac上のParallelsDesktopのWin7 64bit Excel2016の64bit版です。
この環境で、New ADODB.Stream が動きませんでした。

WindowsUpdateの関係か何か他の影響か、VMWareFusion7のWin7 64bit Excel2016の64bit版だと、うまく動いていました。

動かない環境では、次のようなエラーになります。

実行時エラー'-2147024703(800700c1)':
オートメーションエラーです。
%1 は有効な Win32 アプリケーションではありません。

この解消方法がわかりません。

正常動作する環境では、

参照設定
Microsoft AxtiveX Data Objects 6.1 Library
これが、下記のパスで64bit版のmsado15.dllをみています。
“C:Program FilesCommon FilesSystemadomsado15.dll”

失敗する環境では、ここが下記のパスで32bit版のものをみています。
“C:Program Files (x86)Common FilesSystemadomsado15.dll”

これを切り替える方法がわかりません。
VBAエディタの参照設定では64bit版のパスを指定しても、32bit版に切り替わってしまいます。

どのようにすれば直るか、などご存知の方おられましたら教えてください。
そもそも、この状況になった理由も不明です。

正常動作する環境では、32bit版Excelをインストールしたことがあり削除してから64bit版Excelをインストールしました。

異常動作するほうは、64bit版Excelしかいれてないです。

解決方法をご存知のかた、おられましたら、
教えてください。

よろしくお願いします。

※追記
エラーの出る環境で
Excel 2016 32bit版をインストールしてみましたが状況は変わらずでした。

ということで、Excel2016 64bit版、32bit版、区別なしにエラーになってしまう問題ということになります。

詳細は次のようなものです。
エラーの内容が変わりました。

Dim Stream As ADODB.Stream
Set Stream = New ADODB.Stream

上記のコードの Set New のところで
下記のエラーがでます。

実行時エラー '-2147024770(8007007e)':

オートメーションエラーです。
指定されたモジュールが見つかりません。

異常な環境の
参照設定は、変化なしで
Microsoft AxtiveX Data Objects 6.1 Library
“C:Program Files (x86)Common FilesSystemadomsado15.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_ROOTTypeLib下に見つかるはずです。また各クラスもCLSIDで管理されていてADODB.StreamクラスのCLSIDは{00000566-0000-0010-8000-00aa006d2ea4}でありレジストリのHKEY_CLASSES_ROOTCLSID下に見つかるはずです。更にインターフェース(…略)

ここでExcel VBAのソースコードは.xlsmファイルに保存されるわけで、別PCで開いても正しく動作させるためC:Program FilesCommon FilesSystemadomsado15.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_MACHINESoftwareClassesHKEY_CURRENT_USERSoftwareClassesマージしたものでどちらが破損しているかで状況が変わります。更に64bit Windows上の32bitアプリケーションから参照した場合はさらに複雑なルールでマージされます。

正常に動作するPCとこれらのレジストリを比較してみることで破損状況を確認することはできますが、破損個所がここだけに限られるか疑問ですし、Windowsの再インストールをお勧めします。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *