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.
Wenn Sie feststellen möchten, ob das systemeigene Office-Objekt in Ihrer Anpassung über ein erweitertes Objekt verfügt, verwenden Sie die HasVstoObject-Methode. Diese Methode gibt true zurück, wenn das systemeigene Office-Objekt über ein erweitertes Objekt verfügt, andernfalls gibt sie false zurück.
Wenn Sie das erweiterte Objekt für ein systemeigenes Office-Objekt abrufen möchten, verwenden Sie die GetVstoObject-Methode. Diese Methode gibt ein Microsoft.Office.Tools.Excel.ListObject-, Microsoft.Office.Tools.Excel.Workbook-, Microsoft.Office.Tools.Excel.Worksheet- oder Microsoft.Office.Tools.Word.Document-Objekt zurück, wenn das angegebene systemeigene Office-Objekt über ein solches Objekt verfügt. Andernfalls gibt GetVstoObject null zurück. Die GetVstoObject-Methode gibt z. B. ein Microsoft.Office.Tools.Word.Document zurück, wenn das angegebene Microsoft.Office.Interop.Word.Document das zugrunde liegende Objekt für das Dokument in Ihrem Word-Dokumentprojekt ist.
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:
Verwenden Sie in Projekten, die auf .NET Framework 4 ausgerichtet sind, die Methode Globals.Factory.GetVstoObject oder Globals.Factory.HasVstoObject, und übergeben Sie das systemeigene Word-Objekt oder Excel-Objekt (z. B. Microsoft.Office.Interop.Word.Document oder Microsoft.Office.Interop.Excel.Worksheet), das Sie testen möchten.
In Projekten, die auf .NET Framework 3.5 ausgerichtet sind, greifen Sie auf die Methoden über eine Instanz eines der folgenden Typen in den primären Interopassemblys von Excel und Word zu:
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)