36044


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

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

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

[code]

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

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

正常動作する環境では、

参照設定  
Microsoft AxtiveX Data Objects 6.1 Library  
これが、下記のパスで64bit版のmsado15.dllをみています。  
"C:\Program Files\Common Files\System\ado\msado15.dll"

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

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

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

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

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

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

よろしくお願いします。

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

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

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

[code]

    Dim Stream As ADODB.Stream
    Set Stream = New ADODB.Stream
    
[/code]

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

[code]

    実行時エラー '-2147024770(8007007e)':
    
    オートメーションエラーです。
    指定されたモジュールが見つかりません。
    
[/code]

異常な環境の  
参照設定は、変化なしで  
Microsoft AxtiveX Data Objects 6.1 Library  
"C:\Program Files (x86)\Common Files\System\ado\msado15.dll"

このようになっています。

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

検索しまくりましたが、解決策はみつかりませんでした。


CC BY-SA 3.0
2017-07-01T16:43:05.707
36021
2017-07-03T09:30:12.120
2017-07-03T04:39:53.663
21047
21047
question
excel vba
Excel 64bit VBA で new ADODB.Streamが失敗する


32bit版の配置されているところに、64bit版を上書きするという方法で、  
なんとか動かすことはできましたが、他の部分で不具合が起きたので、お知らせします。

不具合を起こす方のPCでも、  
たまにOS(Win7 64bit)再起動後に1回だけ  
Excel 2016 64bit版で動かすことができるときがあり  
Excelを起動し直すと誤動作している様子があり

それは参照設定が

[code]

    Microsoft AxtiveX Data Objects 6.1 Library
    "C:\Program Files\Common Files\System\ado\msado15.dll"
    
[/code]

このように正しいときでした。

直ったか！と思って、Excelを起動し直すとなぜか登録が下記の32bitのものに切り替わります。

[code]

    Microsoft AxtiveX Data Objects 6.1 Library
    "C:\Program Files (x86)\Common Files\System\ado\msado15.dll"
    
[/code]

Excelの参照設定は  
レジストリの、HKEY_CLASSES_ROOT\TypeLib、以下にあるようでしたが、  
例えば、  
HKEY_CLASSES_ROOT\TypeLib{22813728-8BD3-11D0-B4EF-00A0C9138CA4}\6.0\0\win32  
ここには、  
%CommonProgramFiles%\System\ado\msadomd.dll  
このように書かれていましたが、ここに、win64と記載して直るのかどうかは検証しませんでした。

**解決策**

32bit版フォルダの中身を64bit版フォルダの中身で上書きしたところ、VBA側は動きました。  
ただし、VBScriptの同様のコードが実行できなくなります。コメントでもいただきましたが、他のソフトウェアが動かなくなる可能性も大いにあるので、お勧めしません。

いちおう、手順を書いておきます。  
通常は、フォルダ置き換えなどできないので、takeownコマンドで所有権を得る必要がありました。

32bit版フォルダ:`C:\Program Files (x86)\Common Files\System\ado\`  
64bit版フォルダ:`C:\Program Files\Common Files\System\ado\`

Excel 2016
64bit版が32bit版フォルダを参照しても、実際には64bit版のdllを参照する、ということができました。(もちろん32bit版フォルダの中身はバックアップを取っておきました)

エラー番号で検索してヒットした海外掲示板の情報もみたのですが、MDAC地獄と呼ばれていました。今回の場合は、そういうところで紹介されていた"CompChecker"というプログラムを入れても修復不可能でした。

※追記(上記も一部編集しました。)

VBA側は動いたものの、VBScriptのADODB.Streamを使う部分(テキストファイルをUTF-8で読みこみするときに使われる)が、誤動作していましたので、解決策とはいえないものでした。  
おそらく、Excel 2016 32bit版では おきない問題な気がしていますので、同様のトラブルに見舞われた方は、32bit版を使うのを、おすすめします。  
また、Excel 64bit版 でも、トラブルにならない環境もあるようです。

念のためですが、自分はMac上のParallelsDesktop上で新たにWin7 64bitを作成していました。  
VMWareFusion7 のWin7 64bitでの、Excel 2016 64bit
では問題なく動いていたコードだったのですが、移行のためにParallelsDesktopでインストールしたら、動かないという状態でした。以前の環境は数年使っていたので、各種Updateなどが正しく入っていたのかもしれません。


CC BY-SA 3.0
2017-07-02T03:07:07.033
36023
2017-07-03T03:41:52.113
2017-07-03T03:41:52.113
21047
21047
36021
answer


> 正常動作するほうは、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`](https://support.microsoft.com/ja-
jp/help/301202/how-to-check-for-mdac-version)は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`を[マージ](https://msdn.microsoft.com/en-
us/library/ms724498\(v=vs.85\).aspx)したものでどちらが破損しているかで状況が変わります。更に64bit
Windows上の32bitアプリケーションから参照した場合は[さらに複雑なルールでマージ](https://msdn.microsoft.com/ja-
jp/library/aa384253\(v=vs.85\).aspx)されます。

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


CC BY-SA 3.0
2017-07-02T15:16:41.810
36044
2017-07-03T09:30:12.120
2020-06-17T08:14:45.997
-1
4236
36021
answer