共用方式為


程式文件層級自訂

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

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

  • 將控制項新增至文件表面。

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

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

  • 當文件位於未安裝 Microsoft Office 的伺服器上時,管理文件的某些層面。

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

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

    在文件層級專案中撰寫程式碼的某些層面與 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

  • Sheet n:源自 WorksheetBase

    這些基類會將對其成員的所有呼叫重新導向至 Visual Studio Tools for Office 執行階段中對應主機專案介面的內部實作。 例如,如果您呼叫 Protect 類別的方法 ThisDocument,那麼 DocumentBase 類別會在 Visual Studio Tools for Office 執行階段中,將這個呼叫重新導向至 Document 介面的內部實作。

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

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

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

this.Save();

若要在 ThisDocument 類別外執行相同操作,請使用 Globals 物件來存取 ThisDocument 類別。 例如,如果您想要在動作窗格 UI 中包含 [儲存] 按鈕,您可以將此程式碼新增至動作窗格程式碼檔案。

Globals.ThisDocument.Save();

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

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

如需物件的詳細資訊 Globals ,請參閱 Office 專案中物件的全域存取

將控制項新增至文件

若要自訂文件的 UI,您可以將 Windows Forms 控制項或 主機控制項 新增至文件介面。 透過結合不同的控制項集並撰寫程式碼,您可以將控制項繫結至資料、從使用者收集資訊,以及回應使用者動作。

主機控制項是擴充 Word 和 Excel 物件模型中某些物件的類別。 例如,ListObject 主機控制項提供與 ListObject 在 Excel 中的所有功能。 不過, ListObject 主機控制項也有其他事件和資料繫結功能。

如需詳細資訊,請參閱 主機項目和主機控制項概觀Office 文件上的 Windows 表單控制項概觀

結合 VBA 和文件層級自訂

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

如需詳細資訊,請參閱結合 VBA 和文件層級自訂。

管理伺服器上的文件

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

如需相關資訊,請參閱 使用 ServerDocument 類別管理伺服器上的文件

自訂 Microsoft Office 應用程式的使用者介面

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

在文件層級自訂功能中,從原生 Office 物件取得擴充物件

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

當您有原生 Office 物件時,您可以測試該物件是否已延伸至文件層級自訂中的 主機項目主機控制項 。 主機專案和主機控制項是 Visual Studio Tools for Office 執行階段所提供的類型,可將功能新增至 Word 或 Excel 物件模型中原生存在的物件 (稱為 原生 Office 物件) 。 主機項目和主機控制項統稱為 擴充物件。 如需主機項目和主機控制項的詳細資訊,請參閱 主機項目和主機控制項概觀

瞭解 GetVstoObject 和 HasVstoObject 方法

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

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

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

    在文件層級專案中,您無法使用該 GetVstoObject 方法在執行時期建立新的 WorkbookWorksheetDocument 主項目。 您只能使用此方法來存取在設計階段在專案中產生的現有主機項目。 如果您想要在執行時間建立新的主機項目,則必須開發 VSTO 外掛程式專案。 如需詳細資訊,請參閱 主機項目和主機控制項的程式設計限制 ,以及在 執行階段在 VSTO 增益集中擴充 Word 文件和 Excel 活頁簿

使用 GetVstoObject 和 HasVstoObject 方法

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