次の方法で共有


チュートリアル : VBA から Visual C# プロジェクトのコードを呼び出す

このチュートリアルでは、ブック内の Visual Basic for Applications (VBA) コードから Microsoft Office Excel 用のドキュメント レベルのカスタマイズ内のメソッドを呼び出す方法について説明します。 この操作を実行するには、Sheet1 ホスト項目クラスにメソッドを追加し、そのメソッドをブック内の VBA コードに公開し、そのメソッドをブック内の VBA コードから呼び出すという主要な 3 つの手順を使用します。

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

このチュートリアルでは Excel を使用しますが、ここで説明する概念は Word 用のドキュメント レベルのプロジェクトにも該当します。

このチュートリアルでは、次の作業について説明します。

  • VBA コードを含むブックの作成

  • Excel のセキュリティ センターを使用した、ブックの場所に対する信頼の付与

  • Sheet1 ホスト項目クラスへのメソッドの追加

  • Sheet1 ホスト項目クラスのインターフェイスの抽出

  • VBA コードへのメソッドの公開

  • VBA コードからのメソッドの呼び出し

注意

次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。 これらの要素は、使用する Visual Studio のエディションとその設定によって決まります。 詳細については、「設定の操作」を参照してください。

必須コンポーネント

このチュートリアルを実行するには、次のコンポーネントが必要です。

-

Microsoft Office 開発者ツールを含むエディションの Visual Studio 2010。 詳細については、「[Office ソリューションを開発できるようにコンピューターを構成する](bb398242\(v=vs.100\).md)」を参照してください。
  • Excel 2007 または Excel 2010

VBA コードを含むブックの作成

まず、簡単な VBA マクロを含むマクロ有効ブックを作成します。 カスタマイズ内のコードを VBA に公開するためには、ブックに VBA コードが含まれている必要があります。 そうでない場合、Visual Studio は VBA コードがカスタマイズ アセンブリを呼び出すことができるように VBA プロジェクトを変更できません。

使用する VBA コードが含まれる既存のブックがある場合は、この手順を省略できます。

VBA コードを含むブックを作成するには

  1. Excel を起動します。

  2. アクティブ ドキュメントを WorkbookWithVBA という名前の Excel マクロ有効ブック (*.xlsm) として保存します。 このブックは、デスクトップなどの便利な場所に置きます。

  3. リボンの [開発] タブをクリックします。

    注意

    [開発] タブが表示されていない場合は、最初にこれを表示する必要があります。 詳細については、「方法 : [開発] タブをリボンに表示する」を参照してください。

  4. [コード] グループの [Visual Basic] をクリックします。

    Visual Basic エディターが開きます。

  5. [プロジェクト] ウィンドウの [ThisWorkbook] をダブルクリックします。

    ThisWorkbook オブジェクトのコード ファイルが開きます。

  6. コード ファイルに次の VBA コードを追加します。 このコードには、何も操作を実行しない簡単な関数が定義されています。 この関数は、ブック内に VBA プロジェクトが存在することを確認することだけを目的としています。 これは、このチュートリアルの後の手順で必要となります。

    Sub EmptySub()
    End Sub
    
  7. 文書を保存し、Excel を終了します。

プロジェクトの作成

次に、前の手順で作成したマクロ有効ブックを使用する、Excel 用のドキュメント レベルのプロジェクトを作成します。

新しいプロジェクトを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  3. テンプレート ペインで、[Visual C#][Office] の順に展開します。

  4. [2010] ノードまたは [2007] ノードを選択します。

  5. プロジェクト テンプレートの一覧で、[Excel ブック] プロジェクトを選択します。

  6. [名前] ボックスに「CallingCodeFromVBA」と入力します。

  7. [OK] をクリックします。

    Visual Studio Tools for Office プロジェクト ウィザードが開きます。

  8. [既存のドキュメントをコピーする] を選択し、[既存のドキュメントの完全パス] ボックスで、前の手順で作成したブック WorkbookWithVBA の場所を指定します。 独自に作成したマクロ有効ブックを使用する場合は、そのブックの場所を指定します。

  9. [完了] をクリックします。

    Visual Studio によって、デザイナーで WorkbookWithVBA ブックが開き、ソリューション エクスプローラーCallingCodeFromVBA プロジェクトが追加されます。

ブックの場所に対する信頼の付与

ソリューションのコードをブック内の VBA コードに公開するためには、ブック内の VBA に実行についての信頼を付与する必要があります。 これにはいくつかの方法があります。 このチュートリアルでは、このタスクを実行するために、Excel のセキュリティ センターでブックの場所に信頼を付与します。

ブックの場所に信頼を付与するには

  1. Excel を起動します。

  2. [ファイル] タブ (Excel 2010 の場合) または Microsoft Office ボタン (Excel 2007 の場合) をクリックします。

  3. [Excel のオプション] をクリックします。

  4. カテゴリ ペインで、[セキュリティ センター] をクリックします。

  5. 詳細ペインで [セキュリティ センターの設定] をクリックします。

  6. カテゴリ ペインで [信頼できる場所] をクリックします。

  7. 詳細ペインの [新しい場所の追加] をクリックします。

  8. [Microsoft Office の信頼できる場所] ダイアログ ボックスで、CallingCodeFromVBA プロジェクトがあるフォルダーに移動します。

  9. [この場所のサブフォルダーも信頼する] を選択します。

  10. [Microsoft Office の信頼できる場所] ダイアログ ボックスで [OK] をクリックします。

  11. [セキュリティ センター] ダイアログ ボックスで [OK] をクリックします。

  12. [Excel のオプション] ダイアログ ボックスで [OK] をクリックします。

  13. Excel を終了します。

Sheet1 クラスへのメソッドの追加

VBA プロジェクトのセットアップが完了したので、次に VBA コードから呼び出す Sheet1 ホスト項目クラスにパブリック メソッドを追加します。

Sheet1 クラスにメソッドを追加するには

  1. ソリューション エクスプローラー[Sheet1.cs] を右クリックし、[コードの表示] をクリックします。

    コード エディターで Sheet1.cs ファイルが開きます。

  2. Sheet1 クラスに次のコードを追加します。 CreateVstoNamedRange メソッドは、指定された範囲に新しい NamedRange オブジェクトを作成します。 このメソッドは、NamedRangeSelected イベントを処理するイベント ハンドラーも作成します。 後の手順で、ドキュメント内の VBA コードから CreateVstoNamedRange メソッドを呼び出します。

    private Microsoft.Office.Tools.Excel.NamedRange namedRange1;
    
    public void CreateVstoNamedRange(Excel.Range range, string name)
    {
        if (!this.Controls.Contains(name))
        {
            namedRange1 = this.Controls.AddNamedRange(range, name);
            namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler(
                    namedRange1_Selected);
        }
        else
        {
            MessageBox.Show("A named range with this specific name " +
                "already exists on the worksheet.");
        }
    }
    
    private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target)
    {
        MessageBox.Show("This named range was created by Visual Studio " +
            "Tools for Office.");
    }
    
  3. Sheet1 クラスに次のメソッドを追加します。 このメソッドは、GetAutomationObject() メソッドをオーバーライドして、Sheet1 クラスの現在のインスタンスを返します。

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Sheet1 クラス宣言の第 1 行の前に次の属性を適用します。 これらの属性によって、クラス インターフェイスを生成しなくても VBA に公開するクラスが COM から参照できるようになります。

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Sheet1 クラスのインターフェイスの抽出

CreateVstoNamedRange メソッドを VBA コードに公開する前に、このメソッドが定義されたパブリック インターフェイスを作成し、そのインターフェイスを COM に公開する必要があります。

Sheet1 クラスのインターフェイスを抽出するには

  1. Sheet1.cs コード ファイルを開き、Sheet1 クラスの任意の位置をクリックします。

  2. [リファクター] メニューの [インターフェイスの展開] をクリックします。

  3. [インターフェイスの展開] ダイアログ ボックスの [インターフェイスからパブリック メンバーを選択してください] ボックスの一覧で、CreateVstoNamedRange メソッドのエントリをクリックします。

  4. [OK] をクリックします。

    Visual Studio は ISheet1 という名前の新しいインターフェイスを生成し、ISheet1 インターフェイスを実装するように Sheet1 クラスの定義を変更します。 さらに、Visual Studio は ISheet1.cs ファイルをコード エディターで開きます。

  5. ISheet1.cs ファイル内の ISheet1 インターフェイス宣言を次のコードに置き換えます。 このコードによって、ISheet1 がパブリック インターフェイスになり、ComVisibleAttribute 属性の適用により、このインターフェイスが COM から参照できるようになります。

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. プロジェクトをビルドします。

VBA コードへのメソッドの公開

CreateVstoNamedRange メソッドをブック内の VBA コードに公開するには、Sheet1 ホスト項目の ReferenceAssemblyFromVbaProject プロパティを True に設定します。

VBA コードにメソッドを公開するには

  1. ソリューション エクスプローラーで、Sheet1.cs をダブルクリックします。

    デザイナーで WorkbookWithVBA ファイルが開き、Sheet1 が表示されます。

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

  3. 表示されたメッセージで [OK] をクリックします。

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

VBA コードからのメソッドの呼び出し

ここで、ブック内の VBA コードから CreateVstoNamedRange メソッドを呼び出すことができます。

注意

このチュートリアルでは、プロジェクトのデバッグ中に VBA コードをブックに追加します。 このドキュメントに追加する VBA コードは、次にプロジェクトをビルドするときに上書きされます。これは、Visual Studio によって、ビルド出力フォルダー内のドキュメントが、メイン プロジェクト フォルダーのドキュメントのコピーで置換されるためです。 VBA コードを保存する場合は、コードをプロジェクト フォルダー内のドキュメントにコピーします。 詳細については、「VBA からドキュメント レベルのカスタマイズ内のコードを呼び出す」を参照してください。

VBA コードからメソッドを呼び出すには

  1. F5 キーを押してプロジェクトを実行します。

  2. [開発] タブの [コード] グループで [Visual Basic] をクリックします。

    Visual Basic エディターが開きます。

  3. [挿入] メニューの [モジュール] をクリックします。

  4. 新しいモジュールに次のコードを追加します。

    このコードはカスタマイズ アセンブリの CreateTable メソッドを呼び出します。 マクロは、VBA コードに公開した Sheet1 ホスト項目クラスにアクセスする GetManagedClass メソッドを使用して、このメソッドにアクセスします。 GetManagedClass メソッドは、前の手順で ReferenceAssemblyFromVbaProject プロパティを設定したときに自動的に生成されています。

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. F5 キーを押します。

  6. ブックが開いたら、Sheet1 のセル A1 をクリックします。 メッセージ ボックスが表示されることを確認します。

  7. 変更を保存せずに Excel を終了します。

次の手順

Office ソリューションのコードを VBA から呼び出す方法の詳細については、次の各トピックを参照してください。

参照

処理手順

方法 : Visual Basic プロジェクトのコードを VBA に公開する

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

チュートリアル : VBA から Visual Basic プロジェクトのコードを呼び出す

概念

VBA とドキュメント レベルのカスタマイズの結合

ドキュメント レベルのカスタマイズのプログラミング