適材適所

PowerShellやVBAなどプログラミング系の話多めで

VBScriptのCreateObjectにおける「Active X コンポーネントはオブジェクトを作成できません。」のエラーについて

事象

とあるアプリをVBScriptで自動化するため、コードを書いていました。

CreateObjectでオブジェクトを作成するコードで「Active X コンポーネントはオブジェクトを作成できません。」というエラーに遭遇。

解決のために小一時間ハマってしまったので情報共有の意味を込めてエントリーに残しておきます。

f:id:shinmai_papa:20210709132146p:plain

結論

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のマニュアル)https://www.ibm.com/docs/ja/personal-communications/6.0?topic=library-host-access-class-automation-objectsと照らし合わせてみるも、全く同じスペル。

そもそも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か)と実行環境に乖離はないか

以上

関連しそうな記事

www.tekizai.net

www.tekizai.net