逐步解說:在 Visual C# 專案中呼叫 VBA 的程式碼
本逐步解說示範如何從活頁簿中的 Visual Basic for Applications (VBA) 程式碼,呼叫 Microsoft Office Excel 文件層級自訂中的方法。 這個程序牽涉三個基本步驟:將方法加入至 Sheet1 主項目類別、將方法公開至活頁簿中的 VBA 程式碼,然後從活頁簿中的 VBA 程式碼呼叫此方法。
**適用於:**本主題中的資訊適用於下列應用程式的文件層級專案:Excel 2007 和 Excel 2010、Word 2007 和 Word 2010。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
雖然這個逐步解說特地使用 Excel,但本逐步解說所示範的概念同樣適用於 Word 的文件層級專案。
這個逐步解說將說明下列工作:
建立含有 VBA 程式碼的活頁簿。
使用 Excel 的信任中心來信任活頁簿的位置。
將方法加入至 Sheet1 主項目類別。
擷取 Sheet1 主項目類別的介面。
將方法公開至 VBA 程式碼。
從 VBA 程式碼呼叫方法。
注意事項 |
---|
在下列指示的某些 Visual Studio 使用者介面項目中,您的電腦可能會顯示不同的名稱或位置: 您所擁有的 Visual Studio 版本和使用的設定決定了這些項目。 如需詳細資訊,請參閱 使用設定。 |
必要條件
您需要下列元件才能完成此逐步解說:
-
包含 Microsoft Office 開發者工具的 Visual Studio 2010 版本。 如需詳細資訊,請參閱[設定電腦以開發 Office 方案](bb398242\(v=vs.100\).md)。
- Excel 2007 或 Excel 2010。
建立含有 VBA 程式碼的活頁簿
第一個步驟是建立已啟用巨集的活頁簿,該活頁簿包含簡單 VBA 巨集。 活頁簿必須已含有 VBA 程式碼,您才能將自訂中的程式碼公開至 VBA。 否則,Visual Studio 無法修改 VBA 專案,讓 VBA 程式碼能夠呼叫自訂組件。
如果您已經有包含想使用之 VBA 程式碼的活頁簿,則可略過這個步驟。
若要建立含有 VBA 程式碼的活頁簿
啟動 Excel。
使用 WorkbookWithVBA 這個名稱,將現用文件儲存為 [Excel 啟用巨集的活頁簿 (*.xlsm)]。 將它儲存至方便取用的位置,例如桌面。
按一下 [功能區] 上的 [開發人員] 索引標籤。
注意事項 如果 [開發人員] 索引標籤沒有顯示,您必須先使其顯示。 如需詳細資訊,請參閱 HOW TO:在功能區顯示開發人員索引標籤。
在 [程式碼] 群組中,按一下 [Visual Basic]。
Visual Basic 編輯器隨即開啟。
按兩下 [專案] 視窗中的 [ThisWorkbook]。
ThisWorkbook 物件的程式碼檔隨即開啟。
將下列 VBA 程式碼加入至程式碼檔案。 此程式碼會定義毫無作用的簡單函式。 這個函式的唯一目的在於確保 VBA 專案存在於活頁簿中。 本逐步解說中的後續步驟需要用到此函式。
Sub EmptySub() End Sub
儲存文件並結束 Excel。
建立專案
您現在即可建立 Excel 的文件層級專案,而該專案會使用您先前建立且已啟用巨集的活頁簿。
若要建立新的專案
啟動 Visual Studio。
在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。
在範本窗格中,依序展開 [Visual C#] 和 [Office]。
選取 [2010] 或 [2007] 節點。
在專案範本的清單中,選取 [Excel 活頁簿] 專案。
在 [名稱] 方塊中,輸入 CallingCodeFromVBA。
按一下 [確定]。
[Visual Studio Tools for Office 專案精靈] 便會開啟。
選取 [複製現有文件],然後在 [現有文件的完整路徑] 方塊中,指定您先前建立之 WorkbookWithVBA 活頁簿的位置。 如果您是使用自己已啟用巨集的活頁簿,則改為指定該活頁簿的位置。
按一下 [完成]。
Visual Studio 會在設計工具中開啟 WorkbookWithVBA 活頁簿,並將 [CallingCodeFromVBA] 專案加入至 [方案總管]。
信任活頁簿的位置
您必須先信任活頁簿中要執行的 VBA,才能將方案中的程式碼公開至活頁簿中的 VBA 程式碼。 有幾個方式可做到這點。 在本逐步解說中,您會藉由在 Excel 的 [信任中心] 中信任活頁簿的位置來完成這項工作。
若要信任活頁簿的位置
啟動 Excel。
按一下 [檔案] 索引標籤 (適用於 Excel 2010) 或 [Microsoft Office 按鈕] (適用於 Excel 2007)。
按一下 [Excel 選項] 按鈕。
在分類窗格中,按一下 [信任中心]。
在詳細資料窗格中,按一下 [信任中心設定]。
在分類窗格中,按一下 [信任位置]。
在詳細資料窗格中,按一下 [新增位置]。
在 [Microsoft Office 信任位置] 對話方塊中,瀏覽至包含 CallingCodeFromVBA 專案的資料夾。
選取 [此位置的子資料夾也受信任]。
按一下 [Microsoft Office 信任位置] 對話方塊中的 [確定]。
按一下 [信任中心] 對話方塊中的 [確定]。
按一下 [Excel 選項] 對話方塊中的 [確定]。
結束 [Excel]。
將方法加入至 Sheet1 類別
目前已設定 VBA 專案,將公用方法加入至您可以從 VBA 程式碼呼叫的 Sheet1 主項目類別。
若要將方法加入至 Sheet1 類別
在 [方案總管] 中,以滑鼠右鍵按一下 [Sheet1.cs],然後按一下 [檢視程式碼]。
Sheet1.cs 檔案隨即會在程式碼編輯器中開啟。
將下列程式碼加入至 Sheet1 類別。 CreateVstoNamedRange 方法會建立位於指定範圍的新 NamedRange 物件。 這個方法還會建立 NamedRange 之 Selected 事件的事件處理常式。 稍後在本逐步解說中,您會從文件中的 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."); }
將下列方法加入至 Sheet1 類別。 這個方法會覆寫 GetAutomationObject() 方法,以傳回 Sheet1 類別的目前執行個體。
protected override object GetAutomationObject() { return this; }
將下列屬性套用於 Sheet1 類別宣告的第一行之前。 這些屬性可以讓 COM 看到類別,但是不會產生類別介面。
[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
擷取 Sheet1 類別的介面
您必須先建立用以定義此方法的公用介面,且必須將此介面公開至 COM,才能將 CreateVstoNamedRange 方法公開至 VBA 程式碼。
若要擷取 Sheet1 類別的介面
在 Sheet1.cs 程式碼檔中,按一下 Sheet1 類別中的任意處。
按一下 [重構] 功能表上的 [擷取介面]。
在 [擷取介面] 對話方塊的 [選取 Public 成員以形成介面] 方塊中,按一下 CreateVstoNamedRange 方法的項目。
按一下 [確定]。
Visual Studio 會產生名稱為 ISheet1 的新介面,而且會修改 Sheet1 類別的定義,以便實作 ISheet1 介面。 Visual Studio 也會在 [程式碼編輯器] 中開啟 ISheet1.cs 檔案。
在 ISheet1.cs 檔中,請以下列程式碼取代 ISheet1 介面宣告。 此程式碼會使 ISheet1 介面變成公用,並套用 ComVisibleAttribute 屬性,而讓 COM 看得見介面。
[System.Runtime.InteropServices.ComVisible(true)] public interface ISheet1 { void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name); }
建置專案。
將方法公開至 VBA 程式碼
若要將 CreateVstoNamedRange 方法公開至活頁簿中的 VBA 程式碼,請將 Sheet1 主項目的 [ReferenceAssemblyFromVbaProject] 屬性設定為 [True]。
若要將方法公開至 VBA 程式碼
按兩下 [方案總管] 中的 Sheet1.cs。
WorkbookWithVBA 檔隨即在設計工具中開啟,並顯示 Sheet1。
在 [屬性] 視窗中,選取 [ReferenceAssemblyFromVbaProject] 屬性,然後將值變更為 [True]。
按一下訊息中顯示的 [確定]。
建置專案。
從 VBA 程式碼呼叫方法
您現在可以從活頁簿中的 VBA 程式碼呼叫 CreateVstoNamedRange 方法。
注意事項 |
---|
在這個逐步解說中,您會在偵錯專案時將 VBA 程式碼加入至活頁簿。 加入至此文件的 VBA 程式碼會在下一次建置專案時被覆寫,因為 Visual Studio 會使用主要專案資料夾中的文件複本來取代建置輸出資料夾中的文件。 如果您要儲存 VBA 程式碼,可以將它複製到專案資料夾的文件中。 如需詳細資訊,請參閱在文件層級自訂中呼叫 VBA 的程式碼。 |
若要從 VBA 程式碼呼叫方法
請按 F5 執行您的專案。
在 [開發人員] 索引標籤上的 [程式碼] 群組中,按一下 [Visual Basic]。
Visual Basic 編輯器隨即開啟。
按一下 [插入] 功能表上的 [模組]。
將下列程式碼加入至新模組。
這段程式碼會呼叫自訂組件中的 CreateTable 方法。 巨集會使用全域 GetManagedClass 方法來存取此方法,以存取您公開至 VBA 程式碼的 Sheet1 主項目類別。 當您稍早在本逐步解說中設定 [ReferenceAssemblyFromVbaProject] 屬性時,便已自動產生 GetManagedClass 方法。
Sub CallVSTOMethod() Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1 Set VSTOSheet1 = GetManagedClass(Sheet1) Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange") End Sub
按 F5。
在開啟的活頁簿中,按一下 [Sheet1] 上的儲存格 [A1]。 確認訊息方塊是否出現。
結束 Excel 但不儲存變更。
後續步驟
您可以在這些主題中,進一步了解如何從 VBA 呼叫 Office 方案中的程式碼:
從 VBA 呼叫 Visual Basic 自訂之主項目中的程式碼。 此處理序與 Visual C# 處理序不同。 如需詳細資訊,請參閱逐步解說:在 Visual Basic 專案中呼叫 VBA 的程式碼。
從 VBA 呼叫應用程式層級增益集中的程式碼。 如需詳細資訊,請參閱逐步解說:在應用程式層級增益集中呼叫 VBA 的程式碼。
請參閱
工作
HOW TO:公開程式碼給 Visual Basic 專案中的 VBA
HOW TO:公開程式碼給 Visual C# 專案中的 VBA
逐步解說:在 Visual Basic 專案中呼叫 VBA 的程式碼