- 事象
- 結論
- 状況
- エラーを振り返って
- 「Active X コンポーネントはオブジェクトを作成できません。」が出てきたときの対応まとめ
- 【おまけ】32bit版のvbsでvbsファイルを起動するときのbatの書き方
事象
とあるアプリをVBScriptで自動化するため、コードを書いていました。
CreateObjectでオブジェクトを作成するコードで「Active X コンポーネントはオブジェクトを作成できません。」というエラーに遭遇。
解決のために小一時間ハマってしまったので情報共有の意味を込めてエントリーに残しておきます。
結論
VBScriptのインタプリタを32bitバージョンを明示的に指定したところ解決しました。
CreateObjectで作成するオブジェクトによっては32bitにしか対応していない場合があるので、
使用するオブジェクトや実行環境に気を付けましょう。
特にWindowsの64bitを使っている場合は、VBScriptのインタプリタはデフォルトで64bitのバージョンに紐づいています。
「Active X コンポーネントはオブジェクトを作成できません。」のエラーが出てきたときに確認するのは、
・スペルミス
・作成したいコンポーネントが対応しているバージョン(32bitか64bitか)
この2つの点というお話です。
状況
これまでVBAを使ってPersonal Communicationの自動化をやっておりましたが、不安定なことがあったため、VBScriptへ鞍替えできないか検証しようとしたら遭遇しました。
⇒VBAでのPersonal Communicationの自動化はこちら Personal CommunicationsをVBAで操作してAS400の作業をプチRPAする - 適材適所
なんてことはない、VBAからVBScriptへの移植は簡単なので、変数の型宣言やVBA独自の関数をVBScriptのものに直すだけ。
直していざ実行するも、Active X コンポーネントはオブジェクトを作成できません。のエラーが発生。
スペルミスかな?
IBMのマニュアルと照らし合わせてみるも、全く同じスペル。
そもそもVBAで動いたものをそのままコピペしたので、スペルミスはないはず。
スペルミスならVBAでも動かない。
次のような最小のコードで実行するも解消せず。
Dim conMgr Set conMgr = CreateObject("PCOMM.autECLConnMgr")
これでエラーが発生するなんて、完全に詰みだ・・・。
と思っていましたが、過去に元IBM製品のNotesでも似たようなことがあったような・・・
⇒PowerShellでNotesメールを取得する - 適材適所
と思い出して調べてみると、やはり32bitと64bitの違いから来るエラーであることがわかりました。
先ほどの記事では、PowerShellのバージョンが異なるためエラーとなりましたが、今回もVBScriptを実行しているバージョンの違いから来ているエラーでした。
具体的には、VBScriptの実行は「wscript.exe」というプログラムが行っています。
wscript.exeにも32bitバージョンと64bitバージョンがあります。
それぞれ下記のフォルダに格納されています(Windows 10 64bitの場合)。
64bitバージョン
C:\Windows\System32\wscript.exe
32bitバージョン
C:\Windows\SysWOW64\SysWOW64\cscript.exe
めちゃくちゃややこしいですが、System32に64bitバージョンが格納されています。
64bitのWindowsの場合は64bitバージョンがvbsファイルと紐づいているため、
知らず知らずのうちに64bitバージョンのwscript.exeが動いておりました。
Personal Communication用のCOMオブジェクトは32bitでしか動かないため、
このエラーが出ておりました・・・というわけでございました。
エラーを振り返って
まさか、実行環境に問題があるとは思いませんでした。
全く意識していない部分に問題が潜んでいると中々見つけ出すのが難しい・・・。
20分くらいスペルミスを疑ってました・・・。
32bitと64bitのバージョンの違いにはもうしばらく悩まされそうな気がします。
そして将来的には128bitと64bitで悩まされることになるんだろうな・・・。
「Active X コンポーネントはオブジェクトを作成できません。」が出てきたときの対応まとめ
繰り返しになりますが、VBScript(vbs)のCreateObjectで「Active X コンポーネントはオブジェクトを作成できません。」のエラーが出てきたときに確認すのは次の2点。
・スペルミスがないか
・作成したいコンポーネントが対応しているバージョン(32bitか64bitか)と実行環境に乖離はないか
以上になります。
ここまでお読みいただき、ありがとうございました。
【おまけ】32bit版のvbsでvbsファイルを起動するときのbatの書き方
バッチで32bit版のvbsでvbsファイルを起動するときの覚書です。
%windir%\SysWOW64\cscript.exe C:\test.vbs