共用方式為


逐步解說:在應用程式層級增益集中呼叫 VBA 的程式碼

更新:2007 年 11 月

適用於

本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。

專案類型

  • 應用程式層級專案

Microsoft Office 版本

  • 2007 Microsoft Office system

  • Microsoft Office 2003

如需詳細資訊,請參閱依應用程式和專案類型提供的功能

本逐步解說示範如何將應用程式層級增益集 (Add-In) 中的物件公開 (Expose) 給其他 Microsoft Office 方案,包含 Visual Basic for Applications (VBA) 和 COM 增益集。

雖然本逐步解說特別使用 Excel,但所示範的概念卻同樣適用於 Visual Studio Tools for Office 所提供的任何增益集專案。

此逐步解說會說明以下工作:

  • 定義可以公開給其他 Office 方案的類別 (Class)。

  • 將類別公開給其他 Office 方案。

  • 從 VBA 程式碼呼叫類別的方法。

注意事項:

您的電腦可能會在下列說明中,以不同名稱或位置顯示某些 Visual Studio 使用者介面項目。您所擁有的 Visual Studio 版本以及使用的設定會決定這些項目。如需詳細資訊,請參閱 Visual Studio 設定

必要條件

您需要下列元件才能完成此逐步解說:

  • Visual Studio Tools for Office (Visual Studio 2008 Professional 和 Visual Studio Team System 的選擇性元件)。

  • Microsoft Office Excel 2007。

    注意事項:

    您也可以使用 Microsoft Office Excel 2003 執行本逐步解說。但是,部分指示假設您使用的是 Excel 2007 的功能區。

根據預設會隨所列出的 Visual Studio 版本安裝 Visual Studio Tools for Office。若要查看是否已安裝,請參閱 安裝 Visual Studio Tools for Office

如需觀看示範影片,請參閱影片 HOW TO:從 VBA 呼叫應用程式層級增益集中的程式碼

建立增益集專案

第一步是建立 Excel 的增益集專案。

若要建立新的專案

  • 使用 2007 Microsoft Office system 適用的 Excel 增益集專案範本建立 Excel 增益集專案,並命名為 ExcelImportData。如需詳細資訊,請參閱 HOW TO:建立 Visual Studio Tools for Office 專案

    Visual Studio 會開啟 ThisAddIn.cs 或 ThisAddIn.vb 程式碼檔,並將 ExcelImportData 專案加入至 [方案總管]。

定義可以公開給其他 Office 方案的類別。

本逐步解說的目的是為了從 VBA 程式碼在您的增益集中呼叫 AddInUtilities 類別的 ImportData 方法。這個方法會將資料匯入至現用活頁簿的新工作表中,並建立簡單 DataSet 以包含資料。

若要將 AddInUtilities 類別公開給其他 Office 方案,您必須使該類別成為公用 (Public) 類別而且讓 COM 看得見它。您還必須提供在類別中公開 IDispatch 介面的方式。下列程序中的程式碼會示範符合這些需求的其中一種方式。如需詳細資訊,請參閱在應用程式層級增益集中呼叫其他 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 類別。

    這個程式碼可讓 COM 看得見 AddInUtilities 類別,並將 ImportData 方法加入至這個類別。為了公開 IDispatch 介面,AddInUtilities 類別也會實作具有 InterfaceIsIDispatch 屬性 (Attribute) 的介面。

    <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. 按一下 [建置] 功能表上的 [建置方案]。

    接著驗證方案建置無誤。

測試增益集

您可以從多種不同類型的 Office 方案呼叫 AddInUtilities 類別。在本逐步解說中,您會在 Excel 活頁簿中使用 VBA 程式碼。如需還也可以使用之其他 Office 方案類型的詳細資訊,請參閱在應用程式層級增益集中呼叫其他 Office 方案的程式碼

若要測試增益集

  1. 請按 F5 執行您的專案。

  2. 在 Excel 中,將現用活頁簿儲存為 Excel 啟用巨集的活頁簿 (*.xlsm)。將它儲存在方便取用的位置,如桌面。

  3. 按一下 [功能區] 上的 [開發人員] 索引標籤。

    注意事項:

    如果 [開發人員] 索引標籤沒有顯示,您必須先使其顯示。如需詳細資訊,請參閱 HOW TO:在功能區顯示開發人員索引標籤

  4. 在 [程式碼] 群組中,按一下 [Visual Basic]。

    Visual Basic 編輯器隨即開啟。

  5. 按兩下 [專案] 視窗中的 [ThisWorkbook]。

    ThisWorkbook 物件的程式碼檔隨即開啟。

  6. 將下列 VBA 程式碼加入至程式碼檔案。這個程式碼會先取得 COMAddIn 物件,該物件代表 ExcelImportData 增益集。接著,程式碼會使用 COMAddIn 物件的 Object 屬性 (Property) 來呼叫 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。

後續步驟

您可以從下列主題進一步了解增益集的程式設計:

請參閱

工作

HOW TO:建立 Visual Studio Tools for Office 專案

概念

應用程式層級增益集程式設計

在應用程式層級增益集中呼叫其他 Office 方案的程式碼

開發 Office 方案

AddIn 主項目

使用擴充性介面自訂 UI 功能

應用程式層級增益集的架構