Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Der VBA-Editor hinkt Visual Studio um Lichtjahre hinterher. Doch es gibt gute Nachrichten: Mit einem COM-Add-In auf Basis von .NET können Sie auch den VBA-Editor noch um Funktionen erweitern. Das zeigen ja auch andere Werkzeugkästen wie etwa die MZ-Tools. Wir wollen in diesem Artikel einmal zeigen, wie Sie ein COM-Add-In in Visual Studio programmieren, das dann beim öffnen des VBA-Editors zu seiner Erweiterung zur Verfügung steht.
In diesem Artikel schauen wir uns zunächst an, welche Schritte grundsätzlich zum Erstellen eines COM-Add-Ins für den VBA-Editor nötig sind. Die Funktion des COM-Add-Ins beschränken wir auf das Nötigste – darauf gehen wir dann in einem weiteren Artikel ein und fügen dem Add-In dann nützliche Funktionen hinzu.
Neues Projekt erstellen
Visual Studio 2017 stellt zwar Projektvorlagen für COM-Add-Ins für die Office-Anwendungen Excel, Outlook, Word et cetera bereit, jedoch nicht für Access oder den VBA-Editor der Office-Anwendung. Also müssen wir uns selbst behelfen und die notwendigen Elemente selbst zusammenstellen.
Dazu legen Sie unter Visual Studio zunächst ein neues Projekt mit der Vorlage Visual Basic|Windows Desk-top|Klassenbibliothek an und speichern dieses unter dem Namen VBECOM-AddIn (siehe Bild 1).
Bild 1: Anlegen des neuen Projekts
Damit erstellen Sie ein neues Projekt, dass zunächst lediglich die Klasse Class1.vb enthält.
Verweise hinzufügen
Danach fügen wir dem Projekt einige Verweise hinzu, wobei Sie jeweils über den Menüeintrag Projekt|Verweise hinzufügen… starten. Hier wollen wir als einen Verweis auf die Extensibility-Bibliothek hinzufügen. Diese finden wir nur über den Durchsuchen-Dialog des Verweis-Managers, den Sie über die entsprechende Schaltfläche öffnen (siehe Bild 2).
Bild 2: Verwalten der Verweise
Hier finden Sie dann etwa unter dem Verzeichnis C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Common die Datei Extensibility.dll (siehe Bild 3).
Bild 3: Auswahl der Datei Extensibility.dll
Achtung: Wenn Sie einfach Extensibility in das Suchfeld eingeben, werden Sie vermutlich die falsche Version erwischen, was dazu führen kann, dass das Add-In nicht geladen werden kann!
Weitere Verweise hinzufügen
Danach ergänzen wir das Projekt um weitere Verweise, wozu wir ebenfalls den Verweis-Manager benötigen. Die weiteren Verweise finden Sie im Bereich Assemblys, wo Sie am einfachsten den passenden Suchbegriff in das Suchen-Feld eingeben. Die erste so zu ergänzende Bibliothek heißt beispielsweise
Sie ist in zwei verschiedenen Verzeichnissen verfügbar, nämlich in C:\Program Files (x86)\Microsoft Visual Studio 14.0\Visual Studio Tools for Office\PIA\Office15 und C:\Program Files (x86)\Microsoft Visual Studio\Shared\Visual Studio Tools for Office\PIA\Office15. Wir konnten keinen Unterschied bei den beiden DLLs feststellen. Es spielt also keine Rolle, welche Sie verwenden. Also wählen wir einfach einen der beiden aktuelleren Einträge aus (siehe Bild 4). Warum aber überhaupt einen Verweis auf die Access-Bibliothek, obwohl wir doch ein COM-Add-In für den VBA-Editor erstellen wollen Ganz einfach: So haben wir auch die Möglichkeit, einmal auf die Objekte der Access-Datenbank zuzugreifen, um gegebenenfalls etwa VBA-Klassen auf Basis von Tabellen oder Formularen erstellen zu lassen. Auf die gleiche Weise fügen wir nun auch noch Verweise auf die Bibliotheken Microsoft.Office.Interop.Access.Dao, Microsoft.VBE.Interop und Microsoft.VBE.Interop.Forms hinzu. Außerdem benötigen wir etwa für die Anzeige von Meldungsfenstern noch den Namespace System.Windows.Forms.
Bild 4: Einbinden des Namespaces Microsoft.Office.Interop.Access
Insgesamt sieht die Liste der Verweise nun wie in Bild 5 aus.
Bild 5: Liste der Verweise des Projekts
Klasse Connect erstellen
Nun fügen wir dem Projekt eine neue Klasse namens Connect hinzu. Dazu wählen Sie im Kontextmenü des Eintrags VBECOMAddIn des Projektmappen-Explorers den Befehl Hinzufügen|Klasse… aus.
Für die neue Klasse vergeben Sie im nun erscheinenden Dialog Neues Element hinzufügen den Namen Connect (siehe Bild 6).
Bild 6: Hinzufügen der Klassendatei VBECOMAddIn
Namespaces hinzufügen
Der neuen Klassendatei fügen wir nun zunächst die Verweise auf die Namespaces der soeben hinzugefügten Bibliotheken hinzu, und zwar im Kopf des Moduls:
Imports Microsoft.Office.Interop Imports Extensibility Imports Microsoft.Office.Interop.Access Imports Microsoft.Office.Interop.Access.Dao Imports System.Windows.Forms Imports System.Runtime.InteropServices Imports Microsoft.Vbe.Interop Imports Microsoft.Vbe.Interop.Forms
Extensibility-Schnittstelle implementieren
Danach folgt ein Schritt, mit dem wir die Schnittstelle Extensibility.IDTExtensibility2 für die Klasse Connect implementieren. Dazu fügen wir in der Zeile unterhalb der Zeile Public Class Connect die Anweisung Implements ein und ergänzen dann wie in Bild 7 zu erkennen auf Implements Extensibility.IDTExtensibility2.
Bild 7: Implementieren der Schnittstelle Extensibility.IDTExtensibility2
Diese Anweisung wird nun noch rot unterstrichen markiert. Der Grund ist einfach: Wir haben zwar angegeben, dass wir die Schnittstelle implementieren wollen, allerdings haben wir nicht alle Member dieser Schnittstelle implementiert. Einen Hinweis darauf liefert auch die Fehlerliste (siehe Bild 8).
Bild 8: Fehlende Member der Implementierung von Extensibility.IDTExtensibility2
Diesen Fehler können wir allerdings recht schnell beheben. Dazu klicken Sie zunächst mit der rechten Maustaste auf den markierten Code und wählen aus dem Kontextmenü den Eintrag Schnellaktionen und Refactorings… aus. Daraufhin erscheint eine Auswahl mit zwei Möglichkeiten, von denen wir den zweiten Eintrag namens Schnittstelle implementieren auswählen. Dies zeigt alle Member an, die durch diesen Schritt automatisch zur Klasse hinzugefügt würden (siehe Bild 9).
Bild 9: Implementieren per Schnellaktionen und Refactorings
Wählen Sie diesen Eintrag aus, ergänzt diese Schnellaktion die Klasse wie in Bild 10.
Bild 10: Die Klasse mit allen Membern der Implementierung der Schnittstelle Extensibility.IDTExtensibility2
Neue GUID ermitteln
Nun benötigen wir eine eindeutige GUID, mit der wir das Add-In versehen. Diese ermitteln wir, indem wir den Menüpunkt Extras|GUID erstellen aufrufen. Im nun erscheinenden Dialog wählen wir die letzte Option aus und klicken zum Erstellen der neuen GUID auf die Schaltfläche Neue GUID (siehe Bild 11).
Bild 11: Ermitteln einer neuen GUID
Dann kopieren Sie diese mit der Schaltfläche Kopieren in die Zwischenablage. Die GUID hat nicht exakt die Form, die wir benötigen, sodass wir diese noch etwas anpassen müssen.
Dann fügen wir diese in die Attribut-Klasse ComVisible direkt über der Zeile Public Class Connect ein und legen die ProgID auf VBECOMAddIn.Connect fest, also auf
<ComVisible(True), Guid("6317A901-A2F4-490F-961C-9AE170B734CD"), ProgId("VBECOMAddIn.Connect")> Public Class Connect ... End Class
Die hier angegebene GUID merken wir uns, da wir diese später noch für verschiedene Registry-Einträge benötigen.
Innerhalb des Klassenmoduls deklarieren wir zwei Variablen, die erstens einen Verweis auf den VBA-Editor (VBE) und das Add-In (AddIn) aufnehmen sollen:
Private _VBE As VBE Private _AddIn As AddIn
Danach ersetzen wir in der Methode OnConnection die Anweisung Throw New NotImplementedException() durch die Zeilen aus Listing 1.
Public Sub OnConnection(Application As Object, _ ConnectMode As ext_ConnectMode, AddInInst As Object, _ ByRef custom As Array) Implements IDTExtensibility2.OnConnection Try _VBE = DirectCast(Application, VBE) _AddIn = DirectCast(AddInInst, AddIn) Select Case ConnectMode Case Extensibility.ext_ConnectMode.ext_cm_Startup MessageBox.Show("Add-In geladen (Startup): " & _AddIn.ProgId) Case Extensibility.ext_ConnectMode.ext_cm_AfterStartup MessageBox.Show("Add-In geladen (AfterStartup): " & _AddIn.ProgId) End Select Catch ex As Exception MessageBox.Show(ex.ToString()) End Try End Sub
Listing 1: Ereignisprozedur beim Verbinden
Die Methode erledigt gleich mehrere Schritte. Als Erstes werfen wir allerdings einen Blick auf die Parameter der Methode. Der erste Parameter namens Application liefert einen Verweis auf die aufrufende Anwendung. Der dritte heißt AddInInst und liefert einen Verweis auf das Add-In selbst.
Wir konvertieren die damit gelieferten Verweise mit der DirectCast-Methode in die Typen VBE und AddIn. Danach prüfen wir den Inhalt des zweiten Parameters namens ConnectMode. Dieser kann verschiedene Werte liefern, zum Beispiel ext_cm_Startup oder ext_cm_AfterStartup. Diese haben die folgende Bedeutung:
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo