共用方式為


操作指南:在 Visual C# 專案中使用 VBA 呼叫程式碼

本逐步解說示範如何從活頁簿中的 Visual Basic for Applications (VBA) 程式碼呼叫 Microsoft Office Excel 的文件層級自訂中的方法。 此程式涉及三個基本步驟:將方法新增至 Sheet1 主機專案類別,將方法公開給活頁簿中的 VBA 程式碼,然後從活頁簿中的 VBA 程式碼呼叫該方法。

適用於: 本主題中的資訊適用於 Excel 和 Word 的文件層級專案。 如需詳細資訊,請參閱 Office 應用程式和專案類型所提供的功能

雖然本逐步解說特別使用 Excel,但逐步解說所示範的概念也適用於 Word 的文件層級專案。

本逐步解說將說明下列工作:

  • 建立包含 VBA 程式碼的活頁簿。

  • 使用 Excel 中的信任中心來信任活頁簿的位置。

  • 將方法 Sheet1 新增至主機專案類別。

  • 擷取主機項目類別的 Sheet1 介面。

  • 將函式公開給 VBA 程式碼。

  • 從 VBA 代碼調用該方法。

備註

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

先決條件

您需要下列組件才能完成本步驟解說:

建立包含 VBA 程式碼的活頁簿

第一步是建立一個啟用巨集的工作簿,其中包含一個簡單的 Visual Basic for Applications (VBA) 巨集。 在將自訂中的程式碼公開給 VBA 之前,活頁簿必須已經包含 VBA 程式碼。 否則,Visual Studio 無法修改 VBA 專案,以讓 VBA 程式碼呼叫自定義元件。

如果您已經有一個包含要使用的 VBA 代碼的工作簿,您可以略過此步驟。

建立包含 VBA 程式碼的活頁簿

  1. 啟動 Excel。

  2. 將使用中的文件儲存為 Excel Macro-Enabled 活頁簿 (*.xlsm),名為 WorkbookWithVBA。 將其儲存到方便的位置,例如桌面。

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

    備註

    如果「 開發人員」 標籤不可見,您必須先顯示它。 如需詳細資訊,請參閱 如何:在功能區上顯示開發人員索引標籤

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

    Visual Basic 編輯器隨即開啟。

  5. 專案 視窗中,按兩下 此活頁簿

    物件的 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. 按一下 [確定]

    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 信任的位置 ] 對話方塊中,按一下 [ 確定]。

  11. [信任中心] 對話方塊中,按一下 [ 確定]。

  12. [Excel 選項] 對話方塊中,按一下 [確定]。

  13. 結束 Excel

將方法新增至 Sheet1 類別

現在已設定 VBA 專案,請將一個公用方法新增至 Sheet1 主機項目類別,以便可以從 VBA 程式碼中呼叫它。

將方法新增至 Sheet1 類別

  1. [方案總管] 中,以滑鼠右鍵按一下 Sheet1.cs,然後按一下 [ 檢視程式碼]。

    Sheet1.cs檔案會在程式碼編輯器中開啟。

  2. 將下列程式碼 Sheet1 新增至類別。 此方法會在 CreateVstoNamedRange 指定的範圍內建立新 NamedRange 物件。 這個方法也會為NamedRangeSelected事件建立事件處理常式。 在本逐步解說的稍後部分,您將從檔案的 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. 按一下 [確定]

    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 檔案會在設計工具中開啟,並顯示 Sheet1。

  2. [屬性] 視窗中,選取 ReferenceAssemblyFromVbaProject 屬性,並將值變更為 True

  3. 在顯示的訊息中按一下 確定

  4. 建置專案。

從VBA代碼調用該方法

您現在可以從工作簿中的VBA代碼調用該 CreateVstoNamedRange 方法。

備註

在本逐步解說中,您會在偵錯專案時將 VBA 程式碼新增至活頁簿。 您新增至此檔的 VBA 程式碼將會在您下次建置專案時覆寫,因為 Visual Studio 會將建置輸出資料夾中的檔取代為主要專案資料夾中的檔複本。 如果要保存VBA代碼,可以將其複製到項目文件夾中的文檔中。 如需詳細資訊,請參閱結合 VBA 和文件層級自訂。

從 VBA 程式碼呼叫方法的步驟

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

  2. [開發人員] 索引標籤的 [ 程式碼 ] 群組中,按一下 [Visual Basic]。

    Visual Basic 編輯器隨即開啟。

  3. 「插入」功能表上,按一下「模組」。

  4. 將下列程式碼新增至新模組。

    此程式碼會呼叫 CreateTable 自訂元件中的方法。 巨集會使用全域 GetManagedClass 方法來存取您公開給 VBA 程式碼的 Sheet1 主機項目類別的方法。 GetManagedClass此方法在您稍早於本指南中設定 ReferenceAssemblyFromVbaProject 屬性時被自動生成。

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

  6. 在開啟的活頁簿中,按一下 Sheet1 上的儲存格 A1。 確認訊息方塊出現。

  7. 結束 Excel,且不儲存變更。

後續步驟

您可以在下列主題中深入瞭解如何從 VBA 呼叫 Office 解決方案中的程式碼: