Neben COM-DLLs können Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfläche von Access angezeigt und genutzt werden können. Die Möglichkeiten sind unbegrenzt – Sie können damit beispielsweise Ribbon-Einträge hinzufügen, die dauerhaft und unabhängig von der jeweils geöffneten Datenbank verfügbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beiträgen an. Dieser Beitrag beleuchtet zunächst einmal die technischen Grundlagen für die Erstellung von COM-Add-Ins für die Access-Benutzeroberfläche.
COM-Add-Ins und Access-Add-Ins
Bevor wir in die Materie einsteigen, wollen wir den Unterschied zwischen COM-Add-Ins und Access-Add-Ins klären. Access-Add-Ins sind Access-Datenbanken, die eine spezielle Dateiendung enthalten und eine Tabelle namens USysRegInfo mit Einträgen, welche Informationen über das Add-In zum Eintragen in die Registry enthalten.
Diese rufen Sie schließlich über den Ribbon-Eintrag Datenbanktools|Add-Ins|Add-Ins auf. Bild 1 zeigt einige Add-Ins in der Access-Installation des Autors dieses Beitrags. Ein Klick auf einen dieser Einträge startet diesen und zeigt beispielsweise ein Formular mit den enthaltenen Funktionen an. Es gibt noch weitere Möglichkeiten, Access-Add-Ins zu platzieren – zum Beispiel als Steuerelement-Assistent oder Formular-Assistent.
Bild 1: Access-Add-Ins
Der wichtigste Unterschied zwischen Access-Add-Ins und den hier vorgestellten COM-Add-Ins für Access ist, dass Sie für COM-Add-Ins keine speziellen Orte vorfinden, an denen Sie deren Aufruf platzieren können. Stattdessen fügen Sie einfach im gewünschten Ribbon einen Eintrag hinzu oder auch ein eigenes Ribbon, über das Sie das COM-Add-In starten können. Der zweite wichtige Unterschied ist, dass Sie Access-Add-Ins komplett mit Access erstellen. Sie brauchen dann nur die Dateiendung von .accdb auf .accda zu ändern und die bereits erwähnte Tabelle namens USysRegInfo mit Informationen über die Art des Access-Add-Ins, den Namen et cetera sowie die auszuführende Funktion hinzuzufügen.
Ein COM-Add-In hingegen können Sie nicht einfach mit Access erstellen, sondern Sie benötigen dazu eine externe Entwicklungsumgebung. Früher hat man das mit Visual Studio 6 erledigt. Auch der Nachfolger Visual Studio .NET hat im Laufe der Zeit verschiedene Tools zum Erstellen von Office-Add-Ins angeboten.
Für die Erstellung von Access-Add-Ins musste man jedoch unter Visual Studio .NET immer improvisieren: Vorlagen gab es nämlich nur für die populäreren Office-Anwendungen wie Word, Outlook oder Excel.
Kein 64-Bit unter Visual Studio 6
Der Nachteil bei der COM-Add-In-Entwicklung unter Visual Studio 6 zeigt sich aktuell zunehmend darin, dass immer mehr Installationen von Office beziehungsweise Access die 64-Bit-Version verwenden. Und Visual Studio 6 erstellt nur Projekte in der 32-Bit-Version. Insofern sind mit twinBASIC erstellte COM-Add-Ins auch zukunftssicherer.
COM-Add-Ins mit twinBASIC
Im April 2021 hat jedoch Wayne Philips, der bereits mit dem Fehler- und Debugging-Tool vbWatchdog von sich hören machte, eine erste Version seiner Entwicklungsumgebung für VB- und VBA-kompatible Projekte veröffentlicht. Diese basiert auf Visual Studio Code und nutzt eine eigene Erweiterung für das Programmieren von VB- und VBA-Projekten.
In Kürze soll man damit auch Anwendungen mit Benutzeroberfläche damit programmieren können, derzeit ist das aber noch nicht möglich. Für uns spielt das keine Rolle – wir schauen uns erst einmal die grundlegenden Möglichkeiten der Erstellung von COM-Add-Ins für die Access-Benutzeroberfläche an.
Die Grundlagen zum Einrichten von Visual Studio Code und der für die VB-Programmierung benötigten Erweiterung haben wir bereits im Beitrag twinBASIC – VB/VBA mit moderner Umgebung (www.access-im-unternehmen.de/1303) beschrieben. Im vorliegenden Beitrag bauen wir auf einem einfachen Template für ein Access-COM-Add-In auf und erläutern die einzelnen Bestandteile. Anschließend fügen wir dem COM-Add-In einige Beispielfunktionen hinzu.
Wir starten mit einem Beispielprojekt, das Sie per Doppelklick auf die Datei myAccessAddIn.code-workspace starten. Dies öffnet das Projekt im twinBASIC-Editor beziehungsweise in Visual Studio Code wie in Bild 2.
Bild 2: Aufbau eines Projekts für die Erstellung eines COM-Add-Ins
Die hier sichtbaren Prozeduren sind die Implementierung einer Schnittstelle namens IDExtensibility2, die bereits seit VB6 zum Implementieren der Funktionen für COM-Add-Ins für die verschiedenen Office-Anwendungen und auch für den VBA-Editor verwendet wird (siehe Listing 1).
Class MyAccessAddin Implements IDTExtensibility2 Implements IRibbonExtensibility Private _Access As Object ''VBIDE.VBE Private _AddIn As Object ''VBIDE.AddIn Sub OnConnection(ByVal Application As Object, ByVal ConnectMode As ext_ConnectMode, _ ByVal AddInInst As Object, ByRef custom As Variant()) _ Implements IDTExtensibility2.OnConnection MsgBox "myAccessAddin.OnConnection" Set _Access = Application Set _AddIn = AddInInst End Sub Sub OnDisconnection(ByVal RemoveMode As ext_DisconnectMode, ByRef custom As Variant()) _ Implements IDTExtensibility2.OnDisconnection MsgBox "myAccessAddin.OnDisconnection" End SUb Sub OnAddInsUpdate(ByRef custom As Variant()) _ Implements IDTExtensibility2.OnAddInsUpdate MsgBox "myAccessAddin.OnAddInsUpdate" End Sub Sub OnStartupComplete(ByRef custom As Variant()) _ Implements IDTExtensibility2.OnStartupComplete MsgBox "myAccessAddin.OnStartupComplete" End Sub Sub OnBeginShutdown(ByRef custom As Variant())_ Implements IDTExtensibility2.OnBeginShutdown MsgBox "myAccessAddin.OnBeginShutdown" End Sub End Class
Listing 1: Implementierung der Schnittstelle für COM-Add-Ins
Um diese in der Klasse unseres twinBASIC-Projekts zu implementieren, fügen wir dem Modul HelloWorld.twin die folgende Zeile hinzu:
Implements IDTExtensibility2
Diese Schnittstelle ist in der Bibliothek Microsoft Add-In Designer definiert, die genau wie die Implementierung der Schnittstelle bereits im Beispielprojekt enthalten ist. Die Verweise auf Bibliotheken finden Sie übrigens im Bereich Settings unter COM Type Library / ActiveX References (siehe Bild 3).
Bild 3: Notwendige Verweise für ein Access-Add-In
Hier haben wir auch gleich noch die Bibliothek Microsoft Office 16.0 Object Library hinzugefügt, denn wir wollen später auch noch ein Ribbon zum Aufrufen der Befehle des COM-Add-Ins zum Projekt hinzufügen. Diesen Verweis finden Sie schnell in der Liste, wenn Sie im Suchen-Feld Teile des Verweisnamens eingeben, beispielsweise Office.
Diese Schnittstelle enthält einige Ereignisprozeduren, die zu verschiedenen Gelegenheiten ausgelöst werden. Das Besondere an einer Schnittstelle ist, dass Sie alle dafür definierten Ereignisse implementieren müssen – auch wenn diese gar keine Befehle enthalten und somit nichts tun.
Die wichtigste Ereignisprozedur für diese Implementierung für uns ist in der Regel die Methode OnConnection. Diese wird aufgerufen, wenn Access startet und nachdem es im entsprechenden Registry-Zweig nachgesehen hat, ob irgendwelche COM-Add-Ins geladen werden müssen – dazu später mehr.
Diese Ereignisprozedur stellt zwei wichtige Parameter zur Verfügung:
- Application: Liefert einen Verweis auf das Application-Objekt der Anwendung, die das COM-Add-In aufruft.
- AddInInst: Liefert einen Verweis auf das AddIn-Objekt.
Mit dem Verweis auf das Application-Objekt der Anwendung können Sie dann vom Code des COM-Add-Ins aus auf die Anwendung selbst zugreifen. Um diesen Verweis während der Verwendung des COM-Add-Ins ständig im Zugriff zu haben, speichern wir es in einer Variablen, die wir wir folgt deklarieren:
Private _Access As Access.Application
Sie ahnen es bereits: Wenn wir Elemente der Access-Bibliothek verwenden, benötigen wir auch noch einen Verweis auf die Bibliothek Microsoft Access 16.0 Object Library. Diesen fügen Sie noch über den oben bereits erwähnten Bereich COM Type Library / ActiveX References hinzu.
Wichtig: Damit die enthaltenen Elemente auch im Code zur Verfügung stehen, müssen Sie die geänderten Einstellungen einmal speichern.
Das gelingt am einfachsten, wenn Sie noch während der Anzeige des Einstellungen-Bereichs die Tastenkombination Strg + S betätigen. Den mit dem Parameter AddInInst gelieferten Verweis speichern wir in der folgenden Variablen:
Private _AddIn As COMAddIn
Damit die beiden Parameter auch in diesen Variablen landen, fügen wir neben einer Meldungsanweisung die folgenden beiden Zeilen in die Ereignisprozedur OnConnection ein:
Sub OnConnection(ByVal Application As Object, _ ByVal ConnectMode As ext_ConnectMode, _ ByVal AddInInst As Object, _ ByRef custom As Variant()) _ Implements IDTExtensibility2.OnConnection MsgBox "myAccessAddin.OnConnection" Set _Access = Application Set _AddIn = AddInInst End Sub