次の方法で共有


Visual C# プロジェクトで VBA にコードを公開する

Visual C# プロジェクトのコードを Visual Basic for Applications (VBA) のコードに公開して、2 種類のコードが相互に対話できるようにすることができます。

Visual C# のプロセスは、Visual Basic のプロセスとは異なります。 詳細については、「方法: Visual Basic プロジェクトのコードを VBA に公開する」を参照してください。

適用対象: このトピックの情報は、Excel および Word のドキュメント レベルのプロジェクトに適用されます。 詳細については、「Office アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

Visual C# プロジェクトのコードを公開する

VBA のコードで Visual C# プロジェクトのコードを呼び出せるようにするには、COM で認識できるようにコードを変更した後、デザイナーで ReferenceAssemblyFromVbaProject プロパティを True に設定します。

VBA から Visual C# プロジェクトのメソッドを呼び出す方法を示すチュートリアルについては、「チュートリアル: Visual C# プロジェクトのコードを VBA から呼び出す」を参照してください。

Visual C# プロジェクトのコードを VBA に公開するには

  1. マクロをサポートし、既に VBA コードが含まれている Word 文書、Excel ブック、または Excel テンプレートに基づくドキュメントレベルのプロジェクトを開くか、作成します。

    マクロをサポートするドキュメント ファイル形式の詳細については、「VBA とドキュメントレベルのカスタマイズを結合する」を参照してください。

    Note

    この機能は、Word テンプレート プロジェクトでは使用できません。

  2. ドキュメント内の VBA コードが、ユーザーにマクロの有効化を求めることなく実行できることを確認します。 Word または Excel のセキュリティ センター設定の信頼できる場所の一覧に Office プロジェクトの場所を追加することによって、VBA コードの実行を信頼することができます。

  3. VBA に公開するメンバーをプロジェクトのパブリック クラスに追加し、新しいメンバーを public と宣言します。

  4. 次の ComVisibleAttribute 属性と ClassInterfaceAttribute 属性を、VBA に公開するクラスに適用します。 これらの属性によってクラスが COM で表示されるようになりますが、クラスのインターフェイスは生成されません。

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    
  5. プロジェクトでホスト項目クラスの GetAutomationObject メンバーをオーバーライドして、VBA に公開したクラスのインスタンスを返すようにします。

    • ホスト項目クラスを VBA に公開する場合は、このクラスに属する GetAutomationObject メソッドをオーバーライドし、クラスの現在のインスタンスを返します。

      protected override object GetAutomationObject()
      {
          return this;
      }
      
    • ホスト項目ではないクラスを VBA に公開する場合は、プロジェクトの任意のホスト項目の GetAutomationObject メソッドをオーバーライドし、非ホスト項目のクラスのインスタンスを返します。 たとえば、次のコードでは、DocumentUtilities という名前のクラスを VBA に公開することを想定しています。

      protected override object GetAutomationObject()
      {
          return new DocumentUtilities();
      }
      

      ホスト項目の詳細については、「ホスト項目とホスト コントロールの概要」を参照してください。

  6. VBA に公開するクラスからインターフェイスを抽出します。 [インターフェイスの抽出] ダイアログ ボックスで、インターフェイス宣言に含めるパブリック メンバーを選択します。 詳細については、「インターフェイスの抽出リファクタリング」を参照してください。

  7. インターフェイス宣言に public キーワードを追加します。

  8. インターフェイスに ComVisibleAttribute 属性を追加して、インターフェイスが COM に認識されるようにします。

    [System.Runtime.InteropServices.ComVisible(true)]
    
  9. Visual Studio のデザイナーで文書 (Word の場合) またはワークシート (Excel の場合) を開きます。

  10. [プロパティ] ウィンドウで、 ReferenceAssemblyFromVbaProject プロパティを選択し、値を Trueに変更します。

    Note

    ブックまたは文書に VBA コードがまだ含まれていない場合、または文書内の VBA コードの実行が信頼されていない場合は、ReferenceAssemblyFromVbaProject プロパティを True に設定するとエラー メッセージが表示されます。 これは、このような状況では、Visual Studio がドキュメントのVBA プロジェクトを変更できないためです。

  11. 表示されるメッセージで [OK] をクリックします。 このメッセージは、Visual Studio からプロジェクトを実行しているときにブックまたは文書に VBA コードを追加すると、次回プロジェクトをビルドしたときに VBA コードが失われることを示しています。 これは、プロジェクトをビルドするたびに、ビルド出力フォルダー内のドキュメントが上書きされるためです。

    この時点で、VBA プロジェクトがアセンブリを呼び出すことができるように、Visual Studio によってプロジェクトが構成されます。 また、Visual Studio では、GetManagedClass という名前のメソッドが VBA プロジェクトに追加されます。 VBA プロジェクト内の任意の場所からこのメソッドを呼び出して、VBA に公開したクラスにアクセスできます。

  12. プロジェクトをビルドします。