HOW TO:公開程式碼給 Visual C# 專案中的 VBA

如果您想讓 Visual C# 專案中的程式碼和 Visual Basic for Applications (VBA) 程式碼彼此互動,可以將 Visual C# 專案中的程式碼公開 (Expose) 給 Visual Basic for Applications (VBA) 程式碼。

Visual C# 程序與 Visual Basic 程序不同。 如需詳細資訊,請參閱在文件層級自訂中呼叫 VBA 的程式碼HOW TO:公開程式碼給 Visual Basic 專案中的 VBA

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

公開 Visual C# 專案中的程式碼

若要讓 VBA 程式碼呼叫 Visual C# 專案中的程式碼,請修改程式碼,讓 COM 可以看到該程式碼,然後在設計工具中將 [ReferenceAssemblyFromVbaProject] 屬性設定為 [True]。

如需示範如何從 VBA 呼叫 Visual C# 專案中之方法的逐步解說,請參閱逐步解說:在 Visual C# 專案中呼叫 VBA 的程式碼

若要將 Visual C# 專案中的程式碼公開給 VBA

  1. 開啟或建立以支援巨集的 Word 文件、Excel 活頁簿或 Excel 範本為基礎,而且已包含 VBA 程式碼的文件層級專案。

    如需支援巨集的文件檔案格式之詳細資訊,請參閱在文件層級自訂中呼叫 VBA 的程式碼

    注意事項注意事項

    這項功能不適用於 Word 範本專案。

  2. 確定文件中的 VBA 程式碼可以執行,而不需提示使用者啟用巨集。 您可以將 Office 專案的位置加入至 Word 或 Excel 之 [信任中心] 設定中的信任位置清單,藉以信任要執行的 VBA 程式碼。

  3. 將想要公開給 VBA 的成員加入至專案的公用 (Public) 類別,並將新成員宣告為 public。

  4. 將下列 ComVisibleAttributeClassInterfaceAttribute 屬性套用至要公開給 VBA 的類別。 這些屬性可以讓 COM 看到這個類別,但是不會產生類別介面。

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    
  5. 覆寫專案中主項目類別的 GetAutomationObject 方法,以傳回要公開給 VBA 的類別執行個體 (Instance):

    • 如果要將主項目類別公開給 VBA,請覆寫屬於這個類別的 GetAutomationObject 方法,並傳回類別的目前執行個體。

      protected override object GetAutomationObject()
      {
          return this;
      }
      
    • 如果要將不是主項目的類別公開給 VBA,請覆寫專案中任何主項目的 GetAutomationObject 方法,並傳回非主項目類別的執行個體。 例如,下列程式碼假設您要將名為 DocumentUtilities 的類別公開給 VBA。

      protected override object GetAutomationObject()
      {
          return new DocumentUtilities();
      }
      

    如需主項目的詳細資訊,請參閱主項目和主控制項概觀

  6. 從要公開給 VBA 的類別中擷取介面。 在 [擷取介面] 對話方塊中,選取想要併入介面宣告中的公用成員。 如需詳細資訊,請參閱 擷取介面重構 (C#)

  7. 將 public 關鍵字加入至介面宣告。

  8. 將下列 ComVisibleAttribute 屬性加入至介面,讓 COM 可以看到介面。

    [System.Runtime.InteropServices.ComVisible(true)]
    
  9. 在 Visual Studio 的設計工具中,開啟文件 (Word) 或工作表 (Excel)。

  10. 在 [屬性] 視窗中,選取 [ReferenceAssemblyFromVbaProject] 屬性,然後將值變更為 [True]。

    注意事項注意事項

    如果活頁簿或文件尚未包含 VBA 程式碼,或文件中的 VBA 程式碼未受到信任無法執行,則您會在將 [ReferenceAssemblyFromVbaProject] 屬性設定為 [True] 時收到錯誤訊息。 這是因為在這個情況下,Visual Studio 無法修改文件中的 VBA 專案。

  11. 按一下訊息中顯示的 [確定]。 這則訊息是要提醒您,如果從 Visual Studio 執行專案時將 VBA 程式碼加入至活頁簿或文件,則 VBA 程式碼會在下次建置 (Build) 專案時遺失。 這是因為每次建置專案時都會覆寫建置輸出資料夾中的文件。

    此時,Visual Studio 會設定專案,讓 VBA 專案可以呼叫組件。 Visual Studio 也會將名為 GetManagedClass 的方法加入至 VBA 專案。 您可以從 VBA 專案的任何位置呼叫這個方法,以存取公開給 VBA 的類別。 如需詳細資訊,請參閱在文件層級自訂中呼叫 VBA 的程式碼

  12. 建置專案。

請參閱

工作

HOW TO:在 Visual Studio 中建立 Office 專案

逐步解說:在 Visual C# 專案中呼叫 VBA 的程式碼

HOW TO:公開程式碼給 Visual Basic 專案中的 VBA

概念

在文件層級自訂中呼叫 VBA 的程式碼

其他資源

設計和建立 Office 方案

合併 VBA 和文件層級自訂