程式檔層級自定義

當您使用文件層級自訂擴充 Microsoft Office Word 或 Microsoft Office Excel 時,可以執行下列工作:

  • 使用物件模型自動化應用程式。

  • 將控制項加入文件介面。

  • 從自訂組件呼叫文件中的 Visual Basic for Applications (VBA) 程式碼。

  • 從 VBA 呼叫自訂組件中的程式碼。

  • 在文件位於未安裝 Microsoft Office 的伺服器上時,管理文件的特定層面。

  • 自訂應用程式的使用者介面 (UI)。

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

    在文件層級專案中撰寫程式碼時,某些方面會與 Visual Studio 中其他類型的專案不同。 其中有許多差異的原因來自於將 Office 物件模型公開給 Managed 程式碼的方式。 如需詳細資訊,請參閱 在 Office 方案中撰寫程式代碼。

    如需檔層級自定義和您可以使用 Visual Studio 中的 Office 開發工具建立之其他類型的解決方案的一般資訊,請參閱 Office 方案開發概觀 (VSTO)。

在檔案層級專案中使用產生的類別

當您建立文件層級專案時,Visual Studio 會自動在專案中產生類別,供您開始撰寫程式碼。 Visual Studio 會針對 Word 和 Excel 產生不同的類別:

  • 在 Word 的文件層級專案中,類別預設名為 ThisDocument

  • Excel 的文件層級專案具有多個產生的類別:一個用於活頁簿本身,一個用於每個工作表。 根據預設,這些類別具有下列名稱:

    • ThisWorkbook

    • Sheet1

    • Sheet2

    • Sheet3

    產生的類別包含會在開啟或關閉文件時呼叫的事件處理常式。 若要在開啟文件時執行程式碼,請將程式碼加入 Startup 事件處理常式。 若要在文件關閉之際執行程式碼,請將程式碼加入 Shutdown 事件處理常式。 如需詳細資訊,請參閱 Office 專案中的事件。

瞭解所產生類別的設計

在以 .NET Framework 4 或 .NET Framework 4.5 為目標的專案中,Visual Studio Tools for Office 運行時間中的主專案類型是介面,因此產生的類別無法從它們衍生其實作。 相反地,產生的類別會改從下列基底類別衍生大部分的成員:

  • ThisDocument:衍生自 DocumentBase

  • ThisWorkbook:衍生自 WorkbookBase

  • Sheetn:衍生自 WorksheetBase

    這些基類會將所有呼叫重新導向至Visual StudioTools for Office運行時間中對應主專案介面的內部實作。 例如,如果您呼叫 Protect 類別的 ThisDocument 方法,類別會將 DocumentBase 這個呼叫重新導向至 Visual Studio Tools for Office 運行時間 中 介面的內部實作 Document

存取主應用程式的物件模型

若要存取主應用程式的物件模型,請使用專案中產生之類別的成員。 這些類別各自對應至 Excel 或 Word 物件模型中的一個物件,並且大多包含相同的屬性、方法和事件。 例如,Word 文件層級專案中 ThisDocument 類別與 Word 物件模型中的 Document 物件提供的成員大部分相同。

下列程式碼範例示範如何使用 Word 物件模型儲存屬於 Word 文件層級自訂一部分的文件。 這個範例適合從 ThisDocument 類別執行。

this.Save();

若要從 ThisDocument 類別外執行相同的動作,請使用 Globals 物件存取 ThisDocument 類別。 例如,如果您要在執行窗格 UI 中包含 [儲存] 按鈕,可以將這個程式碼加入執行窗格程式碼檔案。

Globals.ThisDocument.Save();

因為 ThisDocument 類別會從 Document 主項目取得大部分成員,所以這個程式碼中呼叫的 Save 方法實際上是 Save 主項目的 Document 方法。 這個方法對應至 Word 物件模型中 Save 物件的 Document 方法。

如需使用 Word 和 Excel 物件模型的詳細資訊,請參閱 Word 物件模型概觀Excel 物件模型概觀

如需對象的詳細資訊 Globals ,請參閱 Office 項目中物件的全域存取。

將控件新增至檔

若要自訂文件的 UI,您可以將 Windows Forms 控制項或 「主控制項」 (host control) 加入文件介面。 藉由結合不同組的控制項並撰寫程式碼,您可以將控制項繫結至資料、從使用者收集資訊,以及回應使用者動作。

主控制項是一種會擴充 Word 和 Excel 物件模型中某些物件的類別。 例如, ListObject 主控制項會提供 Excel 中 ListObject 的所有功能。 但是, ListObject 主控制項還多了一些事件和資料繫結功能。

如需詳細資訊,請參閱 Office 檔概觀上的主專案和主控件概觀Windows Forms 控制件。

結合 VBA和文件層級自定義

您可以在屬於文件層級自訂一部分的文件中使用 VBA 程式碼。 您可以從自訂組件呼叫文件中的 VBA 程式碼,也可以將專案設定為允許文件中的 VBA 程式碼呼叫自訂組件中的程式碼。

如需詳細資訊,請參閱 合併 VBA和檔層級自定義

管理伺服器上的檔

您可以在未安裝 Microsoft Office Word 或 Microsoft Office Excel 的伺服器上管理文件層級自訂的數個不同層面。 例如,您可以存取及修改文件之資料快取中的資料。 您也可以管理與文件相關聯的自訂組件。 例如,您可以用程式設計的方式從文件中移除組件,讓文件不再執行程式碼,或者用程式設計的方式將組件附加至文件。

如需詳細資訊,請參閱 使用 ServerDocument 類別管理伺服器上的檔。

自定義 Microsoft Office 應用程式 lications 的使用者介面

您可以使用文件層級自訂,透過下列方式自訂 Word 和 Excel 的 UI:

從文件層級自定義中的原生 Office 物件取得擴充物件

Office 事件的多數事件處理常式都會接收代表引發事件之活頁簿、工作表或文件的原生 Office 物件。 某些情況下,您可能只有在文件層級自訂的活頁簿或文件引發事件時,才想要執行一些程式碼。 例如,使用 Excel 的文件層級自訂時,您可能想要在使用者啟動自訂活頁簿內其中一個工作表時執行一些程式碼,但不要在使用者啟動某個恰巧同時開啟之其他活頁簿內的工作表時執行程式碼。

當您有原生 Office 物件時,可以測試該物件是否已擴充成為文件層級自訂中的 「主項目」 (host item) 或 「主控制項」 (host control)。 主專案和主控件是 Visual Studio Tools for Office 運行時間所提供的類型,會將功能新增至 Word 或 Excel 物件模型中原生存在的物件(稱為 原生 Office 物件)。 通常,主項目和主控制項也稱為 「擴充物件」(extended object)。 如需主專案和主控件的詳細資訊,請參閱 主專案和主控件概觀

瞭解 GetVstoObject 和 HasVstoObject 方法

若要測試原生 Office 物件,請在專案中使用 HasVstoObjectGetVstoObject 方法:

  • 如果您想要判斷自訂中是否有原生 Office 物件的擴充物件,請使用 HasVstoObject 方法。 如果原生 Office 物件具有擴充物件,這個方法會傳回 true 否則傳回 false

  • 如果您想要取得原生 Office 物件的擴充物件,請使用 GetVstoObject 方法。 如果指定的原生 Office 物件具有擴充物件,這個方法會傳回 ListObjectWorkbookWorksheetDocument 物件。 否則, GetVstoObject 會傳 回 null。 例如,如果指定的 Document 是 Word 文件專案中文件的基礎物件,則 GetVstoObject 方法會傳回 Document

    在檔案層級專案中,您無法使用 GetVstoObject 方法在運行時間建立新的 WorkbookWorksheetDocument 主專案。 您只能使用這個方法來存取在設計階段產生於專案中的現有主項目。 如果您想要在運行時間建立新的主專案,您必須開發 VSTO 載入宏專案。 如需詳細資訊,請參閱 以程序設計方式限制主專案和主控件 ,以及在 運行時間擴充 VSTO 載入宏中的 Word 檔和 Excel 活頁簿。

使用 GetVstoObject 和 HasVstoObject 方法

若要呼叫 HasVstoObjectGetVstoObject 方法,請使用 Globals.Factory.GetVstoObjectGlobals.Factory.HasVstoObject 方法,並傳入您要測試的原生 Word 或 Excel 物件(例如 DocumentWorksheet)。