共用方式為


在文件層級自訂中取得原生 Office 物件的擴充物件

更新: 2008 年 7 月

適用於

本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。

專案類型

  • 文件層級專案

Microsoft Office 版本

  • Excel 2007

  • Word 2007

如需詳細資訊,請參閱依應用程式和專案類型提供的功能

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

從 Visual Studio 2008 Service Pack 1 (SP1) 開始,當您取得原生 Office 物件時,您可以測試該物件是擴充成為文件層級自訂中的「主項目」(Host Item) 還是 Microsoft.Office.Tools.Excel.ListObject 主控制項。

主項目和主控制項是 Visual Studio Tools for Office 物件,這些物件可將功能加入至原本就存在於 Word 或 Excel 物件模型 (稱為「原生 Office 物件」(Native Office Object)) 的物件。主項目和主控制項也統稱為「擴充物件」(Extended Object)。如需主項目和主控制項的詳細資訊,請參閱主項目和主控制項概觀

使用 GetVstoObject 和 HasVstoObject 方法

若要測試原生 Office 物件,請使用下列其中一個原生 Office 物件之執行個體的 HasVstoObject 和 GetVstoObject 方法:

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

如果您想要取得擴充物件,請使用 GetVstoObject 方法。如果原生 Office 物件具有擴充物件,這個方法會傳回 Microsoft.Office.Tools.Excel.ListObjectMicrosoft.Office.Tools.Excel.WorkbookMicrosoft.Office.Tools.Excel.WorksheetMicrosoft.Office.Tools.Word.Document 物件。否則,GetVstoObject 會傳回 null。例如,如果 Microsoft.Office.Interop.Word.Document 是 Word 文件專案中之文件的基礎物件,Microsoft.Office.Interop.Word.Document 物件的 GetVstoObject 方法會傳回 Microsoft.Office.Tools.Word.Document

您無法在文件層級方案中使用 GetVstoObject,於執行階段建立新的主項目。您只能用它來存取在設計階段產生於專案中的現有主項目。如需詳細資訊,請參閱主項目和主控制項的程式設計限制

在應用程式層級專案中,您可以在執行階段使用 GetVstoObject 方法產生新的主項目。如需詳細資訊,請參閱在應用程式層級增益集的執行階段中擴充 Word 文件和 Excel 活頁簿

注意事項:

若要使用 GetVstoObject 和 HasVstoObject 方法,您必須將 Microsoft.Office.Tools.Excel.ExtensionsMicrosoft.Office.Tools.Word.Extensions 命名空間的 using (C#) 或 Imports (Visual Basic) 陳述式加入至程式碼檔的頂端。GetVstoObject 和 HasVstoObject 方法會實作成 Visual Studio Tools for Office runtime 中的「擴充方法」(Extension Method),而這些陳述式可以讓您呼叫這些方法。

判斷主項目是否已引發事件

下列程式碼範例示範 HasVstoObject 和 GetVstoObject 方法。這兩個範例都會在 Excel 活頁簿專案中處理 ThisWorkbook 類別的 SheetActivate 事件。

第一個範例會將 Sh 參數與每個預設主項目的 InnerObject 屬性進行比較,以判斷是否已啟動其中一個 Microsoft.Office.Tools.Excel.Worksheet 主項目。

Sub ThisWorkbook_SheetActivate1(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing

    If Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet1
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate1(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;

    if (Type.ReferenceEquals(Globals.Sheet1.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet1;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3;

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

下一個範例會使用 Sh 參數的 HasVstoObject 和 GetVstoObject 方法,簡化這個程序。

Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object) Handles Me.SheetActivate
    Dim vstoWorksheet As Microsoft.Office.Tools.Excel.Worksheet = Nothing
    Dim interopWorksheet As Microsoft.Office.Interop.Excel.Worksheet = _
        CType(Sh, Microsoft.Office.Interop.Excel.Worksheet)

    If interopWorksheet IsNot Nothing AndAlso _
        interopWorksheet.HasVstoObject() Then
        vstoWorksheet = interopWorksheet.GetVstoObject()
    End If

    If vstoWorksheet IsNot Nothing Then
        ' Do something with the VSTO worksheet here.
    End If
End Sub
void ThisWorkbook_SheetActivate2(object Sh)
{
    Microsoft.Office.Tools.Excel.Worksheet vstoWorksheet = null;
    Microsoft.Office.Interop.Excel.Worksheet interopWorksheet = 
        Sh as Microsoft.Office.Interop.Excel.Worksheet;

    if (interopWorksheet != null && interopWorksheet.HasVstoObject())
    {
        vstoWorksheet = interopWorksheet.GetVstoObject();
    }

    if (vstoWorksheet != null)
    {
        // Do something with the VSTO worksheet here.
    }
}

請參閱

概念

文件層級自訂程式設計

主項目和主控制項概觀

在應用程式層級增益集的執行階段中擴充 Word 文件和 Excel 活頁簿

擴充方法 (Visual Basic)

參考

擴充方法 (C# 程式設計手冊)

變更記錄

日期

記錄

原因

2008 年 7 月

加入主題。

SP1 功能變更。