{"id":55001306,"date":"2021-06-01T00:00:00","date_gmt":"2021-07-31T10:14:19","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1306"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"twinBASIC__COMAddIns_fuer_Access","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/","title":{"rendered":"twinBASIC &#8211; COM-Add-Ins f&uuml;r Access"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Neben COM-DLLs k&ouml;nnen Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfl&auml;che von Access angezeigt und genutzt werden k&ouml;nnen. Die M&ouml;glichkeiten sind unbegrenzt &#8211; Sie k&ouml;nnen damit beispielsweise Ribbon-Eintr&auml;ge hinzuf&uuml;gen, die dauerhaft und unabh&auml;ngig von der jeweils ge&ouml;ffneten Datenbank verf&uuml;gbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beitr&auml;gen an. Dieser Beitrag beleuchtet zun&auml;chst einmal die technischen Grundlagen f&uuml;r die Erstellung von COM-Add-Ins f&uuml;r die Access-Benutzeroberfl&auml;che.<\/b><\/p>\n<h2>COM-Add-Ins und Access-Add-Ins<\/h2>\n<p>Bevor wir in die Materie einsteigen, wollen wir den Unterschied zwischen COM-Add-Ins und Access-Add-Ins kl&auml;ren. Access-Add-Ins sind Access-Datenbanken, die eine spezielle Dateiendung enthalten und eine Tabelle namens <b>USysRegInfo <\/b>mit Eintr&auml;gen, welche Informationen &uuml;ber das Add-In zum Eintragen in die Registry enthalten.<\/p>\n<p>Diese rufen Sie schlie&szlig;lich &uuml;ber den Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins <\/b>auf. Bild 1 zeigt einige Add-Ins in der Access-Installation des Autors dieses Beitrags. Ein Klick auf einen dieser Eintr&auml;ge startet diesen und zeigt beispielsweise ein Formular mit den enthaltenen Funktionen an. Es gibt noch weitere M&ouml;glichkeiten, Access-Add-Ins zu platzieren &#8211; zum Beispiel als Steuerelement-Assistent oder Formular-Assistent.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_001.png\" alt=\"Access-Add-Ins\" width=\"649,559\" height=\"473,6957\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Access-Add-Ins<\/span><\/b><\/p>\n<p>Der wichtigste Unterschied zwischen Access-Add-Ins und den hier vorgestellten COM-Add-Ins f&uuml;r Access ist, dass Sie f&uuml;r COM-Add-Ins keine speziellen Orte vorfinden, an denen Sie deren Aufruf platzieren k&ouml;nnen. Stattdessen f&uuml;gen Sie einfach im gew&uuml;nschten Ribbon einen Eintrag hinzu oder auch ein eigenes Ribbon, &uuml;ber das Sie das COM-Add-In starten k&ouml;nnen. Der zweite wichtige Unterschied ist, dass Sie Access-Add-Ins komplett mit Access erstellen. Sie brauchen dann nur die Dateiendung von <b>.accdb <\/b>auf <b>.accda<\/b> zu &auml;ndern und die bereits erw&auml;hnte Tabelle namens <b>USysRegInfo <\/b>mit Informationen &uuml;ber die Art des Access-Add-Ins, den Namen et cetera sowie die auszuf&uuml;hrende Funktion hinzuzuf&uuml;gen.<\/p>\n<p>Ein COM-Add-In hingegen k&ouml;nnen Sie nicht einfach mit Access erstellen, sondern Sie ben&ouml;tigen dazu eine externe Entwicklungsumgebung. Fr&uuml;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.<\/p>\n<p>F&uuml;r die Erstellung von Access-Add-Ins musste man jedoch unter Visual Studio .NET immer improvisieren: Vorlagen gab es n&auml;mlich nur f&uuml;r die popul&auml;reren Office-Anwendungen wie Word, Outlook oder Excel.<\/p>\n<h2>Kein 64-Bit unter Visual Studio 6<\/h2>\n<p>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 <b>twinBASIC<\/b> erstellte COM-Add-Ins auch zukunftssicherer.<\/p>\n<h2>COM-Add-Ins mit twinBASIC<\/h2>\n<p>Im April 2021 hat jedoch Wayne Philips, der bereits mit dem Fehler- und Debugging-Tool vbWatchdog von sich h&ouml;ren machte, eine erste Version seiner Entwicklungsumgebung f&uuml;r VB- und VBA-kompatible Projekte ver&ouml;ffentlicht. Diese basiert auf Visual Studio Code und nutzt eine eigene Erweiterung f&uuml;r das Programmieren von VB- und VBA-Projekten.<\/p>\n<p>In K&uuml;rze soll man damit auch Anwendungen mit Benutzeroberfl&auml;che damit programmieren k&ouml;nnen, derzeit ist das aber noch nicht m&ouml;glich. F&uuml;r uns spielt das keine Rolle &#8211; wir schauen uns erst einmal die grundlegenden M&ouml;glichkeiten der Erstellung von COM-Add-Ins f&uuml;r die Access-Benutzeroberfl&auml;che an.<\/p>\n<p>Die Grundlagen zum Einrichten von Visual Studio Code und der f&uuml;r die VB-Programmierung ben&ouml;tigten Erweiterung haben wir bereits im Beitrag <b>twinBASIC &#8211; VB\/VBA mit moderner Umgebung <\/b>(<b>www.access-im-unternehmen.de\/1303<\/b>) beschrieben. Im vorliegenden Beitrag bauen wir auf einem einfachen Template f&uuml;r ein Access-COM-Add-In auf und erl&auml;utern die einzelnen Bestandteile. Anschlie&szlig;end f&uuml;gen wir dem COM-Add-In einige Beispielfunktionen hinzu.<\/p>\n<p>Wir starten mit einem Beispielprojekt, das Sie per Doppelklick auf die Datei <b>myAccessAddIn.code-workspace <\/b>starten. Dies &ouml;ffnet das Projekt im twinBASIC-Editor beziehungsweise in Visual Studio Code wie in Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_002.png\" alt=\"Aufbau eines Projekts f&uuml;r die Erstellung eines COM-Add-Ins\" width=\"700\" height=\"411,3093\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aufbau eines Projekts f&uuml;r die Erstellung eines COM-Add-Ins<\/span><\/b><\/p>\n<p>Die hier sichtbaren Prozeduren sind die Implementierung einer Schnittstelle namens <b>IDExtensibility2<\/b>, die bereits seit VB6 zum Implementieren der Funktionen f&uuml;r COM-Add-Ins f&uuml;r die verschiedenen Office-Anwendungen und auch f&uuml;r den VBA-Editor verwendet wird (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> MyAccessAddin\r\n     Implements IDTExtensibility2\r\n     Implements IRibbonExtensibility\r\n  \r\n     <span style=\"color:blue;\">Private <\/span>_Access<span style=\"color:blue;\"> As Object<\/span> ''VBIDE.VBE\r\n     <span style=\"color:blue;\">Private <\/span>_AddIn<span style=\"color:blue;\"> As Object<\/span> ''VBIDE.AddIn\r\n    \r\n     Sub OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, _\r\n             ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n             Implements IDTExtensibility2.OnConnection\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnConnection\"\r\n         <span style=\"color:blue;\">Set<\/span> _Access = Application\r\n         <span style=\"color:blue;\">Set<\/span> _AddIn = AddInInst\r\n     End Sub\r\n     \r\n     Sub OnDisconnection(ByVal RemoveMode<span style=\"color:blue;\"> As <\/span>ext_DisconnectMode, ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n             Implements IDTExtensibility2.OnDisconnection\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnDisconnection\"\r\n     End SUb\r\n     \r\n     Sub OnAddInsUpdate(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n             Implements IDTExtensibility2.OnAddInsUpdate\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnAddInsUpdate\"\r\n     End Sub\r\n     \r\n     Sub OnStartupComplete(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n             Implements IDTExtensibility2.OnStartupComplete\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnStartupComplete\"\r\n     End Sub\r\n     \r\n     Sub OnBeginShutdown(ByRef custom<span style=\"color:blue;\"> As Variant<\/span>())_\r\n             Implements IDTExtensibility2.OnBeginShutdown\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnBeginShutdown\"\r\n     End Sub\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Implementierung der Schnittstelle f&uuml;r COM-Add-Ins<\/span><\/b><\/p>\n<p>Um diese in der Klasse unseres twinBASIC-Projekts zu implementieren, f&uuml;gen wir dem Modul <b>HelloWorld.twin <\/b>die folgende Zeile hinzu:<\/p>\n<pre>Implements IDTExtensibility2<\/pre>\n<p>Diese Schnittstelle ist in der Bibliothek <b>Microsoft Add-In Designer <\/b>definiert, die genau wie die Implementierung der Schnittstelle bereits im Beispielprojekt enthalten ist. Die Verweise auf Bibliotheken finden Sie &uuml;brigens im Bereich <b>Settings <\/b>unter <b>COM Type Library \/ ActiveX References <\/b>(siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_003.png\" alt=\"Notwendige Verweise f&uuml;r ein Access-Add-In\" width=\"499,5589\" height=\"347,062\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Notwendige Verweise f&uuml;r ein Access-Add-In<\/span><\/b><\/p>\n<p>Hier haben wir auch gleich noch die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>hinzugef&uuml;gt, denn wir wollen sp&auml;ter auch noch ein Ribbon zum Aufrufen der Befehle des COM-Add-Ins zum Projekt hinzuf&uuml;gen. Diesen Verweis finden Sie schnell in der Liste, wenn Sie im Suchen-Feld Teile des Verweisnamens eingeben, beispielsweise <b>Office<\/b>.<\/p>\n<p>Diese Schnittstelle enth&auml;lt einige Ereignisprozeduren, die zu verschiedenen Gelegenheiten ausgel&ouml;st werden. Das Besondere an einer Schnittstelle ist, dass Sie alle daf&uuml;r definierten Ereignisse implementieren m&uuml;ssen &#8211; auch wenn diese gar keine Befehle enthalten und somit nichts tun.<\/p>\n<p>Die wichtigste Ereignisprozedur f&uuml;r diese Implementierung f&uuml;r uns ist in der Regel die Methode <b>OnConnection<\/b>. Diese wird aufgerufen, wenn Access startet und nachdem es im entsprechenden Registry-Zweig nachgesehen hat, ob irgendwelche COM-Add-Ins geladen werden m&uuml;ssen &#8211; dazu sp&auml;ter mehr.<\/p>\n<p>Diese Ereignisprozedur stellt zwei wichtige Parameter zur Verf&uuml;gung:<\/p>\n<ul>\n<li><b>Application<\/b>: Liefert einen Verweis auf das <b>Application<\/b>-Objekt der Anwendung, die das COM-Add-In aufruft.<\/li>\n<li><b>AddInInst<\/b>: Liefert einen Verweis auf das <b>AddIn<\/b>-Objekt.<\/li>\n<\/ul>\n<p>Mit dem Verweis auf das <b>Application<\/b>-Objekt der Anwendung k&ouml;nnen Sie dann vom Code des COM-Add-Ins aus auf die Anwendung selbst zugreifen. Um diesen Verweis w&auml;hrend der Verwendung des COM-Add-Ins st&auml;ndig im Zugriff zu haben, speichern wir es in einer Variablen, die wir wir folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>_Access<span style=\"color:blue;\"> As <\/span>Access.Application<\/pre>\n<p>Sie ahnen es bereits: Wenn wir Elemente der Access-Bibliothek verwenden, ben&ouml;tigen wir auch noch einen Verweis auf die Bibliothek <b>Microsoft Access 16.0 Object Library<\/b>. Diesen f&uuml;gen Sie noch &uuml;ber den oben bereits erw&auml;hnten Bereich <b>COM Type Library \/ ActiveX References <\/b>hinzu.<\/p>\n<p>Wichtig: Damit die enthaltenen Elemente auch im Code zur Verf&uuml;gung stehen, m&uuml;ssen Sie die ge&auml;nderten Einstellungen einmal speichern.<\/p>\n<p>Das gelingt am einfachsten, wenn Sie noch w&auml;hrend der Anzeige des Einstellungen-Bereichs die Tastenkombination <b>Strg + S <\/b>bet&auml;tigen. Den mit dem Parameter <b>AddInInst <\/b>gelieferten Verweis speichern wir in der folgenden Variablen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>_AddIn<span style=\"color:blue;\"> As <\/span>COMAddIn<\/pre>\n<p>Damit die beiden Parameter auch in diesen Variablen landen, f&uuml;gen wir neben einer Meldungsanweisung die folgenden beiden Zeilen in die Ereignisprozedur <b>OnConnection <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, _\r\n         ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n         ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) _\r\n         Implements IDTExtensibility2.OnConnection\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"myAccessAddin.OnConnection\"\r\n     <span style=\"color:blue;\">Set<\/span> _Access = Application\r\n     <span style=\"color:blue;\">Set<\/span> _AddIn = AddInInst\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Mit der Meldung pr&uuml;fen wir, ob das COM-Add-In &uuml;berhaupt geladen wird.<\/p>\n<h2>Erstellen des COM-Add-Ins<\/h2>\n<p>Wenn Sie die <b>Build<\/b>-Schaltfl&auml;che in der twinBASIC-Erweiterung von Visual Studio Code verwenden, erstellt dies nicht nur die DLL-Datei mit dem COM-Add-In, sondern es werden bereits die grundlegenden Registrierungseintr&auml;ge vorgenommen. Das sind die Eintr&auml;ge, die auch f&uuml;r die Registrierung einer einfachen COM-DLL notwendig sind. <\/p>\n<p>Ob das COM-Add-In erfolgreich erstellt wurde, entnehmen Sie dem Bereich <b>Debugging-Console <\/b>von Visual Studio Code (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_009.png\" alt=\"Ausgabe beim erfolgreichen Erstellen des COM-Add-Ins\" width=\"700\" height=\"150,5097\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausgabe beim erfolgreichen Erstellen des COM-Add-Ins<\/span><\/b><\/p>\n<h2>Registrierung des COM-Add-Ins<\/h2>\n<p>F&uuml;r ein COM-Add-In sind aber noch ein paar weitere Eintr&auml;ge notwendig, die Sie aktuell noch manuell hinzuf&uuml;gen m&uuml;ssen. Wobei manuell bedeutet, dass Sie eine Registrierungsdatei aufrufen m&uuml;ssen, die dann die einzelnen Schritte f&uuml;r Sie erledigt.<\/p>\n<p>Dazu legen Sie eine Textdatei mit der Dateiendnung <b>.reg<\/b> an, der Sie den Inhalt aus Listing 2 hinzuf&uuml;gen. Nachdem Sie diese Datei erstellt und gespeichert haben, rufen Sie diese per Doppelklick auf.<\/p>\n<pre>Windows Registry Editor Version 5.00\r\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\MyAccessAddIn.MyAccessAddin]\r\n\"FriendlyName\"=\"MyAccessAddin (friendly name)\"\r\n\"Description\"=\"MyAccessAddin (description)\"\r\n\"LoadBehavior\"=dword:00000003<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Registrierungseintrag f&uuml;r das COM-Add-In<\/span><\/b><\/p>\n<p>Anschlie&szlig;end k&ouml;nnen Sie in der Registrierung von Windows pr&uuml;fen, ob alle ben&ouml;tigten Eintr&auml;ge vorgenommen wurden. Den Registrierungseditor &ouml;ffnen Sie durch Eingabe von <b>regedit <\/b>in das Suchen-Fenster von Windows und  das anschlie&szlig;ende Aufrufen der Anwendung <b>Registrierungs-Editor<\/b>.<\/p>\n<p>Hier navigieren Sie zum Zweig <b>HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\MyAccess-AddIn<\/b>, der wie in Bild 5 aussehen sollte.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_004.png\" alt=\"Eintr&auml;ge f&uuml;r das COM-Add-In in die Windows-Registrierung\" width=\"649,559\" height=\"327,9174\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Eintr&auml;ge f&uuml;r das COM-Add-In in die Windows-Registrierung<\/span><\/b><\/p>\n<h2>Erster Start des COM-Add-Ins<\/h2>\n<p>Damit k&ouml;nnen wir das COM-Add-In erstmalig testen. Hier noch einmal die Voraussetzungen:<\/p>\n<ul>\n<li>Zus&auml;tzliche Verweise auf <b>Microsoft Office 16.0 Object Library <\/b>und <b>Microsoft Access 16.0 Office Library <\/b>hinzugef&uuml;gt und Einstellungen anschlie&szlig;end gespeichert<\/li>\n<li>Code des Beispiel-COM-Add-Ins wie beschrieben angepasst<\/li>\n<li><b>Build<\/b>-Schaltfl&auml;che gedr&uuml;ckt und somit das COM-Add-In erstellt<\/li>\n<li>Registrierungsdatei ausgef&uuml;hrt<\/li>\n<\/ul>\n<p>Ob das COM-Add-In erstellt wurde, k&ouml;nnen Sie im Ordner <b>Build<\/b> des Projektordners pr&uuml;fen &#8211; hier sollten Sie eine neu erstellte <b>.dll<\/b>-Datei vorfinden.<\/p>\n<p>Wenn Sie danach Access starten, sollte eine MsgBox erscheinen, die den Text <b>myAccessAddin.OnConnection <\/b>anzeigt. Damit haben wir die Basis f&uuml;r ein Access-Add-In gelegt.<\/p>\n<h2>Ribbon-Eintrag zum Steuern der Funktionen hinzuf&uuml;gen<\/h2>\n<p>Wenn Sie die Funktionen des COM-Add-Ins aufrufen wollen, gibt es unter Access keine andere M&ouml;glichkeit als einen Ribbon-Befehl.<\/p>\n<p>Diesen m&uuml;ssen wir allerdings erst einmal hinzuf&uuml;gen. Dazu gibt es eine weitere Schnittstelle, die wir normalerweise wie folgt zur Klasse unseres Projekts hinzuf&uuml;gen:<\/p>\n<pre>Implements IRibbonExtensibility<\/pre>\n<p>Es gibt jedoch eine kleine Erweiterung, die wir im Falle der Erstellung des COM-Add-Ins mit twinBASIC hinzuf&uuml;gen m&uuml;ssen. Dabei handelt es sich um die Eigenschaft <b>WithDispatchForwarding<\/b>, die Sie der <b>Implements<\/b>-Anweisung voranstellen:<\/p>\n<pre>[WithDispatchForwarding]\r\nImplements IRibbonExtensibility<\/pre>\n<p>Der Grund ist, dass sonst kein Aufruf der Callback-Funktionen in der COM-DLL m&ouml;glich ist.<\/p>\n<p>Die Schnittstelle <b>IRibbonExtensibility <\/b>ist Teil der oben bereits per Verweis eingebundenen Bibliothek <b>Microsoft Office 16.0 Object Library<\/b>. Haben Sie diesen also noch nicht hinzugef&uuml;gt, ist jetzt ein geeigneter Zeitpunkt daf&uuml;r gekommen (Speichern der Einstellungen anschlie&szlig;end nicht vergessen).<\/p>\n<p>Diese Schnittstelle erfordert nur die Implementierung einer einzigen Ereignisprozedur, n&auml;mlich <b>GetCustomUI<\/b>.<\/p>\n<p>Diese hat einen <b>String<\/b>-Parameter namens <b>Ribbon-ID<\/b>, der die anzuwendende Ribbon-Definition erwartet. Listing 3 zeigt, wie wir die Ribbon-Definition in dieser Ereignisprozedur zusammenstellen.<\/p>\n<pre><span style=\"color:blue;\">Class<\/span> MyAccessAddin\r\n     ...    \r\n     <span style=\"color:blue;\">Private <\/span>Function IRibbonExtensibility_GetCustomUI( ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n         <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n         strXML = \"&lt;customUI xmlns=\"\"http:\/\/schemas.microsoft.com\/office\/2006\/01\/customui\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"  &lt;ribbon startFromScratch=\"\"false\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"    &lt;tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"      &lt;tab id=\"\"tabBeispiel\"\" label=\"\"COMAddIn\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"        &lt;group id=\"\"grpBeispiel\"\" label=\"\"Funktionen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"          &lt;button id=\"\"btnBefehl1\"\" label=\"\"Befehl1\"\" onAction=\"\"onAction\"\" \" _\r\n             & \"imageMso=\"\"BlogHomePage\"\" size=\"\"large\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"          &lt;button id=\"\"btnBefehl2\"\" label=\"\"Befehl2\"\" onAction=\"\"onAction\"\" \" _\r\n             & \"imageMso=\"\"AccessTableEvents\"\" size=\"\"large\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"          &lt;button id=\"\"btnBefehl3\"\" label=\"\"Befehl3\"\" onAction=\"\"onAction\"\" \" _\r\n             & \"imageMso=\"\"CustomTablesGallery\"\" size=\"\"large\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"        &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"      &lt;\/tab&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"    &lt;\/tabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"  &lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strXML = strXML & \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> strXML\r\n         IRibbonExtensibility_GetCustomUI = strXML\r\n     End Function\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Zusammenstellen der Ribbon-Definition<\/span><\/b><\/p>\n<p>Das Ergebnis nach dem erneuten Erstellen des COM-Add-Ins und dem &Ouml;ffnen von Access sehen Sie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_005.png\" alt=\"Ribbon-Befehle des COM-Add-Ins\" width=\"574,559\" height=\"266,0149\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Ribbon-Befehle des COM-Add-Ins<\/span><\/b><\/p>\n<p>F&uuml;r die in der Ribbon-Definition festgelegten Prozeduren f&uuml;r die <b>onAction<\/b>-Attribute hinterlegen wir nun noch Callbackroutinen in der Klasse.<\/p>\n<p>F&uuml;rs Erste reicht eine allgemeine Callback-Funktion, die einfach nur den Namen der aufrufenden Ribbon-Schaltfl&auml;che ausgibt:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben folgende Ribbon-Schaltfl&auml;che angeklickt: ''\" & control.Id & \"''\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Erstellen Sie das COM-Add-In nun neu und starten danach Access, k&ouml;nnen Sie mit einem Klick auf eine der Ribbon-Schaltfl&auml;che die gew&uuml;nschte Meldung anzeigen (siehe Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_006.png\" alt=\"Durch das Ribbon aufgerufene Meldung\" width=\"524,559\" height=\"314,7353\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Durch das Ribbon aufgerufene Meldung<\/span><\/b><\/p>\n<h2>Registrierung fixen<\/h2>\n<p>Wenn Sie das COM-Add-In erstellt und registriert haben, kann es beim &Ouml;ffnen von Access zu Laufzeitfehlern im COM-Add-In kommen. Tritt ein solcher Fehler auf, wird das COM-Add-In in der Regel deaktiviert &#8211; manchmal mit und manchmal ohne entsprechende Meldung.<\/p>\n<p>Diese Deaktivierung wirkt sich so aus, dass der Wert der Eigenschaft <b>LoadBehaviour <\/b>in der Registry auf den Wert <b>2 <\/b>statt <b>3 <\/b>eingestellt wird (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_007.png\" alt=\"Zur&uuml;ckgesetztes Ladeverhalten\" width=\"649,559\" height=\"327,9174\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Zur&uuml;ckgesetztes Ladeverhalten<\/span><\/b><\/p>\n<p>Um dies zu &auml;ndern, haben Sie zun&auml;chst die M&ouml;glichkeit, den Wert gleich in der Registry wieder auf <b>3 <\/b>einzustellen. Das COM-Add-In wird dann beim n&auml;chsten Start von Access wieder geladen. Allerdings sollten Sie dann auch in Visual Studio Code den Fehler beheben und das COM-Add-In neu kompilieren.<\/p>\n<p>Die zweite M&ouml;glichkeit ist der erneute Aufruf der Registrierungsdatei <b>RegisterAddin32.reg<\/b>. Dies &uuml;berschreibt einfach den vorhandenen Eintrag.<\/p>\n<p>Sie k&ouml;nnen sich allerdings auch in Access selbst einen &Uuml;berblick dar&uuml;ber verschaffen, welche COM-Add-Ins &uuml;berhaupt gerade geladen werden und welche zwar registriert sind, aber nicht geladen werden. Dazu &ouml;ffnen Sie den <b>Optionen<\/b>-Dialog von Access und wechseln dort zum Bereich <b>Add-Ins<\/b>.<\/p>\n<p>Hier w&auml;hlen Sie unter <b>Verwalten: <\/b>den Eintrag <b>COM-Add-Ins <\/b>aus und zeigen mit einem Klick auf <b>Los&#8230; <\/b>den Dialog aus Bild 9 an. Wenn vor dem Namen des betroffenen COM-Add-Ins kein Haken gesetzt ist, dann wurde das COM-Add-In deaktiviert. Sie k&ouml;nnen es hier durch Setzen des Hakens wieder aktivieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_008.png\" alt=\"Das COM-Add-In ist deaktiviert.\" width=\"649,559\" height=\"252,6062\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das COM-Add-In ist deaktiviert.<\/span><\/b><\/p>\n<p>Hier gilt wie f&uuml;r alle anderen professionellen Anwendungen: Mit einer konsistenten Fehlerbehandlung k&ouml;nnen Sie solche Nebenwirkungen wie die Deaktivierung von COM-Add-Ins leicht verhindern.<\/p>\n<h2>Neuerstellen nach einem Fehler<\/h2>\n<p>Wenn Sie das COM-Add-In neu erstellen, nachdem Sie einen Fehler korrigiert oder andere &Auml;nderungen vorgenommen haben, wird Ihnen voraussichtlich der folgende Fehler unterlaufen: Sie erstellen das COM-Add-In neu, w&auml;hrend noch eine Access-Instanz ge&ouml;ffnet ist, die auf das Add-In zugreift. Zu diesem Zeitpunkt ist die DLL-Datei des COM-Add-Ins jedoch noch schreibgesch&uuml;tzt und kann nicht gel&ouml;scht und erneuert werden. Wenn Sie nicht aufmerksam sind, entgeht Ihnen dann auch noch die Meldung aus dem Debugging-Bereich aus Bild 10.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_010.png\" alt=\"Fehler beim Versuch, das COM-Add-In zu erstellen\" width=\"649,559\" height=\"173,7674\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Fehler beim Versuch, das COM-Add-In zu erstellen<\/span><\/b><\/p>\n<p>An dieser Stelle hei&szlig;t es also einfach: Alle Access-Instanzen schlie&szlig;en, die gegebenenfalls noch auf das COM-Add-In zugreifen k&ouml;nnten, und das Erstellen des COM-Add-Ins erneut starten. Je nachdem, ob Sie das COM-Add-In wegen eines Fehlers aktualisiert haben, sollten Sie auch noch die Registrierungseintr&auml;ge aktualisieren.<\/p>\n<h2>Zugriff auf die Access-Instanz<\/h2>\n<p>&Uuml;ber den Parameter <b>Application <\/b>liefert die Ereignisprozedur <b>OnConnection <\/b>einen Verweis auf die aufrufende Anwendung, &uuml;ber den Parameter <b>AddinInst <\/b>k&ouml;nnen Sie auf das COM-Add-In selbst zugreifen.<\/p>\n<p>Diese beiden Parameterwerte speicherten wir ja bereits in entsprechenden Variablen, n&auml;mlich in <b>_Access <\/b>und <b>_AddIn<\/b>.<\/p>\n<p>Wenn Sie nun vom COM-Add-In auf die Access-Instanz zugreifen wollen, ist die Variable <b>_Access <\/b>die erste Anlaufstelle. Diese liefert einen Objektverweis auf die Access-Instanz zur&uuml;ck, die das COM-Add-In geladen hat. Diese k&ouml;nnen Sie sp&auml;ter nutzen, um etwa beim Bet&auml;tigen eines Ribbon-Befehls die gew&uuml;nschten Elemente von Access zu referenzieren.<\/p>\n<h2>Beispiele f&uuml;r den Zugriff auf die Access-Instanz<\/h2>\n<p>Wir machen ein kleines Beispiel, das die M&ouml;glichkeiten erahnen l&auml;sst. Wir wollen bei einem in der Formularansicht ge&ouml;ffneten Formular jeweils ermitteln, wie das Steuerelement mit dem Fokus hei&szlig;t. Das w&auml;re eine enorme Hilfe, weil man so beispielsweise schnell die passenden Ereignisse im VBA-Editor aufsuchen k&ouml;nnte.<\/p>\n<p>Also &auml;ndern wir die <b>onAction<\/b>-Prozedur in unserem Projekt wie folgt, um der Schaltfl&auml;che <b>btnBeispiel1 <\/b>eine Funktion zuzuweisen:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     Select Case Control.Id\r\n         <span style=\"color:blue;\">Case <\/span>\"btnBefehl1\"\r\n             <span style=\"color:blue;\">Call<\/span> GetControlname\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Sie haben folgende Ribbon-Schaltfl&auml;che &micro; \r\n                          angeklickt: ''\" & control.Id & \"''\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir wollen also f&uuml;r die Schaltfl&auml;che <b>btnBefehl1<\/b>, deren Name f&uuml;r die Eigenschaft <b>Id <\/b>des Parameters <b>control <\/b>&uuml;bergeben wird, eine eigene Prozedur anlegen. F&uuml;r alle anderen Schaltfl&auml;chen unserer eigenen Ribbon-Definition soll die Callback-Funktion <b>onAction <\/b>weiterhin einfach den Namen der Schaltfl&auml;che ausgeben.<\/p>\n<p>Diese neue Prozedur soll wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>GetControlName()\r\n     <span style=\"color:blue;\">Dim <\/span>obj<span style=\"color:blue;\"> As Object<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> obj = _Access.Screen.ActiveControl\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> obj Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Name des aktuellen Steuerelements: \"  & obj.Name\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Kein aktives Steuerelement.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir weisen hier als Erstes der Variablen <b>obj <\/b>mit dem Typ <b>Object <\/b>das aktuelle Steuerelelement zu. Das setzt voraus, dass &uuml;berhaupt ein Formular ge&ouml;ffnet ist, dass dann auch noch ein Steuerelement enthalten muss. Es kann aber auch sein, dass gerade kein Formular ge&ouml;ffnet ist &#8211; dann wird der Zugriff auf das aktuelle Steuerelement mit <b>_Access.Screen.ActiveControl <\/b>einen Fehler ausl&ouml;sen. Den verhindern wir direkt durch die vorherige Anweisung <b>On Error Resume Next<\/b>.<\/p>\n<p>Ist <b>obj <\/b>dann nicht leer, gibt die Prozedur per <b>MsgBox <\/b>den Namen des aktuellen Steuerelements aus. Anderenfalls erscheint eine Meldung, dass kein Steuerelement aktiv ist.<\/p>\n<p>Man k&ouml;nnte noch genauer aufschl&uuml;sseln und pr&uuml;fen, ob &uuml;berhaupt ein Formular ge&ouml;ffnet ist, aber das ist an dieser Stelle nicht wichtig.<\/p>\n<p>Wichtig ist: Es funktioniert! Sie k&ouml;nnen so Befehle in einem COM-Add-In definieren, die &uuml;ber benutzerdefinierte Ribbon-Schaltfl&auml;chen ausgel&ouml;st werden und mit denen Sie direkt die Elemente der aktuellen Anwendung erfassen oder anpassen k&ouml;nnen. <\/p>\n<h2>Auf die Daten der Anwendung zugreifen<\/h2>\n<p>Wenn Sie nun noch auf die Daten der aktuellen Anwendung zugreifen wollen, ben&ouml;tigen Sie Zugriff &uuml;ber das <b>Database<\/b>-Objekt dieser Datenbank.<\/p>\n<p>Auch das ist grunds&auml;tzlich kein Problem, aber um die Elemente der DAO-Bibliothek zu verwenden, ben&ouml;tigen wir als Erstes wieder einen entsprechenden Verweis. Der hei&szlig;t <b>Microsoft DAO 3.6 Object Library <\/b>und ist schnell gesetzt, wie Bild 11 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_011.png\" alt=\"Verweis auf die DAO-Bibliothek hinzuf&uuml;gen\" width=\"549,559\" height=\"391,6793\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Verweis auf die DAO-Bibliothek hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Hier zeigt sich, dass twinBASIC noch am Anfang ist: Bereits erstellte Bibliotheken tauchen gegebenenfalls mehrmals auf, weil diese noch nicht sauber aus der Registry entfernt werden.<\/p>\n<p>Nach dem Hinzuf&uuml;gen der DAO-Bibliothek und &#8211; wichtig &#8211; dem Speichern der ge&auml;nderten Einstellungen stehen die Elemente dieser Bibliothek f&uuml;r die Programmierung zur Verf&uuml;gung.<\/p>\n<p>Damit k&ouml;nnen wir die Umsetzung in Angriff nehmen. Die neue Prozedur sieht wie folgt aus und wird &auml;hnlich wie die zuvor beschriebene von der Funktion <b>onAction<\/b> aus aufgerufen:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>GetTables()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>tdf<span style=\"color:blue;\"> As <\/span>DAO.TableDef\r\n     <span style=\"color:blue;\">Dim <\/span>strTables<span style=\"color:blue;\"> As String<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = _Access.CurrentDb\r\n     <span style=\"color:blue;\">If <\/span>db Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es ist keine Datenbank  ge&ouml;ffnet.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         For Each tdf In db.TableDefs\r\n             strTables = strTables  & tdf.Name & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> tdf            \r\n         <span style=\"color:blue;\">MsgBox<\/span> strTables\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In Bild 12 sehen Sie die Ausgabe durch diese Funktion des COM-Add-Ins. Es erscheinen wie gew&uuml;nscht alle Tabellen im Meldungsfenster. In der Prozedur <b>GetTables <\/b>haben wir keine Zauberei betrieben. Der Unterschied zu einer lokalen Prozedur dieser Art ist, dass wir hier nicht einfach auf die <b>CurrentDb<\/b>-Funktion zugreifen, um eine Referenz auf das <b>Database<\/b>-Objekt der aktuellen Datenbank zu erhalten. Stattdessen nutzen wir die <b>CurrentDb<\/b>-Funktion der in <b>_Access <\/b>gespeicherten Instanz des <b>Access.Application<\/b>-Objekts.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_03\/pic_1306_012.png\" alt=\"Ausgabe aller Tabellen per Ribbon und COM-Add-In\" width=\"424,5589\" height=\"574,46\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Ausgabe aller Tabellen per Ribbon und COM-Add-In<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt die umfassenden M&ouml;glichkeiten von twinBASIC und Visual Studio Code zum Erstellen von COM-Add-Ins f&uuml;r Access. In einem weiteren Beitrag namens <b>twinBASIC &#8211; COM-Add-Ins f&uuml;r den VBA-Editor <\/b>(<b>www.access-im-unternehmen.de\/1307<\/b>) zeigen wir, wie Sie den VBA-Editor mit COM-Add-Ins erweitern k&ouml;nnen.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>twinBASIC_myAccessAddin.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/4DCB9CD8-A36E-40CD-BCAF-22B89E7B1F25\/aiu_1306.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neben COM-DLLs k&ouml;nnen Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfl&auml;che von Access angezeigt und genutzt werden k&ouml;nnen. Die M&ouml;glichkeiten sind unbegrenzt &#8211; Sie k&ouml;nnen damit beispielsweise Ribbon-Eintr&auml;ge hinzuf&uuml;gen, die dauerhaft und unabh&auml;ngig von der jeweils ge&ouml;ffneten Datenbank verf&uuml;gbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beitr&auml;gen an. Dieser Beitrag beleuchtet zun&auml;chst einmal die technischen Grundlagen f&uuml;r die Erstellung von COM-Add-Ins f&uuml;r die Access-Benutzeroberfl&auml;che.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66032021,44000025],"tags":[],"class_list":["post-55001306","post","type-post","status-publish","format-standard","hentry","category-662021","category-66032021","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>twinBASIC - COM-Add-Ins f&uuml;r Access - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"twinBASIC - COM-Add-Ins f&uuml;r Access\" \/>\n<meta property=\"og:description\" content=\"Neben COM-DLLs k&ouml;nnen Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfl&auml;che von Access angezeigt und genutzt werden k&ouml;nnen. Die M&ouml;glichkeiten sind unbegrenzt - Sie k&ouml;nnen damit beispielsweise Ribbon-Eintr&auml;ge hinzuf&uuml;gen, die dauerhaft und unabh&auml;ngig von der jeweils ge&ouml;ffneten Datenbank verf&uuml;gbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beitr&auml;gen an. Dieser Beitrag beleuchtet zun&auml;chst einmal die technischen Grundlagen f&uuml;r die Erstellung von COM-Add-Ins f&uuml;r die Access-Benutzeroberfl&auml;che.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-31T10:14:19+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"twinBASIC &#8211; COM-Add-Ins f&uuml;r Access\",\"datePublished\":\"2021-07-31T10:14:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/\"},\"wordCount\":3003,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/cda796d721474108be7b936c94895dc9\",\"articleSection\":[\"2021\",\"3\\\/2021\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/\",\"name\":\"twinBASIC - COM-Add-Ins f&uuml;r Access - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/cda796d721474108be7b936c94895dc9\",\"datePublished\":\"2021-07-31T10:14:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/cda796d721474108be7b936c94895dc9\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/cda796d721474108be7b936c94895dc9\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/twinBASIC__COMAddIns_fuer_Access\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"twinBASIC &#8211; COM-Add-Ins f&uuml;r Access\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"twinBASIC - COM-Add-Ins f&uuml;r Access - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/","og_locale":"de_DE","og_type":"article","og_title":"twinBASIC - COM-Add-Ins f&uuml;r Access","og_description":"Neben COM-DLLs k&ouml;nnen Sie mit twinBASIC auch COM-Add-Ins programmieren, deren Funktionen dann in der Benutzeroberfl&auml;che von Access angezeigt und genutzt werden k&ouml;nnen. Die M&ouml;glichkeiten sind unbegrenzt - Sie k&ouml;nnen damit beispielsweise Ribbon-Eintr&auml;ge hinzuf&uuml;gen, die dauerhaft und unabh&auml;ngig von der jeweils ge&ouml;ffneten Datenbank verf&uuml;gbar sind und damit selbst programmierte Funktionen aufrufen. Welche Funktionen sinnvoll sind und sich hier umsetzen lassen, schauen wir uns in weiteren Beitr&auml;gen an. Dieser Beitrag beleuchtet zun&auml;chst einmal die technischen Grundlagen f&uuml;r die Erstellung von COM-Add-Ins f&uuml;r die Access-Benutzeroberfl&auml;che.","og_url":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/","og_site_name":"Access im Unternehmen","article_published_time":"2021-07-31T10:14:19+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"twinBASIC &#8211; COM-Add-Ins f&uuml;r Access","datePublished":"2021-07-31T10:14:19+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/"},"wordCount":3003,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9","articleSection":["2021","3\/2021","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/","url":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/","name":"twinBASIC - COM-Add-Ins f&uuml;r Access - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9","datePublished":"2021-07-31T10:14:19+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/cda796d721474108be7b936c94895dc9"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/twinBASIC__COMAddIns_fuer_Access\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"twinBASIC &#8211; COM-Add-Ins f&uuml;r Access"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001306"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001306\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}