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

更新 : 2007 年 11 月

対象

このトピックの情報は、指定された Visual Studio Tools for Office プロジェクトおよび Microsoft Office のバージョンにのみ適用されます。

プロジェクトの種類

  • ドキュメント レベルのプロジェクト

Microsoft Office のバージョン

  • 2007 Microsoft Office system

詳細については、「アプリケーションおよびプロジェクトの種類別の使用可能な機能」を参照してください。

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

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

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

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

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

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

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

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

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

Bb608613.alert_note(ja-jp,VS.90).gifメモ :

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

前提条件

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

  • Visual Studio Tools for Office (Visual Studio 2008 Professional および Visual Studio Team System のオプションの要素)

  • Microsoft Office Excel 2007

ここに挙げた Visual Studio のバージョンでは、Visual Studio Tools for Office が既定でインストールされます。インストールされているかどうかを確認する方法については、「Visual Studio Tools for Office のインストール」を参照してください。

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

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

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

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

  1. Excel 2007 を起動します。

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

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

    Bb608613.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

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

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

    Sub EmptySub()
    End Sub
    
  7. ブックを保存し、Excel を終了します。

プロジェクトの作成

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

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

  1. Visual Studio を起動します。

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

  3. [プロジェクトの種類] ペインで、[Visual C#] を展開し、さらに [Office] を展開します。

  4. 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. Office 2007 ボタン(Microsoft Office ボタン) をクリックします。

  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 メソッドを呼び出すことができます。

Bb608613.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

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

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

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

    このコードは Visual Studio Tools for Office アセンブリの 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 を終了します。

次の手順

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

参照

処理手順

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

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

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

概念

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

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