チュートリアル : アプリケーション レベルのアドインのコードを VBA から呼び出す

更新 : 2007 年 11 月

対象

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

プロジェクトの種類

  • アプリケーション レベルのプロジェクト

Microsoft Office のバージョン

  • 2007 Microsoft Office system

  • Microsoft Office 2003

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

このチュートリアルでは、アプリケーション レベルのアドインのオブジェクトを Visual Basic for Applications (VBA) アドインや COM アドインなど、他の Microsoft Office ソリューションに公開する方法について説明します。

このチュートリアルでは Excel を使用しますが、ここで説明する概念は Visual Studio Tools for Office で提供されるすべてのアドイン プロジェクトに当てはまります。

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

  • 他の Office ソリューションに公開できるクラスを定義する。

  • 定義したクラスを他の Office ソリューションに公開する。

  • 公開したクラスのメソッドを VBA から呼び出す。

Bb608614.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

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

    このチュートリアルは Microsoft Office Excel 2003 でも実行できます。ただし、Excel 2007 のリボンの使用を前提とする手順もあります。

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

ビデオへのリンクビデオ デモについては、「Video How to: Calling Code in an Application-Level Add-in from VBA」を参照してください。

アドイン プロジェクトの作成

まず、Excel 用のアドイン プロジェクトを作成します。

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

  • 2007 Microsoft Office システムの Excel アドイン プロジェクト テンプレートを使用して、ExcelImportData という名前の Excel アドイン プロジェクトを作成します。詳細については、「方法 : Visual Studio Tools for Office プロジェクトを作成する」を参照してください。

    Visual Studio によって、ThisAddIn.cs コード ファイルまたは ThisAddIn.vb コード ファイルが開き、ソリューション エクスプローラExcelImportData プロジェクトが追加されます。

他の Office ソリューションに公開できるクラスを定義する

このチュートリアルの目的は、アドインの AddInUtilities というクラスの ImportData メソッドを VBA コードから呼び出すことです。このメソッドは、アクティブ ブック内の新しいワークシートにデータをインポートし、そのデータを格納する簡単な DataSet を作成します。

AddInUtilities クラスを他の Office ソリューションに公開するためには、このクラスをパブリックにし、COM から参照できるようにする必要があります。また、このクラスの IDispatch インターフェイスを公開する方法も提供する必要があります。次の手順で示すコードでは、これらの要件を満たす方法の 1 つを示します。詳細については、「他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し」を参照してください。

他の Office ソリューションに公開できるクラスを定義するには

  1. [プロジェクト] メニューの [クラスの追加] を選択します。

  2. [新しい項目の追加] ダイアログ ボックスで、新しいクラスの名前を AddInUtilities に変更し、[追加] をクリックします。

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

  3. ファイルの先頭に次のステートメントを追加します。

    Imports System.Data
    Imports System.Runtime.InteropServices
    Imports Excel = Microsoft.Office.Interop.Excel
    
    using System.Data;
    using System.Runtime.InteropServices;
    using Excel = Microsoft.Office.Interop.Excel;
    
  4. 空の AddInUtilities クラス宣言を次のコードに置き換えます。

    このコードは、AddInUtilities クラスを COM から参照できるようにし、このクラスに ImportData メソッドを追加します。IDispatch インターフェイスを公開するには、AddInUtilities が InterfaceIsIDispatch 属性を持つインターフェイスを実装することも必要です。

    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _
    Public Interface IAddInUtilities
        Sub ImportData()
    End Interface
    
    <System.Runtime.InteropServices.ComVisibleAttribute(True)> _
    <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _
    Public Class AddInUtilities
        Implements IAddInUtilities
    
        Public Sub ImportData() Implements IAddInUtilities.ImportData
    
            ' Create a new DataTable.
            Dim ds As New DataSet()
            Dim dt As DataTable = ds.Tables.Add("Customers")
            dt.Columns.Add(New DataColumn("LastName"))
            dt.Columns.Add(New DataColumn("FirstName"))
    
            ' Add a new row to the DataTable.
            Dim dr As DataRow = dt.NewRow()
            dr("LastName") = "Chan"
            dr("FirstName") = "Gareth"
            dt.Rows.Add(dr)
    
            ' Add a new XML map to the collection.
            Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook
            Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _
                "NewDataSet")
    
            ' Import the data.
            If Not (xmlMap1 Is Nothing) Then
                Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count)
                Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _
                    After:=lastSheet), Excel.Worksheet)
                newSheet.Name = "Imported Data"
                activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _
                    newSheet.Range("A1"))
            End If
        End Sub
    End Class
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IAddInUtilities
    {
        void ImportData();
    }
    
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)]
    public class AddInUtilities : IAddInUtilities
    {
        public void ImportData()
        {
            // Create a new DataTable.
            DataSet ds = new DataSet();
            DataTable dt = ds.Tables.Add("Customers");
            dt.Columns.Add(new DataColumn("LastName"));
            dt.Columns.Add(new DataColumn("FirstName"));
    
            // Add a new row to the DataTable.
            DataRow dr = dt.NewRow();
            dr["LastName"] = "Chan";
            dr["FirstName"] = "Gareth";
            dt.Rows.Add(dr);
    
            // Add a new XML map to the collection.
            Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook;
            Excel.XmlMap xmlMap1 = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), 
                "NewDataSet");
    
            // Import the data.
            if (xmlMap1 != null)
            {
                object lastSheet = activeWorkbook.Sheets[activeWorkbook.Sheets.Count];
                Excel.Worksheet newSheet = (Excel.Worksheet)activeWorkbook.Sheets.Add(
                    System.Type.Missing, lastSheet, 1, System.Type.Missing);
                newSheet.Name = "Imported Data";
    
                activeWorkbook.XmlImportXml(ds.GetXml(), out xmlMap1, true,
                    newSheet.get_Range("A1", System.Type.Missing));
            }
        }
    }
    

定義したクラスを他の Office ソリューションに公開する

AddInUtilities クラスを他の Office ソリューションに公開するには、ThisAddIn クラスの RequestComAddInAutomationService メソッドをオーバーライドします。オーバーライドでは、AddInUtilities クラスのインスタンスを返します。

AddInUtilities クラスを他の Office ソリューションに公開するには

  1. ソリューション エクスプローラで、[Excel] を展開します。

  2. ThisAddIn.cs または ThisAddIn.vb を右クリックし、[コードの表示] をクリックします。

  3. ThisAddIn クラスに次のコードを追加します。

    Private utilities As AddInUtilities
    
    Protected Overrides Function RequestComAddInAutomationService() As Object
        If utilities Is Nothing Then
            utilities = New AddInUtilities()
        End If
        Return utilities
    End Function
    
    private AddInUtilities utilities;
    
    protected override object RequestComAddInAutomationService()
    {
        if (utilities == null)
            utilities = new AddInUtilities();
    
        return utilities;
    }
    
  4. [ビルド] メニューの [ソリューションのビルド] をクリックします。

    ソリューションがエラーなしでビルドされることを確認します。

アドインのテスト

AddInUtilities クラスをさまざまな種類の Office ソリューションから呼び出すことができます。このチュートリアルでは、Excel ブック内の VBA コードを使用します。使用できる他の Office ソリューションの詳細については、「他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し」を参照してください。

アドインをテストするには

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

  2. Excel で、アクティブ ブックを Excel マクロ有効ブック (*.xlsm) として保存します。このブックは、デスクトップなどの便利な場所に置きます。

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

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

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

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

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

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

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

  6. コード ファイルに次の VBA コードを追加します。このコードは、まず ExcelImportData アドインを表す COMAddIn オブジェクトを取得します。次に、COMAddIn オブジェクトの Object プロパティを使用して ImportData メソッドを呼び出します。

    Sub CallVSTOMethod()
        Dim addIn As COMAddIn
        Dim automationbject As Object
        Set addIn = Application.COMAddIns("ExcelImportData")
        Set automationObject = addIn.Object
        automationObject.ImportData
    End Sub
    
  7. F5 キーを押します。

  8. 新しい Imported Data シートがブックに追加されていることを確認します。セル A1 に文字列 Chan があり、セル B1 に文字列 Gareth があることも確認してください。

  9. Excel を終了します。

次の手順

アドインのプログラミングの詳細については、次の各トピックを参照してください。

参照

処理手順

方法 : Visual Studio Tools for Office プロジェクトを作成する

概念

アプリケーション レベルのアドインのプログラミング

他の Office ソリューションからのアプリケーション レベルのアドインのコードの呼び出し

Office ソリューションの開発

AddIn ホスト項目

機能拡張インターフェイスによる UI 機能のカスタマイズ

アプリケーション レベルのアドインのアーキテクチャ