次の方法で共有


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

このチュートリアルでは、ブック内の Visual Basic for Applications (VBA) コードから Microsoft Office Excel 用のドキュメント レベルのカスタマイズ内のメソッドを呼び出す方法を示します。 このプロシージャには次の 3 つの基本的な手順が含まれます。 Sheet1 ホスト項目クラスにメソッドを追加する、ブックの VBA コードにメソッドを公開する、および、ブック内の VBA コードからメソッドを呼び出す、の 3 つです。

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

このチュートリアルでは具体的には Excel を使用していますが、チュートリアルで示されるコンセプトは Word のドキュメント レベルのプロジェクトにも適用できます。

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

  • VBA コードが含まれるブックを作成する。

  • Excel のセキュリティ センターを使用して、ブックの場所を信頼する。

  • Sheet1 ホスト項目クラスにメソッドを追加する。

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

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

  • VBA コードからメソッドを呼び出す。

Note

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

前提条件

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

VBA コードが含まれるブックを作成する

最初の手順では、単純な VBA マクロを含むマクロ対応のブックを作成します。 カスタマイズ内のコードを VBA に公開する前に、ブックに VBA コードを含めておく必要があります。 含めないと、Visual Studio は VBA プロジェクトを変更して、VBA コードがカスタマイズ アセンブリを呼び出せるようにすることができません。

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

VBA コードが含まれるブックを作成するには

  1. Excel を起動します。

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

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

    Note

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

  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/SharePoint]を展開します。

  4. [Office アドイン] ノードを選択します。

  5. プロジェクト テンプレートのリストで、 [Excel 2010 ブック] または [Excel 2013 ブック] プロジェクトを選択します。

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

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

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

  8. [既存のドキュメントをコピーする]を選択し、 [既存のドキュメントの完全なパス] ボックスで、先ほど作成した WorkbookWithVBA ブックの場所を指定します。 独自のマクロ対応ブックを使用している場合は、代わりにそのブックの場所を指定します。

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

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

ブックの場所を信頼する

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

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

  1. Excel を起動します。

  2. [ファイル] タブをクリックします。

  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 オブジェクトを作成します。 このメソッドにより、 SelectedNamedRangeイベントのイベント ハンドラーも作成されます。 このチュートリアルの後半では、ドキュメント内の 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 クラスの宣言の最初の行の前で、次の属性を適用します。 これらの属性によってクラスが 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 コードに公開するには、 ホスト項目の ReferenceAssemblyFromVbaProject Sheet1 プロパティを Trueに設定します。

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

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

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

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

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

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

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

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

Note

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

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

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

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

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

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

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

    このコードはカスタマイズ アセンブリの CreateTable メソッドを呼び出します。 マクロは VBA コードに公開する GetManagedClass ホスト項目クラスにアクセスするために、グローバル Sheet1 メソッドを使用してこのメソッドにアクセスします。 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 からのコード呼び出しについて詳しくは、次のトピックを参照してください。