COMを使用してC#からVBAにカスタムオブジェクト(MyClass []など)を渡すことは可能ですか?COM Interopを使用してC#からVBAにオブジェクトを渡す
もしそうでない場合は、これを有効にする最良の解決策はありますか?
COMを使用してC#からVBAにカスタムオブジェクト(MyClass []など)を渡すことは可能ですか?COM Interopを使用してC#からVBAにオブジェクトを渡す
もしそうでない場合は、これを有効にする最良の解決策はありますか?
私はここにデフォルト名ClassLibrary1のワットプロジェクトで、それをしない最小限のC#クラスだあなたはC#...
にエクセルVBAの話をしていると仮定します。
using System;
using System.Runtime.InteropServices;
namespace Tester
{
[ClassInterface(ClassInterfaceType.AutoDual)]
public class TestClass
{
public double D { get; set; } // simple property to get, set a double
public string S { get; set; } // simple property to get, set a string
}
}
、ここではVBAをしますクラスを試してみる:
Private Sub foo()
Dim X As New ClassLibrary1.TestClass
X.S = "Hello"
Debug.Print X.S ' prints "hello"
X.D = 12
Debug.Print X.D ' prints a 12
End Sub
、ここでは、あなたがこの仕事をするために行う必要があり、余分なものは以下のとおりです。
(1) in C# Project...Properties...Build ==> check "Register for COM interop
(2) in C# Project...Properties...Application...Assembly Information ==>
check "Make assembly COM-visible"
(3) in VBA ... Tools ... References, browse to the C# bin output directory and select the "*.tlb" file
注:このスキームは、クラスに追加する内容によっては失敗する可能性があります.VBAは、デフォルトコンストラクタ以外の静的クラスまたはクラスを「参照」しないと思います。 VBコレクションを.NETコレクションにマップすることもできませんが、基本タイプ(double、long)と基本タイプの配列を前後に渡すことができます。また、使用される "Autodual"オプションは、メソッドを公開する安価な方法です...開始は簡単ですが効率は低く、すべてのパブリックメソッドを公開します。より良いプラクティス(より多くの作業)は、独自のインターフェイスを設定することです。このTestClassのメンバーを展開して定義した他のクラスのインスタンスを含むようにし、同様にこれらのクラスメソッドをAutoDualまたはハンドコーディングされたインターフェイスで公開すると、それらのクラスと(オーバーロードされない)メソッドも同様に表示されますVBAで(Intellisenseで)。
これが役に立ちます。
私はC#3.5、Visual Studio 2008のクラスライブラリプロジェクトでその例を試しました。私のビルドはDLLだけを作成し、tlbは作成しません。何かアドバイス ? – Jerome
検索が見つかったhttp://stackoverflow.com/questions/375457/cant-instantiate-a-com-object-written-in-c-from-vba-vb6-ok、これは興味深いかもしれません。 – Fionnuala
あなたがComVisibleにしている限り、そうです。 –