Freigeben über


Abrufen von erweiterten Objekten aus systemeigenen Office-Objekten in Anpassungen auf Dokumentebene

Viele Ereignishandler für Office-Ereignisse empfangen ein systemeigenes Office-Objekt, das die Arbeitsmappe, das Arbeitsblatt oder das Dokument darstellt, durch die/das das Ereignis ausgelöst wurde. In bestimmten Fällen möchten Sie eventuell Code nur dann ausführen, wenn das Ereignis durch die Arbeitsmappe oder das Dokument in der Anpassung auf Dokumentebene ausgelöst wurde. In einer Anpassung auf Dokumentebene für Excel können Sie z. B. Code ausführen, wenn der Benutzer eines der Arbeitsblätter in der angepassten Arbeitsmappe aktiviert, jedoch nicht, wenn er ein Arbeitsblatt in einer anderen Arbeitsmappe aktiviert, die zufällig zur gleichen Zeit geöffnet ist.

Wenn Sie über ein systemeigenes Office-Objekt verfügen, können Sie testen, ob das betreffende Objekt in einer Anpassung auf Dokumentebene zu einem Hostelement oder Hoststeuerelement erweitert wurde. Hostelemente und Hoststeuerelemente sind Typen, die von der Visual Studio Tools for Office-Laufzeit bereitgestellt werden, die Objekten Funktionalität hinzufügen, die systemeigen im Word- oder Excel-Objektmodell vorhanden sind (diese werden als systemeigene Office-Objekte bezeichnet). Hostelemente und Hoststeuerelemente werden zusammen auch als erweiterte Objekte bezeichnet. Weitere Informationen zu Hostelementen und Hoststeuerelementen finden Sie unter Übersicht über Hostelemente und Hoststeuerelemente.

Betrifft: Die Informationen in diesem Thema betreffen Projekte auf Dokumentebene für die folgenden Anwendungen: Excel 2007 und Excel 2010, Word 2007 und Word 2010. Weitere Informationen finden Sie unter Verfügbare Funktionen nach Office-Anwendung und Projekttyp.

Grundlegendes zu GetVstoObject- und HasVstoObject-Methoden

Um ein systemeigenes Office-Objekt zu testen, verwenden Sie die HasVstoObject- und die GetVstoObject-Methoden im Projekt.

In Projekten auf Dokumentebene kann die GetVstoObject-Methode nicht verwendet werden, um zur Laufzeit ein neues Microsoft.Office.Tools.Excel.Workbook-, Microsoft.Office.Tools.Excel.Worksheet- oder Microsoft.Office.Tools.Word.Document-Hostelement zu erstellen. Sie können diese Methode nur für den Zugriff auf vorhandene Hostelemente verwenden, die zur Entwurfszeit im Projekt generiert werden. Wenn Sie neue Hostelemente zur Laufzeit erstellen möchten, müssen Sie ein Projekt auf Anwendungsebene entwickeln. Weitere Informationen finden Sie unter Programmgesteuerte Einschränkungen von Hostelementen und Hoststeuerelementen und Erweitern von Word-Dokumenten und Excel-Arbeitsmappen in Add-Ins auf Anwendungsebene zur Laufzeit.

Verwenden der GetVstoObject-Methode und der HasVstoObject-Methode

Die Art und Weise, wie die HasVstoObject- und GetVstoObject-Methoden aufgerufen wird, hängt davon ab, welche .NET Framework-Version als Zielversion des Projekts festgelegt ist:

Tipp

Um die GetVstoObject-Methode und die HasVstoObject-Methode in Projekten auf Dokumentebene zu verwenden, die auf .NET Framework 3.5 abzielen, müssen Sie eine using-Anweisung (bei C#) bzw. eine Imports-Anweisung (bei Visual Basic) für den Microsoft.Office.Tools.Excel.Extensions-Namespace oder den Microsoft.Office.Tools.Word.Extensions-Namespace am Anfang der Codedatei hinzufügen. Die GetVstoObject-Methode und die HasVstoObject-Methode werden als Erweiterungsmethoden implementiert, sodass Sie diese Methoden mit diesen Anweisungen aufrufen können.

Beispiel: Feststellen, ob ein Hostelement ein Ereignis ausgelöst hat

In den folgenden Codebeispielen werden die HasVstoObject-Methode und die GetVstoObject-Methode veranschaulicht. In beiden Beispielen wird das SheetActivate-Ereignis der ThisWorkbook-Klasse in einem Excel-Arbeitsmappenprojekt behandelt. Im ersten Beispiel wird festgestellt, ob eines der Microsoft.Office.Tools.Excel.Worksheet-Hostelemente aktiviert wurde. Dazu wird der Sh-Parameter mit der InnerObject-Eigenschaft jedes Standardhostelements verglichen.

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.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet2.Base
    ElseIf Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh) Then
        vstoWorksheet = Globals.Sheet3.Base
    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.Base;
    else if (Type.ReferenceEquals(Globals.Sheet2.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet2.Base;
    else if (Type.ReferenceEquals(Globals.Sheet3.InnerObject, Sh))
        vstoWorksheet = Globals.Sheet3.Base;

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

Im nächsten Beispiel wird dieser Prozess mithilfe der HasVstoObject-Methode und der GetVstoObject-Methode des Sh-Parameters vereinfacht. In diesem Beispiel wird veranschaulicht, wie diese Methoden in einem Projekt, das auf .NET Framework 4 ausgerichtet ist, aufgerufen werden.

Private Sub ThisWorkbook_SheetActivate2(ByVal Sh As Object)
    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
        Globals.Factory.HasVstoObject(interopWorksheet) Then
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet)
    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 && Globals.Factory.HasVstoObject(interopWorksheet))
    {
        vstoWorksheet = Globals.Factory.GetVstoObject(interopWorksheet);
    }

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

Im folgenden Beispiel wird die gleiche Aufgabe in einem Projekt dargestellt, das auf .NET Framework 3.5 ausgerichtet ist.

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.
    }
}

Siehe auch

Referenz

Erweiterungsmethoden (C#-Programmierhandbuch)

Konzepte

Übersicht über Hostelemente und Hoststeuerelemente

Erweitern von Word-Dokumenten und Excel-Arbeitsmappen in Add-Ins auf Anwendungsebene zur Laufzeit

Erweiterungsmethoden (Visual Basic)

Weitere Ressourcen

Programmieren von Anpassungen auf Dokumentebene