2017-10-11 27 views
0

VBA(Word/Excel)から.NETランタイムからオブジェクトを呼び出そうとしています。 これは動作します: oT = CreateObject("System.Text.UTF8Encoding") ではなく、この: CreateObject("System.Management.Automation.Runspaces.RunspaceFactory") をエラーは次のとおりです。 実行時エラー '429'; ActiveXコンポーネントはオブジェクトを作成できませんVisual Basic - .NETランタイムの呼び出し

私は理解していないことはエクセル/ワードはクラスが公開されるかを決定し、

+0

シンプル:Excel/Wordはリモートから関与することさえありません。これはVBEの仕事であり、ホストアプリケーションの仕事ではありません。 –

+0

VBEはアクセス可能なものとそうでないものをどのように知っていますか? – Konrads

+1

.NETクラスのサブセットのみが[ComVisible(true)]です。 .NET 1.0に入っていたほとんどのものは、プログラマーに.NETの勢いを移すことを依頼することが依然として重要で、彼らが持っているすべてのものを書き直すことを強いられていませんでした。独自の[ComVisible]ラッパーを作成する必要があります。 –

答えて

3

CreateObjectを起動すると、名前空間ないときに指定する引数されていない方法です、それはProgIdです - COMが登録されたクラス(およびそれらが定義されているライブラリ、およびそのライブラリがある場所)をWindowsレジストリに配置するために使用する文字列です。

ProgIdの値がSystem.Management.Automation.Runspaces.RunspaceFactoryの登録済みCOMタイプがない場合、ActiveXはそのオブジェクトを作成できません。

名前空間のCOMタイプライブラリがない(つまり、アセンブリがCOM相互運用機能用に登録されていない)場合は、COMに.NET /管理コードを理解させようとしています。私は理解していないことはエクセル/ワードはクラスが公開されるかを決定し、

エクセル/ワード/どんなホストアプリケーションは、それとは何の関係もありませんされていない、それはだ方法です

COMタイプをロードするVBA独自のランタイム、登録されているすべてのもののProgIdを含むWindowsレジストリです。

あなたはHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSIDScripting.Dictionaryのためのあなたのレジストリを検索した場合、あなたは最終的にScripting.Dictionaryの値とC:\Windows\system32\scrrun.dllの値を持つInprocServer32サブキーを持つProgIDサブキーで、{EE09B103-97E0-11CF-978F-00A02463E06F}という名前のキーを見つけることができますし、VBAランタイムがで成功した場合その型ライブラリに指定されたProgIdを持つ型のインスタンスを作成すると、CreateObjectの呼び出しが成功し、そのインスタンスが返されます。それ以外の場合は、エラー429が発生し、「ActiveXはオブジェクトを作成できません」と表示されます。

+3

FWIW - 'ProgId'は厳密に' CreateObject'に必須ではありません.CLSIDは、COM互換オブジェクトが 'ProgID'を持たない場合に役立ちます。良い例は、MS Forms 2.0ライブラリの 'ProgID'がない' MSForms.DataObject'です: 'Set objData = CreateObject(" New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69} ") – this

関連する問題