COM-Add-In für den VBA-Editor programmieren

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).

Anlegen des neuen Projekts

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).

Verwalten der Verweise

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).

Auswahl der Datei Extensibility.dll

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.

Einbinden des Namespaces Microsoft.Office.Interop.Access

Bild 4: Einbinden des Namespaces Microsoft.Office.Interop.Access

Insgesamt sieht die Liste der Verweise nun wie in Bild 5 aus.

Liste der Verweise des Projekts

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).

Hinzufügen der Klassendatei VBECOMAddIn

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.

Implementieren der Schnittstelle 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).

Fehlende Member der Implementierung von Extensibility.IDTExtensibility2

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).

Implementieren per Schnellaktionen und Refactorings

Bild 9: Implementieren per Schnellaktionen und Refactorings

Wählen Sie diesen Eintrag aus, ergänzt diese Schnellaktion die Klasse wie in Bild 10.

Die Klasse mit allen Membern der Implementierung der Schnittstelle Extensibility.IDTExtensibility2

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).

Ermitteln einer neuen GUID

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 .. Das Ergebnis sieht dann wie folgt aus:

<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

Schreibe einen Kommentar