逐步解說:在應用程式層級增益集中呼叫 VBA 的程式碼
更新:2007 年 11 月
適用於 |
---|
本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。 專案類型
Microsoft Office 版本
如需詳細資訊,請參閱依應用程式和專案類型提供的功能。 |
本逐步解說示範如何將應用程式層級增益集 (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 方案的類別。
在 [專案] 功能表上按一下 [加入類別]。
在 [加入新項目] 對話方塊中,將新類別的名稱變更為 AddInUtilities,然後按一下 [加入]。
AddInUtilities.cs 或 AddInUtilities.vb 檔案隨即會在程式碼編輯器中開啟。
將下列陳述式加入至檔案的最上方。
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;
使用下列程式碼來取代空的 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 方案
展開 [方案總管] 中的 [ Excel]。
以滑鼠右鍵按一下 [ThisAddIn.cs] 或 [ThisAddIn.vb],然後按一下 [檢視程式碼]。
將下列程式碼加入至 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; }
按一下 [建置] 功能表上的 [建置方案]。
接著驗證方案建置無誤。
測試增益集
您可以從多種不同類型的 Office 方案呼叫 AddInUtilities 類別。在本逐步解說中,您會在 Excel 活頁簿中使用 VBA 程式碼。如需還也可以使用之其他 Office 方案類型的詳細資訊,請參閱在應用程式層級增益集中呼叫其他 Office 方案的程式碼。
若要測試增益集
請按 F5 執行您的專案。
在 Excel 中,將現用活頁簿儲存為 Excel 啟用巨集的活頁簿 (*.xlsm)。將它儲存在方便取用的位置,如桌面。
按一下 [功能區] 上的 [開發人員] 索引標籤。
注意事項: 如果 [開發人員] 索引標籤沒有顯示,您必須先使其顯示。如需詳細資訊,請參閱 HOW TO:在功能區顯示開發人員索引標籤。
在 [程式碼] 群組中,按一下 [Visual Basic]。
Visual Basic 編輯器隨即開啟。
按兩下 [專案] 視窗中的 [ThisWorkbook]。
ThisWorkbook 物件的程式碼檔隨即開啟。
將下列 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
按 F5。
驗證新的 Imported Data 工作表是否已加入至活頁簿。此外,驗證儲存格 A1 是否包含字串 Chan,以及儲存格 B1 是否包含字串 Gareth。
結束 Excel。
後續步驟
您可以從下列主題進一步了解增益集的程式設計:
使用 ThisAddIn 類別來自動化主應用程式並執行增益集專案中的其他工作。如需詳細資訊,請參閱應用程式層級增益集程式設計和AddIn 主項目。
在 2007 Microsoft Office system 的增益集中建立自訂工作窗格。如需詳細資訊,請參閱自訂工作窗格概觀和 HOW TO:在應用程式中加入自訂工作窗格。
在 2007 Microsoft Office system 的增益集中自訂功能區。如需詳細資訊,請參閱 功能區概觀和HOW TO:開始自訂功能區。
請參閱
工作
HOW TO:建立 Visual Studio Tools for Office 專案