次の方法で共有


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

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

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

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

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

  • VBA コードを含むワークブックを作成する。

  • Excel のトラスト センターを使用してブックの場所を信頼する。

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

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

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

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

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

[前提条件]

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

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/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という名前の新しいインターフェイスを生成し、Sheet1 インターフェイスを実装するようにISheet1 クラスの定義を変更します。 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 プロパティを True に設定します。

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

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

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

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

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

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

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

ブック内の VBA コードから CreateVstoNamedRange メソッドを呼び出すようになりました。

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

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

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

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

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

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

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

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

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

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

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

次のステップ

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