2011-02-16 8 views
3

COMを使用してC#からVBAにカスタムオブジェクト(MyClass []など)を渡すことは可能ですか?COM Interopを使用してC#からVBAにオブジェクトを渡す

もしそうでない場合は、これを有効にする最良の解決策はありますか?

+1

検索が見つかったhttp://stackoverflow.com/questions/375457/cant-instantiate-a-com-object-written-in-c-from-vba-vb6-ok、これは興味深いかもしれません。 – Fionnuala

+1

あなたがComVisibleにしている限り、そうです。 –

答えて

6

私はここにデフォルト名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で)。

これが役に立ちます。

+0

私はC#3.5、Visual Studio 2008のクラスライブラリプロジェクトでその例を試しました。私のビルドはDLLだけを作成し、tlbは作成しません。何かアドバイス ? – Jerome

関連する問題