Freigeben über


Kombinieren von VBA- und Dokumentebenenanpassungen

Sie können Visual Basic für Applikationen (VBA)-Code in einem Dokument verwenden, das Teil einer Anpassung auf Dokumentebene für Microsoft Office Word oder Microsoft Office Excel ist. Sie können VBA-Code im Dokument aus der Anpassungsassembly aufrufen, oder Sie können Ihr Projekt so konfigurieren, dass der VBA-Code im Dokument Code in der Anpassungsassembly aufrufen kann.

Gilt für: Die Informationen in diesem Thema gelten für Projekte auf Dokumentebene für Excel und Word. Weitere Informationen finden Sie unter Funktionen verfügbar nach Office-Anwendung und Projekttyp.

Verhalten von VBA-Code in einer Anpassung auf Dokumentebene

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

Wenn Sie die Lösung ausführen, nehmen Ereignishandler sowohl in VBA als auch in der Anpassungsassembly Ereignisse auf, die im Dokument ausgelöst werden, sowie beide Codeausführungssätze. Sie können nicht vorher bestimmen, welcher Code vor dem anderen ausgeführt wird; Sie müssen dies durch Tests in den einzelnen Fällen ermitteln. Sie können unerwartete Ergebnisse erhalten, wenn die beiden 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. Wenden Sie hierzu eine der folgenden Methoden an:

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

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

    Für jede Methode identifiziert der erste Parameter den Namen des Makros oder der Funktion, das Sie aufrufen möchten, und die verbleibenden optionalen Parameter geben die Parameter an, die an das Makro oder die Funktion übergeben werden sollen. Der erste Parameter kann unterschiedliche Formate für Word und Excel aufweisen:

  • Bei Word ist der erste Parameter eine Zeichenfolge, die eine beliebige Kombination aus Vorlagen-, Modul- und Makronamen sein kann. Wenn Sie den Dokumentnamen angeben, kann Ihr Code nur Makros in Dokumenten ausführen, die mit dem aktuellen Kontext zusammenhängen – nicht nur in jedem Beliebigen Dokument.

  • Für Excel kann der erste Parameter eine Zeichenfolge sein, die den Makronamen angibt, ein Range Wert, der angibt, wo sich die Funktion befindet, oder eine Register-ID für eine registrierte DLL-Funktion (XLL). Wenn Sie eine Zeichenfolge übergeben, wird die Zeichenfolge im Kontext des aktiven Blatts ausgewertet.

    Das folgende Codebeispiel zeigt, wie Sie ein Makro namens MyMacro aus einem Projekt auf Dokumentebene für Excel aufrufen. In diesem Beispiel wird davon ausgegangen, dass MyMacro in Sheet1 definiert 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.

Code in Dokumentenebenen-Anpassungen über VBA aufrufen

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 hilfreich:

  • 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, endbenutzern zur Verfügung stellen, die auf die Dienste zugreifen können, indem Sie VBA-Code in das Dokument schreiben.

    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

Dieses Feature 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 für den Aufruf in die Anpassungsassembly aktivieren können, muss Ihr Projekt die folgenden Anforderungen erfüllen:

  • Das Dokument muss über eine der folgenden Dateinamenerweiterungen verfügen:

    • Für Word: DOCM oder .doc

    • Für Excel: XLSM, XLTM, .xlsoder XLT

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

  • VBA-Code im Dokument muss ausgeführt werden dürfen, ohne den Benutzer aufzufordern, Makros zu aktivieren. Sie können VBA-Code ausführen, indem Sie den Speicherort des Office-Projekts zur Liste der vertrauenswürdigen Speicherorte in den Vertrauensstelleneinstellungen von Word oder Excel hinzufügen.

  • Das Office-Projekt muss mindestens eine öffentliche Klasse enthalten, die ein oder mehrere öffentliche Mitglieder enthält, die Sie VBA verfügbar machen.

    Sie können Methoden, Eigenschaften und Ereignisse für VBA verfügbar machen. Die verfügbar gemachte Klasse kann eine Hostelementklasse (z. B. ThisDocument für Word oder ThisWorkbook und Sheet1 für Excel) oder eine andere Klasse sein, die Sie in Ihrem Projekt definieren. Weitere Informationen zu Host-Elementen finden Sie unter Übersicht über Host-Elemente und Host-Steuerelemente.

Aktivieren von VBA-Code zum Aufrufen der Anpassungsassembly

Es gibt zwei verschiedene Möglichkeiten, wie Sie Mitglieder in einer Anpassungs-Assembly 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 zugänglich machen. Legen Sie dazu die EnableVbaCallers-Eigenschaft des Hostelements im Eigenschaftenfenster auf True fest, während das Hostelement (d. h. das Dokument, das Arbeitsblatt oder die Arbeitsmappe) im Designer geöffnet ist. Visual Studio führt automatisch alle erforderlichen Aufgaben aus, um VBA-Code zum Aufrufen von Mitgliedern der Klasse zu aktivieren.

  • 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. Diese Option bietet Ihnen mehr Freiheit, um auszuwählen, welche Klassen Sie VBA zur Verfügung stellen, erfordert aber auch manuellere Schritte.

    Dazu 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 VBA verfügbar machen.

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

    Ausführliche Anweisungen finden Sie unter So geben Sie Code in einem Visual Basic-Projekt für VBA frei und So geben Sie Code in einem Visual C#-Projekt für VBA frei.

    Die Eigenschaften EnableVbaCallers und ReferenceAssemblyFromVbaProject sind nur im Eigenschaftenfenster zur Entwurfszeit verfügbar. sie können zur Laufzeit nicht verwendet werden. Um die Eigenschaften anzuzeigen, öffnen Sie den Designer für ein Host-Element 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 Eigenschaften von Hostelementen ausgeführt werden.

Hinweis

Wenn die Arbeitsmappe oder das Dokument nicht bereits VBA-Code enthält oder vba-Code im Dokument nicht als vertrauenswürdig eingestuft wird, wird eine Fehlermeldung angezeigt, wenn Sie die EnableVbaCallers - oder ReferenceAssemblyFromVbaProject-Eigenschaft auf "True" festlegen. Dies liegt daran, dass Visual Studio das VBA-Projekt in diesem Fall nicht ändern kann.

Verwenden Sie Mitglieder im VBA-Code, um die Anpassungs-Assembly aufzurufen.

Nachdem Sie Ihr Projekt so konfiguriert haben, dass VBA-Code die Anpassungsassembly aufrufen kann, 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 dem ThisDocument, ThisWorkbook, Sheet1, Sheet2 oder Sheet3 Modul im VBA-Projekt auch eine Eigenschaft hinzu, die CallVSTOAssembly genannt wird.

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

Hinweis

Während Sie Ihre Lösung entwickeln und bereitstellen, gibt es mehrere verschiedene Kopien des Dokuments, in 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 Host-Element-Klasse hinzugefügt haben. Das folgende VBA-Makro ruft beispielsweise eine Methode mit dem Namen MyVSTOMethod auf, die in der Sheet1 Klasse in einem Excel-Arbeitsmappenprojekt definiert ist.

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

Diese Eigenschaft ist eine bequemere Möglichkeit, die Anpassungsassembly aufzurufen, als die GetManagedClass Methode direkt zu verwenden. CallVSTOAssembly gibt ein Objekt zurück, das die Hostelementklasse darstellt, 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 davon ausgegangen, dass Sie die Sheet1 Hostelementklasse in einem Excel-Arbeitsmappenprojekt mit dem Namen ExcelWorkbook1 für VBA freigegeben haben.

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

Verwenden der GetManagedClass-Methode

Übergeben Sie zur Verwendung der globalen GetManagedClass Methode das VBA-Objekt, das der Host-Elementklasse entspricht, die Ihre Überschreibung der Methode GetAutomationObject enthält. Verwenden Sie dann das zurückgegebene Objekt, um auf die Klasse zuzugreifen, die Sie für VBA verfügbar gemacht haben.

Das folgende VBA-Makro ruft beispielsweise eine Methode mit dem Namen MyVSTOMethod auf, 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 die Klasse darstellt, 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 gibt mehrere verschiedene Kopien des Dokuments, in denen Sie VBA-Code hinzufügen können, der in die Anpassung auf Dokumentebene aufruft.

Während Sie Ihre Lösung entwickeln und testen, können Sie VBA-Code in das Dokument schreiben, das geöffnet wird, während Sie Ihr Projekt debuggen oder in Visual Studio ausführen (d. s. das Dokument im Buildausgabeordner). Jeder VBA-Code, den Sie diesem Dokument hinzufügen, wird jedoch beim nächsten Erstellen des Projekts überschrieben, da Visual Studio das Dokument im Buildausgabeordner durch eine Kopie des Dokuments aus dem Hauptprojektordner ersetzt.

Wenn Sie den VBA-Code speichern möchten, den Sie beim Debuggen oder Ausführen der Lösung zum Dokument 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 bereit sind, Ihre Lösung bereitzustellen, gibt es drei Hauptdokumentspeicherorte, in denen Sie den VBA-Code hinzufügen können.

Im Projektordner auf dem Entwicklungscomputer

Diese Position ist praktisch, 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 ganz einfach ändern, wenn Sie den Anpassungscode ändern. VBA-Code, den Sie dieser Kopie des Dokuments hinzufügen, verbleibt beim Erstellen, Debuggen und Veröffentlichen der Lösung im Dokument.

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

Vorsicht

Wenn Sie VBA-Code hinzufügen, der beim Öffnen des Dokuments ausgeführt wird, kann dieser Code das Dokument in seltenen Fällen beschädigen oder verhindern, dass es im Designer geöffnet wird.

Im Veröffentlichungs- oder Installationsordner

In einigen Fällen ist es möglicherweise geeignet, dem Dokument im Veröffentlichungs- oder Installationsordner den VBA-Code hinzuzufügen. Sie können diese Option beispielsweise auswä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 Lösung direkt aus dem Veröffentlichungsordner installieren, müssen Sie den VBA-Code jedes Mal, wenn Sie die Lösung veröffentlichen, dem Dokument hinzufügen. Visual Studio überschreibt das Dokument am Veröffentlichungsort, wenn Sie die Lösung veröffentlichen.

Wenn Benutzer die Lösung aus einem Installationsordner installieren, der sich vom Veröffentlichungsordner unterscheidet, können Sie das Hinzufügen des VBA-Codes im Dokument vermeiden, wenn Sie die Lösung veröffentlichen. Wenn ein Veröffentlichungsupdate aus dem Veröffentlichungsordner in den Installationsordner verschoben werden kann, kopieren Sie alle Dateien mit Ausnahme des Dokuments in den Installationsordner.

Auf dem Endbenutzercomputer

Wenn die Endbenutzer VBA-Entwickler sind, die Dienste aufrufen, die Sie in der Anpassung auf Dokumentebene bereitstellen, können Sie ihnen mitteilen, wie Sie Ihren Code mithilfe der CallVSTOAssembly Eigenschaft oder der GetManagedClass Methode in ihren Kopien des Dokuments aufrufen. 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.

Aufgaben, die von den Eigenschaften des Hostelements ausgeführt werden

Wenn Sie die Eigenschaften EnableVbaCallers und ReferenceAssemblyFromVbaProject verwenden, führt Visual Studio verschiedene Aufgabengruppen aus.

Vba-Aufrufer aktivieren

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

  1. Sie fügt der Hostelementklasse die Attribute ComClassAttribute und ComVisibleAttribute hinzu.

  2. Sie überschreibt die GetAutomationObject-Methode der Host-Elementklasse.

  3. Es legt die ReferenceAssemblyFromVbaProject-Eigenschaft des Hostelements auf True fest.

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

  4. Es entfernt die ComClassAttribute und ComVisibleAttribute Attribute aus der ThisDocument Klasse.

  5. Sie entfernt die GetAutomationObject-Methode aus der Hostitemklasse.

    Hinweis

    Visual Studio setzt die Eigenschaft ReferenceAssemblyFromVbaProject nicht automatisch auf False zurück. Sie können diese Eigenschaft manuell auf False festlegen, indem Sie das Eigenschaftenfenster verwenden.

ReferenzassemblierungAusVbaProjekt

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

  1. Es generiert eine Typbibliothek für die Anpassungsassembly und bettet die Typbibliothek in die Assembly ein.

  2. Es fügt einen Verweis auf die folgenden Typbibliotheken im VBA-Projekt im Dokument hinzu:

    • Die Typbibliothek für die Anpassungs-Assembly.

    • Die Microsoft Visual Studio Tools for Office Execution Engine 9.0-Typbibliothek. Diese Typbibliothek ist im Visual Studio Tools for Office Runtime enthalten.

    Wenn die ReferenceAssemblyFromVbaProject-Eigenschaft auf False zurückgesetzt wird, führt Visual Studio die folgenden Aufgaben aus:

  3. Sie entfernt die Typbibliotheksverweise aus dem VBA-Projekt im Dokument.

  4. Sie entfernt die eingebettete Typbibliothek aus der Assembly.

Troubleshoot

In der folgenden Tabelle sind einige häufige Fehler und Vorschläge zum Beheben der Fehler aufgeführt.

Fehler Vorschlag
Nachdem Sie die Eigenschaft EnableVbaCallers oder ReferenceAssemblyFromVbaProject festgelegt haben, gibt eine Fehlermeldung an, dass das Dokument kein VBA-Projekt enthält, oder Sie verfügen nicht über die Berechtigung für den Zugriff auf das VBA-Projekt im Dokument. Stellen Sie sicher, dass das Dokument im Projekt mindestens ein VBA-Makro enthält, das VBA-Projekt über ausreichende Vertrauensstellungen zum Ausführen verfügt, und das VBA-Projekt ist nicht durch ein Kennwort geschützt.
Nachdem Sie die Eigenschaft EnableVbaCallers oder ReferenceAssemblyFromVbaProject festgelegt haben, gibt eine Fehlermeldung an, 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 Eigenschaft EnableVbaCallers oder ReferenceAssemblyFromVbaProject festgelegt haben, gibt eine Fehlermeldung an, dass die durch die AssemblyVersionAttribute Eigenschaft 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 in der AssemblyVersionAttribute Klasse.
Nachdem Sie die Anpassungsassembly umbenannt haben, funktioniert VBA-Code, der in die Anpassungsassembly aufruft, nicht mehr. Wenn Sie den Namen der Anpassungsassembly ändern, nachdem Sie sie für VBA-Code veröffentlicht haben, wird die Verknüpfung zwischen dem VBA-Projekt im Dokument und der Anpassungsassembly unterbrochen. Um dieses Problem zu beheben, ändern Sie die ReferenceFromVbaAssembly-Eigenschaft in Ihrem Projekt in "False " und dann wieder auf "True", und ersetzen Sie dann alle Verweise auf den alten Assemblynamen im VBA-Code durch den neuen Assemblynamen.