Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
MyMacroaus einem Projekt auf Dokumentebene für Excel aufrufen. In diesem Beispiel wird davon ausgegangen, dassMyMacroinSheet1definiert 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.
ThisDocumentfür Word oderThisWorkbookundSheet1fü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:
Machen Sie die Klasse für COM verfügbar.
Überschreiben Sie die GetAutomationObject-Methode einer Hostelementklasse in Ihrem Projekt, um eine Instanz der Klasse zurückzugeben, die Sie VBA verfügbar machen.
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,Sheet2oderSheet3Modul im VBA-Projekt auch eine Eigenschaft hinzu, dieCallVSTOAssemblygenannt wird.Sie können die Eigenschaft
CallVSTOAssemblyoder die MethodeGetManagedClassverwenden, 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:
Sie fügt der Hostelementklasse die Attribute ComClassAttribute und ComVisibleAttribute hinzu.
Sie überschreibt die GetAutomationObject-Methode der Host-Elementklasse.
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:
Es entfernt die ComClassAttribute und ComVisibleAttribute Attribute aus der
ThisDocumentKlasse.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:
Es generiert eine Typbibliothek für die Anpassungsassembly und bettet die Typbibliothek in die Assembly ein.
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:
Sie entfernt die Typbibliotheksverweise aus dem VBA-Projekt im Dokument.
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. |
Verwandte Inhalte
- Vorgehensweise: Verfügbarmachen von Code für VBA in einem Visual Basic-Projekt
- Vorgehensweise: Verfügbarmachen von Code für VBA in einem Visual C#-Projekt
- Exemplarische Vorgehensweise: Aufrufen von Code aus VBA in einem Visual Basic-Projekt
- Exemplarische Vorgehensweise: Aufrufen von Code aus VBA in einem Visual C#-Projekt
- Entwerfen und Erstellen von Office-Lösungen
- VBA- und Office-Lösungen in Visual Studio verglichen
- Programmanpassungen auf Dokumentebene