方法 : Visual C# プロジェクトのコードを VBA に公開する
2 種類のコードを連携させる場合は、Visual C# プロジェクトのコードを Visual Basic for Applications (VBA) コードに公開することができます。
Visual C# プロセスは Visual Basic プロセスとは異なります。詳細については、「方法 : Visual Basic プロジェクトのコードを VBA に公開する」を参照してください。
対象: このトピックの情報は、Excel 2013 と Excel 2010、および Word 2013 と Word 2010 のドキュメント レベルのプロジェクトに適用されます。詳細については、「Office アプリケーションおよびプロジェクト タイプ別の使用可能な機能」を参照してください。
Visual C# プロジェクトのコードの公開
VBA コードから Visual C# プロジェクトのコードを呼び出すには、VBA コードを変更して COM から参照できるようにし、デザイナーで ReferenceAssemblyFromVbaProject プロパティを True に設定します。
VBA から Visual C# プロジェクト内のメソッドを呼び出す方法について説明したチュートリアルについては、「チュートリアル : VBA から Visual C# プロジェクトのコードを呼び出す」を参照してください。
Visual C# プロジェクトのコードを VBA に公開するには
マクロをサポートする Word 文書、Excel ブック、または Excel テンプレートに基づく、VBA コードが既に含まれているドキュメント レベルのプロジェクトを開くか、または作成します。
マクロをサポートするドキュメント ファイル形式の詳細については、「VBA とドキュメント レベルのカスタマイズの結合」を参照してください。
[!メモ]
この機能は、Word テンプレート プロジェクトでは使用できません。
ドキュメント内の VBA コードがユーザーにマクロの有効化を要求することなく実行可能であることを確認します。Word または Excel のセキュリティ センターの設定にある信頼できる場所の一覧に Office プロジェクトの場所を追加することで、VBA コードを信頼して実行できるようになります。
VBA に公開するメンバーをプロジェクトのパブリック クラスに追加し、そのメンバーを public として宣言します。
VBA に公開するクラスに次の ComVisibleAttribute 属性および ClassInterfaceAttribute 属性を適用します。これらの属性によって、クラス インターフェイスを生成しなくても VBA に公開するクラスが COM から参照できるようになります。
[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
プロジェクトのホスト項目クラスの GetAutomationObject メソッドをオーバーライドして、VBA に公開するクラスのインスタンスを返します。
VBA にホスト項目クラスを公開する場合は、このクラスに属する GetAutomationObject メソッドをオーバーライドし、このクラスの現在のインスタンスを返します。
protected override object GetAutomationObject() { return this; }
VBA にホスト項目ではないクラスを公開する場合は、プロジェクト内のいずれかのホスト項目に属する GetAutomationObject メソッドをオーバーライドし、ホスト項目ではないクラスのインスタンスを返します。たとえば、次のコードでは、DocumentUtilities という名前のクラスを VBA に公開することを前提としています。
protected override object GetAutomationObject() { return new DocumentUtilities(); }
ホスト項目の詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。
VBA に公開するクラスからインターフェイスを抽出します。[インターフェイスの公開] ダイアログ ボックスで、インターフェイス宣言に含めるパブリック メンバーを選択します。詳細については、「インターフェイスの抽出リファクタリング (C#)」を参照してください。
インターフェイス宣言に public キーワードを追加します。
インターフェイスに ComVisibleAttribute 属性を追加して、インターフェイスを COM から参照できるようにします。
[System.Runtime.InteropServices.ComVisible(true)]
文書 (Word の場合) またはワークシート (Excel の場合) を Visual Studio 内のデザイナーで開きます。
[プロパティ] ウィンドウで ReferenceAssemblyFromVbaProject プロパティを選択し、値を True に変更します。
[!メモ]
ブックまたは文書に VBA コードが含まれていない場合、または文書内の VBA コードに実行に対する信頼が付与されていない場合は、[ReferenceAssemblyFromVbaProject] プロパティを選択し、値を True に設定するときにエラー メッセージが表示されます。これは、このような場合、Visual Studio が文書内の VBA プロジェクトを変更できないからです。
表示されたメッセージで [OK] をクリックします。このメッセージは、プロジェクトを Visual Studio から実行するときに VBA コードをブックまたは文書に追加した場合、次にプロジェクトをビルドするときにその VBA コードが失われることを示します。これは、プロジェクトをビルドするたびに、ビルド出力フォルダー内のブックまたは文書が上書きされるためです。
この時点で、Visual Studio によって、VBA プロジェクトがアセンブリを呼び出すことができるようにプロジェクトが構成されます。さらに、Visual Studio は GetManagedClass という名前のメソッドを VBA プロジェクトに追加します。このメソッドは VBA プロジェクト内のどこからでも呼び出すことができ、それによって VBA に公開したクラスにアクセスできます。
プロジェクトをビルドします。
参照
処理手順
方法: Visual Studio で Office プロジェクトを作成する
チュートリアル : VBA から Visual C# プロジェクトのコードを呼び出す
方法 : Visual Basic プロジェクトのコードを VBA に公開する