Kombinieren von VBA- und Dokumentebenenanpassungen

Sie können VBA-Code (Visual Basic for Applications) in einem Dokument verwenden, das Teil einer Dokumentebenenanpassung für Microsoft Office Word oder Microsoft Office Excel ist. Sie können VBA-Code im Dokument über die Anpassungsassembly aufrufen, oder Sie können für Ihr Projekt die Aktivierung des VBA-Codes im Dokument konfigurieren, um Code in der Anpassungsassembly aufzurufen.

Gilt für: Die Informationen in diesem Thema gelten für Projekte auf Dokumentebene für Excel und Word. Weitere Informationen finden Sie unter features available by Office-App lication and project type.

Verhalten von VBA-Code in einer Anpassung auf Dokumentebene

Wenn Sie Ihr Projekt in Visual Studio öffnen, wird das Dokument im Entwurfsmodus geöffnet. Der VBA-Code wird nicht ausgeführt, wenn sich das Dokument im Entwurfsmodus befindet, damit Sie am Dokument und Code arbeiten können, ohne den VBA-Code auszuführen.

Beim Ausführen der Projektmappe wählen Ereignishandler in VBA und in der Anpassungsassembly Ereignisse aus, die im Dokument ausgelöst werden, und beide Codesätze werden ausgeführt. Sie können nicht im Voraus bestimmen, welcher Code zuerst ausgeführt wird. Sie müssen dies durch Tests in jedem Einzelfall ermitteln. Es können unerwartete Ergebnisse auftreten, wenn zwei Codesätze nicht sorgfältig koordiniert und getestet werden.

Aufrufen von VBA-Code aus der Anpassungsassembly

Sie können Makros in Word-Dokumenten aufrufen, und Sie können Makros und Funktionen in Excel-Arbeitsmappen aufrufen. Verwenden Sie hierzu eine der folgenden Methoden:

  • Rufen Sie für Word die Run Methode der Application Klasse auf.

  • Rufen Sie für Excel die Run -Methode der Application -Klasse auf.

    Bei jeder Methode wird mit dem ersten Parameter der Name des Makros oder der Funktion identifiziert, das bzw. die Sie aufrufen möchten, und mit den restlichen optionalen Parametern werden die Parameter angegeben, die an das Makro oder die Funktion übergeben werden. Der erste Parameter kann für Word und Excel verschiedene Formate haben:

  • Für Word ist der erste Parameter eine Zeichenfolge, bei der es sich um eine Kombination aus Vorlage, Modul und Makroname handeln kann. Wenn Sie den Dokumentnamen angeben, kann Ihr Code nur Makros in Dokumenten ausführen, die sich auf den aktuellen Kontext beziehen – kein beliebiges Makro in einem beliebigen Dokument.

  • Für Excel kann der erste Parameter eine Zeichenfolge sein, mit dem der Makroname, ein Range -Element zum Angeben der Funktion oder eine registrierte ID für eine registrierte DLL-Funktion (XLL) angegeben wird. Wenn Sie eine Zeichenfolge übergeben, wird die Zeichenfolge im Kontext des aktiven Blatts ausgewertet.

    Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein Makro mit dem Namen MyMacro aus einem Projekt auf Dokumentebene für Excel aufrufen. In diesem Beispiel wird vorausgesetzt, dass MyMacro in Sheet1definiert ist.

Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing);

Hinweis

Informationen zur Verwendung der globalen missing Variable anstelle optionaler Parameter in Visual C# finden Sie unter Schreiben von Code in Office-Lösungen.

Aufrufen von Code in Anpassungen auf Dokumentebene aus VBA

Sie können ein Projekt auf Dokumentebene für Word oder Excel konfigurieren, damit VBA-Code (Visual Basic for Applications) im Dokument Code in der Anpassungsassembly aufrufen kann. Dies ist in den folgenden Szenarien nützlich:

  • Sie möchten vorhandenen VBA-Code in einem Dokument erweitern, indem Sie Features in einer Anpassung auf Dokumentebene verwenden, die demselben Dokument zugeordnet ist.

  • Sie möchten Dienste, die Sie in einer Anpassung auf Dokumentebene entwickeln, für Endbenutzer verfügbar machen. Die Endbenutzer können auf die Dienste zugreifen, indem im Dokument VBA-Code geschrieben wird.

    Die Office-Entwicklungstools in Visual Studio bieten ein ähnliches Feature für VSTO-Add-Ins. Wenn Sie ein VSTO-Add-In entwickeln, können Sie Code in Ihrem VSTO-Add-In aus anderen Microsoft Office-Lösungen aufrufen. Weitere Informationen finden Sie unter Anrufcode in VSTO-Add-Ins aus anderen Office-Lösungen.

Hinweis

Diese Funktion kann in Word-Vorlagenprojekten nicht verwendet werden. Sie kann nur in Word-Dokument-, Excel-Arbeitsmappen- oder Excel-Vorlagenprojekten verwendet werden.

Anforderungen

Bevor Sie VBA-Code zum Aufrufen aus der Anpassungsassembly aktivieren können, muss das Projekt die folgenden Anforderungen erfüllen:

  • Das Dokument muss eine der folgenden Dateinamenerweiterungen haben:

    • Für Word: DOCM oder DOC

    • Für Excel: XLSM, XLTM, XLS oder XLT

  • Das Dokument muss bereits ein VBA-Projekt mit VBA-Code enthalten.

  • Für den VBA-Code im Dokument muss die Ausführung zulässig sein, ohne dass der Benutzer zum Aktivieren von Makros aufgefordert wird. Sie können die Vertrauenswürdigkeit für die Ausführung des VBA-Codes angeben, indem Sie den Speicherort des Office-Projekts der Liste der vertrauenswürdigen Speicherorte in den Trust Center-Einstellungen für Word oder Excel hinzufügen.

  • Das Office-Projekt muss mindestens eine öffentliche Klasse mit einem oder mehreren öffentlichen Membern enthalten, die Sie für VBA verfügbar machen.

    Sie können Methoden, Eigenschaften und Ereignisse für VBA verfügbar machen. Bei der Klasse, die Sie verfügbar machen können, kann es sich um eine Hostelementklasse (z. B. ThisDocument für Word oder ThisWorkbook und Sheet1 für Excel) oder eine andere Klasse handeln, die Sie in Ihrem Projekt definieren. Weitere Informationen zu Hostelementen finden Sie unter Übersicht über Hostelemente und Hoststeuerelemente.

Aktivieren von VBA-Code zum Aufrufen der Anpassungsassembly

Es gibt zwei unterschiedliche Möglichkeiten, wie Sie Member in einer Anpassungsassembly für VBA-Code im Dokument verfügbar machen können:

  • Sie können Member einer Hostelementklasse in einem Visual Basic-Projekt für VBA verfügbar machen. Legen Sie hierzu im Fenster Eigenschaften die EnableVbaCallers -Eigenschaft des Hostelements auf True fest, während das Hostelement (also Dokument, Arbeitsblatt oder Arbeitsmappe) im Designer geöffnet ist. Visual Studio führt automatisch alle Schritte aus, die erforderlich sind, um für VBA-Code das Aufrufen von Membern der Klasse zu ermöglichen.

  • Sie können Member in jeder öffentlichen Klasse in einem Visual C#-Projekt oder Member in einer Nicht-Hostelementklasse in einem Visual Basic-Projekt für VBA verfügbar machen. Bei dieser Option können Sie freier wählen, welche Klassen Sie für VBA verfügbar machen, aber es sind auch mehr manuelle Schritte erforderlich.

    Hierzu müssen Sie die folgenden Hauptschritte ausführen:

    1. Machen Sie die Klasse für COM verfügbar.

    2. Überschreiben Sie die GetAutomationObject -Methode einer Hostelementklasse in Ihrem Projekt, um eine Instanz der Klasse zurückzugeben, die Sie für VBA verfügbar machen.

    3. Legen Sie die ReferenceAssemblyFromVbaProject -Eigenschaft einer beliebigen Hostelementklasse im Projekt auf Truefest. Dadurch wird die Typbibliothek der Anpassungsassembly in die Assembly eingebettet, und dem VBA-Projekt im Dokument wird ein Verweis auf die Typbibliothek hinzugefügt.

    Ausführliche Anweisungen finden Sie unter How to: Expose code to VBA in a Visual Basic project and How to: Expose code to VBA in a Visual C# project.

    Die Eigenschaften EnableVbaCallers und ReferenceAssemblyFromVbaProject sind nur zur Entwurfszeit im Fenster Eigenschaften verfügbar. Sie können zur Laufzeit nicht verwendet werden. Um die Eigenschaften anzuzeigen, öffnen Sie den Designer für ein Hostelement in Visual Studio. Weitere Informationen zu den spezifischen Aufgaben, die Visual Studio beim Festlegen dieser Eigenschaften ausführt, finden Sie unter "Aufgaben", die von den Hostelementeigenschaften ausgeführt werden.

Hinweis

Wenn die Arbeitsmappe oder das Dokument nicht bereits VBA-Code enthält oder wenn die Ausführung des VBA-Codes im Dokument nicht als vertrauenswürdig eingestuft wird, erhalten Sie eine Fehlermeldung, sobald Sie die EnableVbaCallers - oder ReferenceAssemblyFromVbaProject -Eigenschaft auf Truefestlegen. Dies liegt daran, dass Visual Studio das VBA-Projekt im Dokument in dieser Situation nicht ändern kann.

Verwenden von Mitgliedern in VBA-Code zum Aufrufen der Anpassungsassembly

Nachdem Sie im Projekt für den VBA-Code Aufrufe in der Anpassungsassembly konfiguriert haben, fügt Visual Studio dem VBA-Projekt im Dokument die folgenden Member hinzu:

  • Für alle Projekte fügt Visual Studio eine globale Methode mit dem Namen GetManagedClasshinzu.

  • Für Visual Basic-Projekte, in denen Sie Member einer Hostelementklasse mithilfe der EnableVbaCallers-Eigenschaft verfügbar machen, fügt Visual Studio auch eine Eigenschaft namens ", ", ", " oder "Modul" im VBA-Projekt hinzu.For Visual Basic projects in which expose members of a host item class by using the EnableVbaCallers property, visual Studio also adds a property named CallVSTOAssembly to the ThisDocument, , ThisWorkbook, Sheet1, , Sheet2or Sheet3 module in the VBA project.

    Sie können die CallVSTOAssembly -Eigenschaft oder die GetManagedClass -Methode verwenden, um auf öffentliche Member der Klasse zuzugreifen, die Sie für den VBA-Code im Projekt verfügbar gemacht haben.

Hinweis

Beim Entwickeln und Bereitstellen Ihrer Projektmappe sind mehrere unterschiedliche Kopien des Dokuments vorhanden, denen Sie den VBA-Code hinzufügen können. Weitere Informationen finden Sie in den Richtlinien zum Hinzufügen von VBA-Code zum Dokument.

Verwenden der CallVSTOAssembly-Eigenschaft in einem Visual Basic-Projekt

Verwenden Sie die CallVSTOAssembly -Eigenschaft, um auf öffentliche Member zuzugreifen, die Sie der Hostelementklasse hinzugefügt haben. Mit dem folgenden VBA-Makro wird beispielsweise eine Methode mit dem Namen MyVSTOMethod aufgerufen, die in der Sheet1 -Klasse in einem Excel-Arbeitsmappenprojekt definiert ist.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

Diese Eigenschaft ist ein bequemerer Weg zum Aufrufen der Anpassungsassembly als die direkte Verwendung der GetManagedClass -Methode. CallVSTOAssembly gibt ein Objekt zurück, das für die Hostelementklasse steht, die Sie für VBA verfügbar gemacht haben. Die Member und Methodenparameter des zurückgegebenen Objekts werden in IntelliSense angezeigt.

Die CallVSTOAssembly -Eigenschaft verfügt über eine Deklaration, die dem folgenden Code ähnelt. In diesem Code wird vorausgesetzt, dass Sie die Sheet1 -Hostelementklasse in einem Excel-Arbeitsmappenprojekt mit dem Namen ExcelWorkbook1 für VBA verfügbar gemacht haben.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

Verwenden der GetManagedClass-Methode

Übergeben Sie zum Verwenden der globalen GetManagedClass -Methode das VBA-Objekt, das der Hostelementklasse entspricht, in der Ihre Überschreibung der GetAutomationObject -Methode enthalten ist. Verwenden Sie dann das zurückgegebene Objekt zum Zugreifen auf die Klasse, die Sie für VBA verfügbar gemacht haben.

Mit dem folgenden VBA-Makro wird beispielsweise eine Methode mit dem Namen MyVSTOMethod aufgerufen, die in der Sheet1 -Hostelementklasse in einem Excel-Arbeitsmappenprojekt mit dem Namen ExcelWorkbook1definiert ist.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

Die GetManagedClass -Methode weist die folgende Deklaration auf:

GetManagedClass(pdispInteropObject Object) As Object

Diese Methode gibt ein Objekt zurück, das für die Klasse steht, die Sie für VBA verfügbar gemacht haben. Die Member und Methodenparameter des zurückgegebenen Objekts werden in IntelliSense angezeigt.

Richtlinien zum Hinzufügen von VBA-Code zum Dokument

Es sind mehrere unterschiedliche Kopien des Dokuments vorhanden, denen Sie VBA-Code hinzufügen können, um Aufrufe für die Anpassung auf Dokumentebene durchführen zu können.

Beim Entwickeln und Testen Ihrer Projektmappe können Sie VBA-Code im Dokument schreiben, das geöffnet wird, während Sie das Projekt in Visual Studio (also das Dokument im Buildausgabeordner) debuggen oder ausführen. Sämtlicher VBA-Code, den Sie diesem Dokument hinzufügen, wird beim nächsten Erstellen des Projekts überschrieben. Visual Studio ersetzt das Dokument im Buildausgabeordner durch eine Kopie des Dokuments aus dem Hauptordner des Projekts.

Wenn Sie den VBA-Code speichern möchten, den Sie dem Dokument beim Debuggen oder Ausführen der Projektmappe hinzufügen, kopieren Sie den VBA-Code in das Dokument im Projektordner. Weitere Informationen zum Buildprozess finden Sie unter Erstellen von Office-Lösungen.

Wenn Sie die Projektmappe bereitstellen möchten, stehen Ihnen drei Hauptspeicherorte für Dokumente zur Verfügung, an denen Sie den VBA-Code hinzufügen können.

Im Projektordner auf dem Entwicklungscomputer

Dieser Speicherort ist gut geeignet, wenn Sie die vollständige Kontrolle über den VBA-Code im Dokument und den Anpassungscode haben. Da sich das Dokument auf dem Entwicklungscomputer befindet, können Sie den VBA-Code leicht ändern, wenn Sie den Anpassungscode ändern. VBA-Code, den Sie dieser Kopie des Dokuments hinzufügen, verbleibt im Dokument, wenn Sie die Projektmappe erstellen, debuggen und veröffentlichen.

Sie können den VBA-Code dem Dokument nicht hinzufügen, während es im Designer geöffnet ist. Sie müssen das Dokument zuerst im Designer schließen und es dann direkt in Word oder Excel öffnen.

Achtung

Wenn Sie VBA-Code hinzufügen, der bei geöffnetem Dokument ausgeführt wird, kann es in selten Fällen dazu kommen, dass dieser Code zu einer Beschädigung des Dokuments führt oder das Öffnen im Designer verhindert.

Im Veröffentlichungs- oder Installationsordner

In einigen Fällen kann es sinnvoll sein, den VBA-Code dem Dokument im Veröffentlichungs- oder Installationsordner hinzuzufügen. Beispielsweise können Sie diese Option wählen, wenn der VBA-Code von einem anderen Entwickler auf einem Computer geschrieben und getestet wird, auf dem Visual Studio nicht installiert ist.

Wenn Benutzer die Projektmappe direkt aus dem Veröffentlichungsordner installieren, müssen Sie den VBA-Code dem Dokument jedes Mal hinzufügen, wenn Sie die Projektmappe veröffentlichen. Visual Studio überschreibt das Dokument am Veröffentlichungsspeicherort, wenn Sie die Projektmappe veröffentlichen.

Wenn Benutzer die Projektmappe aus einem Installationsordner installieren, der sich vom Veröffentlichungsordner unterscheidet, können Sie verhindern, dass Sie den VBA-Code dem Dokument bei jeder Veröffentlichung der Projektmappe hinzufügen müssen. Wenn ein Veröffentlichungsupdate für das Verschieben aus dem Veröffentlichungsordner in den Installationsordner bereit ist, kopieren Sie alle Dateien in den Installationsordner, mit Ausnahme des Dokuments.

Auf dem Endbenutzercomputer

Wenn es sich bei den Endbenutzern um VBA-Entwickler handelt, von denen Dienste aufgerufen werden, die Sie in der Anpassung auf Dokumentebene bereitstellen, ist Folgendes möglich: Sie können ihnen mitteilen, wie Ihr Code aufgerufen wird, indem Sie die CallVSTOAssembly -Eigenschaft oder die GetManagedClass -Methode in ihren Kopien des Dokuments verwenden. Wenn Sie Aktualisierungen für die Lösung veröffentlichen, wird VBA-Code im Dokument auf dem Endbenutzercomputer nicht überschrieben, da das Dokument nicht durch Veröffentlichen von Updates geändert wird.

Von den Hostelementeigenschaften ausgeführte Aufgaben

Wenn Sie die Eigenschaften EnableVbaCallers und ReferenceAssemblyFromVbaProject verwenden, führt Visual Studio unterschiedliche Aufgabensätze aus.

Eigenschaften

Wenn Sie die EnableVbaCallers -Eigenschaft eines Hostelements in einem Visual Basic-Projekt auf True festlegen, führt Visual Studio die folgenden Aufgaben aus:

  1. Die Attribute ComClassAttribute und ComVisibleAttribute werden der Hostelementklasse hinzugefügt.

  2. Die GetAutomationObject -Methode der Hostelementklasse wird überschrieben.

  3. Die ReferenceAssemblyFromVbaProject -Eigenschaft des Hostelements wird auf Truefestgelegt.

    Wenn Sie die EnableVbaCallers -Eigenschaft zurück auf Falsesetzen, führt Visual Studio die folgenden Aufgaben aus:

  4. Die Attribute ComClassAttribute und ComVisibleAttribute werden aus der ThisDocument -Klasse entfernt.

  5. Die GetAutomationObject -Methode wird aus der Hostelementklasse entfernt.

    Hinweis

    Visual Studio legt die ReferenceAssemblyFromVbaProject -Eigenschaft nicht automatisch wieder auf Falsefest. Sie können diese Eigenschaft manuell auf False festlegen, indem Sie das Fenster Eigenschaften verwenden.

ReferenceAssemblyFromVbaProject

Wenn die ReferenceAssemblyFromVbaProject -Eigenschaft eines beliebigen Hostelements in einem Visual Basic- oder Visual C#-Projekt auf Truefestgelegt ist, führt Visual Studio die folgenden Aufgaben aus:

  1. Es wird eine Typbibliothek für die Anpassungsassembly generiert und die Typbibliothek in die Assembly eingebettet.

  2. Es wird ein Verweis auf die folgenden Typbibliotheken im VBA-Projekt im Dokument hinzugefügt:

    • Die Typbibliothek für die Anpassungsassembly.

    • Die Typbibliothek „Microsoft Visual Studio-Tools für Office-Ausführungs-Engine 9.0“. Diese Typbibliothek ist in der Visual Studio-Tools für Office-Laufzeit enthalten.

    Wenn die ReferenceAssemblyFromVbaProject -Eigenschaft wieder auf Falsefestgelegt wird, führt Visual Studio die folgenden Aufgaben aus:

  3. Die Typbibliotheksverweise werden aus dem VBA-Projekt im Dokument entfernt.

  4. Die eingebettete Typbibliothek wird aus der Assembly entfernt.

Problembehandlung

Die folgende Tabelle enthält einige häufige Fehler und Vorschläge zum Beheben der Fehler.

Fehler Vorschlag
Nachdem Sie die EnableVbaCallers - oder ReferenceAssemblyFromVbaProject -Eigenschaft festgelegt haben, wird in einer Fehlermeldung angegeben, dass im Dokument kein VBA-Projekt enthalten ist oder dass Sie keine Berechtigung zum Zugreifen auf das VBA-Projekt im Dokument haben. Stellen Sie sicher, dass das Dokument im Projekt mindestens ein VBA-Makro enthält, dass das VBA-Projekt vertrauenswürdig genug für die Ausführung ist und dass das VBA-Projekt nicht mit einem Kennwort geschützt ist.
Nachdem Sie die Eigenschaften - oder ReferenceAssemblyFromVbaProject -Eigenschaft festgelegt haben, wird in einer Fehlermeldung angegeben, dass die GuidAttribute -Deklaration fehlt oder beschädigt ist. Stellen Sie sicher, dass sich die GuidAttribute Deklaration in der Datei "AssemblyInfo.cs " oder "AssemblyInfo.vb " in Ihrem Projekt befindet und dass dieses Attribut auf eine gültige GUID festgelegt ist.
Nachdem Sie die Eigenschaften - oder ReferenceAssemblyFromVbaProject -Eigenschaft festgelegt haben, wird in einer Fehlermeldung angegeben, dass die vom AssemblyVersionAttribute -Element angegebene Versionsnummer ungültig ist. Stellen Sie sicher, dass die AssemblyVersionAttribute Deklaration in der Datei "AssemblyInfo.cs" oder "AssemblyInfo.vb" in Ihrem Projekt auf eine gültige Assemblyversionsnummer festgelegt ist. Informationen zu gültigen Assemblyversionsnummern finden Sie unter der AssemblyVersionAttribute -Klasse.
Nachdem Sie die Anpassungsassembly umbenannt haben, funktioniert der VBA-Code nicht mehr, mit dem Aufrufe für die Anpassungsassembly durchgeführt werden. Wenn Sie den Namen der Anpassungsassembly ändern, nachdem Sie diese für den VBA-Code verfügbar gemacht haben, ist der Link zwischen dem VBA-Projekt im Dokument und Ihrer Anpassungsassembly beschädigt. Um dieses Problem zu beheben, ändern Sie die ReferenceFromVbaAssembly -Eigenschaft im Projekt in False und dann zurück in True. Ersetzen Sie anschließend alle Verweise auf den alten Assemblynamen im VBA-Code durch den neuen Assemblynamen.