{"id":55001607,"date":"2026-08-01T00:00:00","date_gmt":"2026-07-04T14:02:58","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1607"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"AccessInfos_per_COMAddIn_anzeigen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/","title":{"rendered":"Access-Infos per COM-Add-In anzeigen"},"content":{"rendered":"<p><b>Im Beitrag &#8222;Access: Version und Architektur einfach ermitteln&#8220; (www.access-im-unternehmen.de\/1606) haben wir die neuen SysCmd-Konstanten zum Abfragen von Access-Version und Access-Architektur vorgestellt. Dort haben wir auch gezeigt, wie wir diese Informationen &uuml;bersichtlich in einem Formular darstellen k&ouml;nnen. Im vorliegenden Beitrag erstellen wir nun ein COM-Add-In, das den Dateibereich von Access erweitert und dort die verschiedenen Versionsinformationen, die Architektur und den aktuellen Update-Kanal von Access anzeigt. Au&szlig;erdem liefern wir dort auch gleich noch den aktuellen Datenbankpfad und eine M&ouml;glichkeit, diesen in die Zwischenablage zu kopieren.<\/b><\/p>\n<p>Die neuen <b>SysCmd<\/b>-Konstanten wie <b>acSysCmdGetMsoBuildNumber <\/b>oder <b>acSysCmdGetBitness <\/b>bieten uns die M&ouml;glichkeit, Versionsinformationen oder die Architektur der aktuellen Installation von Microsoft Access per VBA zu ermitteln.<\/p>\n<p>Damit erhalten wir eine Alternative dazu, die Informationen umst&auml;ndlich &uuml;ber das Datei-Men&uuml; von Access zu ermitteln. Wenn wir allerdings die Version und die Bitness der Anwendung eines Kunden abfragen wollen, ist es wohl ebenso umst&auml;ndlich, diesem die entsprechende <b>SysCmd<\/b>-Anweisung zur Eingabe in den Direktbereich des VBA-Editors zu diktieren und uns das Ergebnis mitteilen zu lassen.<\/p>\n<p>Da wir in fr&uuml;heren Beitr&auml;gen bereits einige COM-Add-Ins mit dem zumindest f&uuml;r die 32-Bit-Version kostenlosen twinBASIC programmiert haben (das Kompilieren von 64-Bit-COM-Add-Ins ist auch m&ouml;glich, allerdings wird dort bei jedem Start ein Spash-Screen eingeblendet), wollen wir hier ein weiteres Beispiel daf&uuml;r liefern, wie man die Benutzerumgebung von Access selbst um praktische Funktionen erweitern kann.<\/p>\n<p>Das Ergebnis sehen wir vorab in Bild 1. Wenn der Benutzer im Ribbon auf Datei klickt, findet er im Datei-Men&uuml; direkt einen Eintrag namens amvAccessSpecs. Dahinter zeigt sich die Ansicht mit den Access-Spezifikationen, die wir &uuml;berwiegend mit den neuen SysCmd-Konstanten ermittelt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_04\/pic_1607_001.png\" alt=\"Neuer Bereich im Datei-Abschnitt des Ribbons von Microsoft Access\" width=\"700\" height=\"346,5723\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Neuer Bereich im Datei-Abschnitt des Ribbons von Microsoft Access<\/span><\/b><\/p>\n<p>Au&szlig;erdem haben wir noch den aktuellen Datenbankpfad hinzugef&uuml;gt, den wir entweder markieren und kopieren oder auch direkt im Windows Explorer &ouml;ffnen k&ouml;nnen.<\/p>\n<h2>Funktionsweise des COM-Add-Ins<\/h2>\n<p>An dieser Stelle wollen wir uns die Beschreibung sparen, wie das vollst&auml;ndige COM-Add-In auf Basis der Vorlage <b>Sample 5 &#8211; MyCOMAddIn <\/b>erstellen &#8211; letztlich m&uuml;ssen wir dort nur den anschlie&szlig;end vorgestellten Code ersetzen.<\/p>\n<p>Also empfehlen wir, zum Studium und f&uuml;r eigene Anpassungen einfach das mit dem Download gelieferte twinBASIC-Projekt namens <b>amvAccessSpecs.twinproj <\/b>zu nutzen.<\/p>\n<p>Die Auflistung der Versionen von twinBASIC finden Sie unter dem folgenden Link:<\/p>\n<pre>https:\/\/github.com\/twinbasic\/twinbasic\/releases<\/pre>\n<p>Hier klicken wir auf die aktuellste Version und laden diese wie in Bild 2 herunter &#8211; hier die Version <b>twinBASIC BETA 983<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_04\/pic_1607_002.png\" alt=\"Herunterladen der aktuellen twinBASIC-Version\" width=\"700\" height=\"584,9072\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Herunterladen der aktuellen twinBASIC-Version<\/span><\/b><\/p>\n<p>Und keine Sorge wegen des Beta-Status &#8211; die damit erzeugten COM-Add-Ins funktionieren einwandfrei.<\/p>\n<h2>Projekteigenschaften<\/h2>\n<p>In den Projekteigenschaften haben wir <b>Projekt Name<\/b>, <b>Project Description <\/b>und <b>Application Title <\/b>jeweils auf <b>amvAccessSpecs <\/b>eingestellt.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir Verweise auf die Bibliotheken <b>Microsoft Office 16.0 Object Library <\/b>und <b>Microsoft Access 16.0 Object Library<\/b>.<\/p>\n<h2>Code des COM-Add-Ins<\/h2>\n<p>Der Code, der das COM-Add-In beim Starten von Access l&auml;dt und f&uuml;r die Anzeige des neuen Bereichs im Backstage sorgt, befindet sich im Modul <b>amvAccessSpecs.twin<\/b>.<\/p>\n<p>Diesen &ouml;ffnen wir durch einen Doppelklick auf den entsprechenden Eintrag im Projektexplorer (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_04\/pic_1607_003.png\" alt=\"&Uuml;berblick des Projekts und das Modul amvAccessSpecs.twin\" width=\"700\" height=\"487,8787\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: &Uuml;berblick des Projekts und das Modul amvAccessSpecs.twin<\/span><\/b><\/p>\n<p>Wir schauen uns den Code nun Schritt f&uuml;r Schritt an.<\/p>\n<h2>Die Klasse und ihre Schnittstellen<\/h2>\n<p>Im oberen Bereich des Moduls finden wir die Deklaration der Klasse <b>amvAccessSpecs<\/b> samt den beiden Schnittstellen, die sie umsetzt.<\/p>\n<p>Ganz oben sehen wir die <b>ClassId<\/b>:<\/p>\n<pre>[ClassId(\"319E65DE-8BB5-4F-890C-598D98FCCC22\")]<\/pre>\n<p>Die <b>ClassId <\/b>ist die eindeutige Identit&auml;t der COM-Klasse &#8211; ein weltweit einmaliger Schl&uuml;ssel (eine GUID), unter dem Windows das COM-Add-In in der Registry findet und startet.<\/p>\n<p>Der Hintergrund: COM-Objekte werden nicht &uuml;ber ihren Namen angesprochen, sondern &uuml;ber diese GUID (CLSID genannt). Wenn Access das Add-In l&auml;dt, schaut es in der Registry unter genau dieser Nummer nach, wo die zugeh&ouml;rige Datei liegt und welche Klasse zu instanziieren ist. Der Klassenname <b>amvAccessSpecs <\/b>ist nur f&uuml;r uns als Entwickler da; Windows arbeitet intern mit der GUID.<\/p>\n<p>Deshalb ist zweierlei wichtig: Die Nummer muss wirklich einmalig sein (twinBASIC erzeugt sie zuf&auml;llig, die Wahrscheinlichkeit einer Kollision ist praktisch null), und sie sollte stabil bleiben. &Auml;ndern wir sie nachtr&auml;glich, gilt das Add-In f&uuml;r Windows als ein v&ouml;llig anderes Objekt &#8211; die alte Registrierung zeigt dann ins Leere, und wir m&uuml;ssten neu registrieren. Beim Weitergeben oder Aktualisieren des Add-Ins lassen wir die <b>ClassId <\/b>also unver&auml;ndert.<\/p>\n<p>Kurz gesagt: Sie ist der Personalausweis der Klasse, &uuml;ber den COM sie zweifelsfrei wiederfindet.<\/p>\n<p>Anschlie&szlig;end folgt die Definition der Klasse <b>amvAccessSpecs <\/b>selbst mit den beiden Schnittstellen, die sie implementiert:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> amvAccessSpecs\r\n    Implements IDTExtensibility2\r\n    [WithDispatchForwarding]\r\n    Implements IRibbonExtensibility\r\n    Friend objAccess<span style=\"color:blue;\"> As <\/span>Access.application<\/pre>\n<p>Eine Schnittstelle ist so etwas wie ein Versprechen: Wer sie umsetzt, sagt zu, bestimmte Prozeduren bereitzustellen. <b>IDTExtensibility2<\/b> sorgt daf&uuml;r, dass Office unser Add-In starten und beenden kann. <b>IRibbonExtensibility<\/b> erlaubt es uns, dem Men&uuml;band &#8211; genauer dem Datei-Men&uuml; &#8211; etwas hinzuzuf&uuml;gen.<\/p>\n<p>Die Zeile <b>Friend objAccess As Access.application<\/b> legt au&szlig;erdem eine Variable an, in der wir gleich einen Verweis auf Access selbst ablegen. &Uuml;ber diese stellen wir Access sp&auml;ter unsere Fragen nach Version und Architektur. Die Angaben in eckigen Klammern sind technische Markierungen, die twinBASIC f&uuml;r ein COM-Add-In ben&ouml;tigt; um sie m&uuml;ssen wir uns nicht k&uuml;mmern.<\/p>\n<h2>Wenn Access das Add-In l&auml;dt<\/h2>\n<p>Sobald Access startet und unser Add-In verbindet, ruft es die Prozedur <b>OnConnection<\/b> auf. Genau hier merken wir uns den Verweis auf Access (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>OnConnection(ByVal Application<span style=\"color:blue;\"> As Object<\/span>, ByVal ConnectMode<span style=\"color:blue;\"> As <\/span>ext_ConnectMode, ByVal AddInInst<span style=\"color:blue;\"> As Object<\/span>, _\r\n        ByRef custom<span style=\"color:blue;\"> As Variant<\/span>()) Implements IDTExtensibility2.OnConnection\r\n    <span style=\"color:blue;\">Set<\/span> objAccess = Application\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beim Verbinden den Verweis auf Access merken<\/span><\/b><\/p>\n<p><b>Set objAccess = Application<\/b> speichert einen Verweis auf die &uuml;bergebene Anwendung in unserer Variablen. Die Schnittstelle <b>IDTExtensibility2<\/b> verlangt noch vier weitere Prozeduren &#8211; <b>OnDisconnection<\/b>, <b>OnAddInsUpdate<\/b>, <b>OnStartupComplete<\/b> und <b>OnBeginShutdown<\/b> -, die wir hier aber leer lassen, weil wir sie nicht ben&ouml;tigen. Sie m&uuml;ssen aber angelegt sein.<\/p>\n<h2>Die Oberfl&auml;che im Datei-Men&uuml;<\/h2>\n<p>Wie unser Bereich im Datei-Men&uuml; aussieht, beschreiben wir als XML-Definition. Die Funktion <b>GetCustomUI<\/b> baut diesen Text Zeile f&uuml;r Zeile zusammen und gibt ihn an Access zur&uuml;ck (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span> Implements IRibbonExtensibility.GetCustomUI\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\/2009\/07\/customui\"\" onLoad=\"\"customUI_OnLoad\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"  &lt;backstage&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"    &lt;tab id=\"\"tabSQLServer\"\" label=\"\"amvAccessSpecs\"\" insertAfterMso=\"\"TabInfo\"\" \" _\r\n        & \"title=\"\"Access-Spezifikationen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"      &lt;firstColumn&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"        &lt;group id=\"\"grpVersionsUndArchitektur\"\" label=\"\"Version und Architektur\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"          &lt;topItems&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"            &lt;layoutContainer id=\"\"lcTreiber\"\" layoutChildren=\"\"vertical\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebFullVersion\"\" label=\"\"Volle Version\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebVersion\"\" label=\"\"Version\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebAccessVer\"\" label=\"\"Access-Version\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebMsoBuildNumber\"\" label=\"\"MSO-Buildnummer\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebFullBuildNumber\"\" label=\"\"Volle Buildnummer\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebChannelName\"\" label=\"\"Channel-Name\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebBitness\"\" label=\"\"Architektur\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;editBox id=\"\"ebBuildNumber\"\" label=\"\"Buildnummer\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"            &lt;\/layoutContainer&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"          &lt;\/topItems&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;group id=\"\"grpWeitereInformationen\"\" label=\"\"Weitere Informationen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"          &lt;topItems&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"            &lt;layoutContainer id=\"\"lcWeitereInformationen\"\" layoutChildren=\"\"vertical\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;layoutContainer id=\"\"lcDatabaseFolder\"\" layoutChildren=\"\"horizontal\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"                &lt;editBox id=\"\"ebDatabaseFolder\"\" label=\"\"Datenbankorder\"\" \" _\r\n        & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"                &lt;button id=\"\"btnOpenDatabaseFolder\"\" label=\"\"&Ouml;ffnen\"\" \" _\r\n        & \"imageMso=\"\"FileOpen\"\" onAction=\"\"btnOpenDatabaseFolder_onAction\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"              &lt;\/layoutContainer&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"            &lt;\/layoutContainer&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"          &lt;\/topItems&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;\/firstColumn&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;\/backstage&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML = strXML & \"&lt;\/customUI&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    Return strXML\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Funktion GetCustomUI stellt die Oberfl&auml;che wird als XML zusammen<\/span><\/b><\/p>\n<p>Das hat einen Vorteil: Wir bestimmen damit ganz genau, welche Felder und Schaltfl&auml;chen erscheinen und wie sie angeordnet sind. Die Funktion <b>GetCustomUI<\/b> baut diese Beschreibung Zeile f&uuml;r Zeile zusammen und gibt sie an Access zur&uuml;ck.<\/p>\n<p>Ganz au&szlig;en steht das Element <b>customUI<\/b>. Es ist die Klammer um alles Weitere und nennt mit <b>onLoad<\/b> die Prozedur, die Access einmal aufrufen soll, sobald die Oberfl&auml;che geladen ist.<\/p>\n<p>Darin folgt <b>backstage<\/b> &#8211; und das ist genau der Bereich, der erscheint, wenn der Benutzer links oben auf <b>Datei<\/b> klickt, nicht eine der gew&ouml;hnlichen Registerkarten des Men&uuml;bands.<\/p>\n<p>Im <b>backstage<\/b> legen wir mit <b>tab<\/b> unsere eigene Seite an. Sie tr&auml;gt die Beschriftung <b>amvAccessSpecs<\/b>, und mit der Angabe <b>insertAfterMso<\/b> samt dem Wert <b>TabInfo<\/b> schieben wir sie genau hinter den bereits vorhandenen Bereich <b>Informationen<\/b>. So f&uuml;gt sich unser Eintrag nahtlos in das gewohnte Datei-Men&uuml; ein.<\/p>\n<p>Innerhalb dieser Seite ordnen wir den Inhalt in zwei Gruppen: <b>Version und Architektur<\/b> und <b>Weitere Informationen<\/b>. Eine Gruppe ist dabei nichts weiter als ein zusammengeh&ouml;riger Block mit einer &Uuml;berschrift. Die eigentliche Anordnung der Felder &uuml;bernimmt in jeder Gruppe ein <b>layoutContainer<\/b>.<\/p>\n<p>&Uuml;ber dessen Angabe legen wir fest, ob die enthaltenen Elemente untereinander (<b>vertical<\/b>) oder nebeneinander (<b>horizontal<\/b>) stehen. Die vielen Versionsfelder stapeln wir untereinander; das Pfadfeld und die &Ouml;ffnen-Schaltfl&auml;che dagegen setzen wir nebeneinander.<\/p>\n<p>Die einzelnen Anzeigefelder sind Elemente vom Typ <b>editBox<\/b>. Jedes bekommt eine eigene Kennung (<b>id<\/b>), eine Beschriftung (<b>label<\/b>) und &uuml;ber <b>sizeString<\/b> eine feste Breite &#8211; daf&uuml;r geben wir schlicht eine Kette von <b>W<\/b>-Buchstaben an, die so breit ist, wie das Feld sp&auml;ter sein soll.<\/p>\n<p>Und jedes Feld nennt mit <b>getText<\/b> die Funktion, die seinen Inhalt liefert.<\/p>\n<p>In der zweiten Gruppe kommt neben dem Pfadfeld noch eine Schaltfl&auml;che hinzu, das Element <b>button<\/b>. Sie zeigt &uuml;ber <b>imageMso<\/b> ein vorhandenes Office-Symbol &#8211; hier <b>FileOpen<\/b>, das Symbol zum &Ouml;ffnen &#8211; und ruft &uuml;ber <b>onAction<\/b> beim Anklicken unsere Prozedur <b>btnOpenDatabaseFolder_onAction<\/b> auf.<\/p>\n<p>Der eigentliche Kniff an dieser Beschreibung: Sie sagt nur, welche Felder es gibt und wie sie aussehen &#8211; nicht, was darin steht. Den Inhalt holt sich jedes Feld selbst, indem es &uuml;ber seine <b>id<\/b> die Funktion <b>getText<\/b> befragt; ebenso meldet sich die Schaltfl&auml;che &uuml;ber <b>onAction<\/b>, sobald sie geklickt wird. So bleiben Aussehen und Inhalt sauber getrennt: Die XML-Definition k&uuml;mmert sich um die Optik, der VBA-Code um die Werte.<\/p>\n<h2>Der Ribbon meldet sich<\/h2>\n<p>Wenn Office unsere Oberfl&auml;che geladen hat, ruft es einmal die Funktion <b>customUI_OnLoad<\/b> auf. Darin merken wir uns das Men&uuml;band in der Variablen <b>m_ribbon<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n<span style=\"color:blue;\">Public Function <\/span>customUI_OnLoad(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI) _\r\n       <span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n    <span style=\"color:blue;\">Set<\/span> m_ribbon = ribbon\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Woher die Werte kommen<\/h2>\n<p>Nun zum Herzst&uuml;ck. Jedes Textfeld ruft beim Anzeigen die Funktion <b>getText<\/b> auf und gibt dabei seine eigene Kennung mit. Anhand dieser Kennung liefern wir den passenden Wert zur&uuml;ck, wie Listing 3 zeigt. Die eigentlichen Angaben holen wir uns &uuml;ber die neuen <b>SysCmd<\/b>-Konstanten. Jede Kennung steht f&uuml;r eine bestimmte Information:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>getText(control<span style=\"color:blue;\"> As <\/span>IRibbonControl)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    Select Case control.Id\r\n        <span style=\"color:blue;\">Case <\/span>\"ebAccessVer\"\r\n            strText = objAccess.SysCmd(7) 'acSysCmdAccessVer\r\n        <span style=\"color:blue;\">Case <\/span>\"ebMsoBuildNumber\"\r\n            strText = objAccess.SysCmd(715) 'acSysCmdGetMsoBuildNumber\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebFullVersion\"\r\n            strText = objAccess.SysCmd(720) 'acSysCmdGetFullVersion\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebVersion\"\r\n            strText = objAccess.SysCmd(721) 'acSysCmdGetVersion\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebFullBuildNumber\"\r\n            strText = objAccess.SysCmd(722) 'acSysCmdGetFullBuildNumber\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebChannelName\"\r\n            strText = objAccess.SysCmd(723) 'acSysCmdGetChannelName\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebBitness\"\r\n            strText = objAccess.SysCmd(724) 'acSysCmdGetBitness\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebBuildNumber\"\r\n            strText = objAccess.SysCmd(725) 'acSysCmdGetBuildNumber\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                strText = \"Nicht verf&uuml;gbar.\"\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Case <\/span>\"ebDatabaseFolder\"\r\n            strText = objAccess.CurrentProject.Path\r\n    <span style=\"color:blue;\">End Select<\/span>\r\n    Return strText\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Funktion getText f&uuml;llt die Textfelder.<\/span><\/b><\/p>\n<ul>\n<li><b>ebAccessVer<\/b> &#8211; die Access-Version &uuml;ber <b>SysCmd(7)<\/b> (<b>acSysCmdAccessVer<\/b>)<\/li>\n<li><b>ebFullVersion<\/b> &#8211; die volle Version &uuml;ber <b>SysCmd(720)<\/b><\/li>\n<li><b>ebVersion<\/b> &#8211; die Version &uuml;ber <b>SysCmd(721)<\/b><\/li>\n<li><b>ebMsoBuildNumber<\/b> &#8211; die MSO-Buildnummer &uuml;ber <b>SysCmd(715)<\/b><\/li>\n<li><b>ebFullBuildNumber<\/b> &#8211; die volle Buildnummer &uuml;ber <b>SysCmd(722)<\/b><\/li>\n<li><b>ebChannelName<\/b> &#8211; der Update-Kanal &uuml;ber <b>SysCmd(723)<\/b><\/li>\n<li><b>ebBitness<\/b> &#8211; die Architektur, also 32 oder 64 Bit, &uuml;ber <b>SysCmd(724)<\/b><\/li>\n<li><b>ebBuildNumber<\/b> &#8211; die Buildnummer &uuml;ber <b>SysCmd(725)<\/b><\/li>\n<li><b>ebDatabaseFolder<\/b> &#8211; der Pfad der aktuellen Datenbank &uuml;ber <b>CurrentProject.Path<\/b><\/li>\n<\/ul>\n<p>Liefert eine dieser Abfragen einen leeren Text, zeigen wir stattdessen <b>Nicht verf&uuml;gbar<\/b> an &#8211; so bleibt kein Feld leer.<\/p>\n<h2>Den Ordner &ouml;ffnen<\/h2>\n<p>Bleibt die Schaltfl&auml;che neben dem Datenbankpfad. Ein Klick darauf ruft die Prozedur <b>btnOpenDatabaseFolder_onAction<\/b> auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>btnOpenDatabaseFolder_onAction(ByVal control _\r\n       <span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n    <span style=\"color:blue;\">Dim <\/span>strFolder<span style=\"color:blue;\"> As String<\/span>\r\n    strFolder = objAccess.CurrentProject.Path\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFolder) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strFolder, vbDirectory)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n            Shell \"explorer.exe \"\"\" & strFolder _\r\n                & \"\"\"\", vbNormalFocus\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wir holen uns den Pfad der aktuellen Datenbank, pr&uuml;fen mit <b>Dir<\/b>, ob der Ordner wirklich existiert, und &ouml;ffnen ihn dann mit <b>Shell<\/b> und <b>explorer.exe<\/b> in einem neuen Fenster.<\/p>\n<h2>Das Add-In bekannt machen<\/h2>\n<p>Damit Access unser Add-In beim Start &uuml;berhaupt findet, muss es in der Windows-Registry eingetragen sein. Genau darum k&uuml;mmert sich das Modul <b>DllRegistration<\/b>.<\/p>\n<p>Es enth&auml;lt zwei Funktionen: eine zum Eintragen und eine zum Entfernen. Ihre Namen sind nicht frei gew&auml;hlt, sondern fest vorgegeben &#8211; dazu am Ende mehr.<\/p>\n<h2>Die Konstanten<\/h2>\n<p>Am Anfang des Moduls legen wir vier Konstanten fest (siehe Listing 4).<\/p>\n<pre>Const AddinProjectName<span style=\"color:blue;\"> As String<\/span> = VBA.Compilation.CurrentProjectName\r\nConst AddinQualifiedClassName<span style=\"color:blue;\"> As String<\/span> = GetDeclaredTypeProgId(Of amvAccessSpecs.amvAccessSpecs)\r\nConst RootRegistryFolder_ACCESS<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins\\\" & AddinQualifiedClassName & \"\\\"\r\nConst RootRegistryFolder_EXCEL<span style=\"color:blue;\"> As String<\/span> = \"HKCU\\SOFTWARE\\Microsoft\\Office\\Excel\\Addins\\\" & AddinQualifiedClassName & \"\\\"<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Konstanten des Registrierungsmoduls<\/span><\/b><\/p>\n<p><b>AddinProjectName<\/b> &uuml;bernimmt &uuml;ber <b>VBA.Compilation.CurrentProjectName<\/b> schlicht den Namen des Projekts, also <b>amvAccessSpecs<\/b>. <b>AddinQualifiedClassName<\/b> ermittelt mit <b>GetDeclaredTypeProgId<\/b> die sogenannte ProgID unserer Klasse &#8211; den sprechenden Namen, unter dem COM sie kennt. Beide Werte stehen bereits zur &Uuml;bersetzungszeit fest.<\/p>\n<p>Aus der ProgID setzen wir die Registry-Pfade zusammen. <b>RootRegistryFolder_ACCESS<\/b> zeigt auf den Ort, an dem Access nach seinen COM-Add-Ins sucht: unterhalb von <b>HKCU<\/b> &#8211; dem Zweig des aktuellen Benutzers &#8211; im Bereich der Office-Add-Ins.<\/p>\n<h2>Eintragen mit DllRegisterServer<\/h2>\n<p>Die erste Funktion tr&auml;gt unser Add-In ein, wie Listing 5 zeigt.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DllRegisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n    <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n    wscript.RegWrite RootRegistryFolder_ACCESS & \"FriendlyName\", AddinProjectName, \"REG_SZ\"\r\n    wscript.RegWrite RootRegistryFolder_ACCESS & \"Description\", AddinProjectName, \"REG_SZ\"\r\n    wscript.RegWrite RootRegistryFolder_ACCESS & \"LoadBehavior\", 3, \"REG_DWORD\"\r\n    Return <span style=\"color:blue;\">True<\/span>\r\nRegError:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"DllRegisterServer -- An error occured trying to write to the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n            Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n    Return <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Registry-Eintr&auml;ge anlegen<\/span><\/b><\/p>\n<p>Wir erzeugen ein <b>wscript.shell<\/b>-Objekt und schreiben damit drei Werte unter den Access-Schl&uuml;ssel: <b>FriendlyName<\/b> und <b>Description<\/b> erhalten beide den Projektnamen, und <b>LoadBehavior<\/b> bekommt den Wert <b>3<\/b>.<\/p>\n<p>Dieser Wert ist entscheidend &#8211; er bedeutet, dass Access das Add-In gleich beim Start laden soll.<\/p>\n<p>Da wir in <b>HKCU<\/b> schreiben, also im Benutzerzweig, sind daf&uuml;r keine Administratorrechte n&ouml;tig. Geht beim Schreiben etwas schief, springt die Ausf&uuml;hrung zur Marke <b>RegError<\/b>, zeigt eine Meldung mit Fehlerbeschreibung und Fehlernummer und liefert <b>False<\/b>; im Normalfall gibt die Funktion <b>True<\/b> zur&uuml;ck.<\/p>\n<h2>Entfernen mit DllUnregisterServer<\/h2>\n<p>Das Gegenst&uuml;ck l&ouml;scht die Eintr&auml;ge wieder (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DllUnregisterServer()<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> RegError\r\n    <span style=\"color:blue;\">Dim <\/span>wscript<span style=\"color:blue;\"> As Object<\/span> = CreateObject(\"wscript.shell\")\r\n    wscript.RegDelete RootRegistryFolder_ACCESS & \"FriendlyName\"\r\n    wscript.RegDelete RootRegistryFolder_ACCESS & \"Description\"\r\n    wscript.RegDelete RootRegistryFolder_ACCESS & \"LoadBehavior\"\r\n    wscript.RegDelete RootRegistryFolder_ACCESS\r\n    Return <span style=\"color:blue;\">True<\/span>\r\nRegError:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"DllUnregisterServer -- An error occured trying to delete from the system registry:\" & <span style=\"color:blue;\">vbCrLf<\/span> & _\r\n            Err.Description & \" (\" & Hex(Err.Number) & \")\"\r\n    Return <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Registry-Eintr&auml;ge wieder entfernen<\/span><\/b><\/p>\n<p>Hier l&ouml;schen wir mit <b>RegDelete<\/b> zuerst die drei Werte und anschlie&szlig;end den Schl&uuml;ssel selbst. Die Fehlerbehandlung arbeitet genauso wie beim Eintragen.<\/p>\n<h2>Was beim Kompilieren aus twinBASIC passiert<\/h2>\n<p>Die Namen <b>DllRegisterServer<\/b> und <b>DllUnregisterServer<\/b> sind fest vorgegeben: COM erwartet genau diese beiden Funktionen, wenn sich eine DLL selbst registrieren soll. twinBASIC macht sich das zunutze.<\/p>\n<p>Kompilieren wir das Projekt und lassen es registrieren, meldet twinBASIC zum einen die COM-Klasse an und ruft zum anderen unsere Funktion <b>DllRegisterServer<\/b> auf &#8211; diese schreibt dann die beschriebenen Eintr&auml;ge. Damit ist das Add-In sofort einsatzbereit, und Access l&auml;dt es beim n&auml;chsten Start. Beim Aufheben der Registrierung ruft twinBASIC entsprechend <b>DllUnregisterServer<\/b> auf.<\/p>\n<h2>Was regsvr32 damit macht<\/h2>\n<p>Auf einem anderen Rechner &#8211; etwa beim Kunden &#8211; geben wir die fertige DLL weiter und registrieren sie mit dem Windows-Werkzeug <b>regsvr32<\/b>. Rufen wir <b>regsvr32 amvAccessSpecs.dll<\/b> auf, l&auml;dt <b>regsvr32 <\/b>die DLL und ruft genau unsere Funktion <b>DllRegisterServer<\/b> auf &#8211; es l&auml;uft also derselbe Code wie beim Kompilieren.<\/p>\n<p>Mit <b>regsvr32 \/u amvAccessSpecs.dll<\/b> geht es andersherum: <b>regsvr32<\/b> ruft <b>DllUnregisterServer<\/b> auf und entfernt die Eintr&auml;ge wieder.<\/p>\n<p>Ein Punkt ist dabei wichtig: <b>regsvr32 <\/b>und die DLL m&uuml;ssen zur selben Architektur geh&ouml;ren. Eine 32-Bit-DLL registrieren wir mit dem 32-Bit-<b>regsvr32<\/b> aus dem Ordner <b>SysWOW64<\/b>, eine 64-Bit-DLL mit dem 64-Bit-<b>regsvr32<\/b>. Passt die Bitness nicht zusammen, verweigert <b>regsvr32 <\/b>die Arbeit.<\/p>\n<p>So gen&uuml;gt derselbe kleine Code sowohl w&auml;hrend der Entwicklung in twinBASIC als auch bei der sp&auml;teren Verteilung per <b>regsvr32<\/b>.<\/p>\n<p>Um die 64-Bit-Version zu kompilieren, stellen wir oben im twinBASIC von <b>win32 <\/b>auf <b>win64 <\/b>um (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_04\/pic_1607_004.png\" alt=\"Kompilieren f&uuml;r 32-Bit- und 64-Bit-Access\" width=\"499,5589\" height=\"174,9428\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Kompilieren f&uuml;r 32-Bit- und 64-Bit-Access<\/span><\/b><\/p>\n<p>Das Kompilieren selbst erledigen wir mit dem Men&uuml;befehl <b>File|Build<\/b>.<\/p>\n<p>Danach steht das COM-Add-In beim n&auml;chsten Start von Access bereits zur Verf&uuml;gung. Wichtig ist, dass wir nicht neu kompilieren, w&auml;hrend das COM-Add-In in Access ge&ouml;ffnet ist &#8211; dann erhalten wir eine Fehlermeldung.<\/p>\n<h2>Erweitern des COM-Add-Ins um weitere Informationen<\/h2>\n<p>Wenn Sie das COM-Add-In selbst um weitere Elemente erweitern wollen, sind &Auml;nderungen an zwei Stellen n&ouml;tig.<\/p>\n<p>Angenommen, wir wollen auch noch den Namen der Access-Datenbankdatei abbilden.<\/p>\n<p>Dann f&uuml;gen wir zuerst ein entsprechendes <b>editBox<\/b>-Element zur XML-Definition hinzu, zum Beispiel unter dem <b>layoutContainer<\/b>-Element <b>lcDatabaseFolder <\/b>in einem neuen layoutContainer-Element (siehe Listing 7).<\/p>\n<pre>strXML = strXML & \"              &lt;layoutContainer id=\"\"lcDatabaseName\"\" layoutChildren=\"\"horizontal\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML = strXML & \"                &lt;editBox id=\"\"ebDatabaseName\"\" label=\"\"Datenbankname\"\" \" _\r\n    & \"sizeString=\"\"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW\"\" getText=\"\"getText\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\nstrXML = strXML & \"              &lt;\/layoutContainer&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Hinzuf&uuml;gen eines neuen Text-Elements<\/span><\/b><\/p>\n<p>Au&szlig;erdem erweitern wir die Funktion <b>getText<\/b> um den folgenden <b>Case<\/b>-Zweig &#8211; hier weisen wir mit <b>CurrentProject.Name <\/b>den Namen der Datenbankdatei zu:<\/p>\n<pre><span style=\"color:blue;\">Case <\/span>\"ebDatabaseName\"\r\n    strText = objAccess.CurrentProject.Name<\/pre>\n<p>Kompilieren wir das Projekt nun erneut und &ouml;ffnen den entsprechenden Bereich in Access, sehen wir das neue Steuerelement mit dem entsprechenden Eintrag (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_04\/pic_1607_005.png\" alt=\"Neuer Eintrag in den Access-Spezifikationen\" width=\"700\" height=\"348,4782\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Neuer Eintrag in den Access-Spezifikationen<\/span><\/b><\/p>\n<p>Auf diese Weise k&ouml;nnen wir beliebige Informationen, die wir aus Access auslesen k&ouml;nnen, &uuml;ber unser COM-Add-In sichtbar machen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie wir den Datei-Bereich von Access um eine eigene Sektion erweitern k&ouml;nnen, in der wir verschiedene Informationen und Steuerelelemente unterbringen.<\/p>\n<p>In diesem Fall haben wir die neuen <b>SysCmd<\/b>-Konstanten genutzt, um Informationen &uuml;ber die Version und die Architektur der aktuell installierten Access-Anwendung &uuml;bersichtlich und mit wenigen Mausklicks darstellen k&ouml;nnen.<\/p>\n<p>Au&szlig;erdem haben wir gezeigt, wie dieses COM-Add-In einfach um eigene Steuerelemente erweitert werden kann.<\/p>\n<p>Weitere Ideen zur Erweiterung sind ein Button zum Komprimieren und Reparieren einer Anwendung oder auch zum Anzeigen von Statistiken wie etwa die Anzahl von Tabellen, Abfragen, Formularen, Berichten et cetera.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Access: Version und Architektur einfach ermitteln&#8220; (www.access-im-unternehmen.de\/1606) haben wir die neuen SysCmd-Konstanten zum Abfragen von Access-Version und Access-Architektur vorgestellt. Dort haben wir auch gezeigt, wie wir diese Informationen &uuml;bersichtlich in einem Formular darstellen k&ouml;nnen. Im vorliegenden Beitrag erstellen wir nun ein COM-Add-In, das den Dateibereich von Access erweitert und dort die verschiedenen Versionsinformationen, die Architektur und den aktuellen Update-Kanal von Access anzeigt. Au&szlig;erdem liefern wir dort auch gleich noch den aktuellen Datenbankpfad und eine M&ouml;glichkeit, diesen in die Zwischenablage zu kopieren.<\/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":[662026,66042026,44000027],"tags":[],"class_list":["post-55001607","post","type-post","status-publish","format-standard","hentry","category-662026","category-66042026","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Access-Infos per COM-Add-In anzeigen - 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\/AccessInfos_per_COMAddIn_anzeigen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Access-Infos per COM-Add-In anzeigen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Access: Version und Architektur einfach ermitteln&quot; (www.access-im-unternehmen.de\/1606) haben wir die neuen SysCmd-Konstanten zum Abfragen von Access-Version und Access-Architektur vorgestellt. Dort haben wir auch gezeigt, wie wir diese Informationen &uuml;bersichtlich in einem Formular darstellen k&ouml;nnen. Im vorliegenden Beitrag erstellen wir nun ein COM-Add-In, das den Dateibereich von Access erweitert und dort die verschiedenen Versionsinformationen, die Architektur und den aktuellen Update-Kanal von Access anzeigt. Au&szlig;erdem liefern wir dort auch gleich noch den aktuellen Datenbankpfad und eine M&ouml;glichkeit, diesen in die Zwischenablage zu kopieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-04T14:02:58+00:00\" \/>\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\\\/AccessInfos_per_COMAddIn_anzeigen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Access-Infos per COM-Add-In anzeigen\",\"datePublished\":\"2026-07-04T14:02:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/\"},\"wordCount\":2580,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"articleSection\":[\"2026\",\"4\\\/2026\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/\",\"name\":\"Access-Infos per COM-Add-In anzeigen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"datePublished\":\"2026-07-04T14:02:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessInfos_per_COMAddIn_anzeigen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access-Infos per COM-Add-In anzeigen\"}]},{\"@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":"Access-Infos per COM-Add-In anzeigen - 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\/AccessInfos_per_COMAddIn_anzeigen\/","og_locale":"de_DE","og_type":"article","og_title":"Access-Infos per COM-Add-In anzeigen","og_description":"Im Beitrag \"Access: Version und Architektur einfach ermitteln\" (www.access-im-unternehmen.de\/1606) haben wir die neuen SysCmd-Konstanten zum Abfragen von Access-Version und Access-Architektur vorgestellt. Dort haben wir auch gezeigt, wie wir diese Informationen &uuml;bersichtlich in einem Formular darstellen k&ouml;nnen. Im vorliegenden Beitrag erstellen wir nun ein COM-Add-In, das den Dateibereich von Access erweitert und dort die verschiedenen Versionsinformationen, die Architektur und den aktuellen Update-Kanal von Access anzeigt. Au&szlig;erdem liefern wir dort auch gleich noch den aktuellen Datenbankpfad und eine M&ouml;glichkeit, diesen in die Zwischenablage zu kopieren.","og_url":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-07-04T14:02:58+00:00","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\/AccessInfos_per_COMAddIn_anzeigen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Access-Infos per COM-Add-In anzeigen","datePublished":"2026-07-04T14:02:58+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/"},"wordCount":2580,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"articleSection":["2026","4\/2026","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/","url":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/","name":"Access-Infos per COM-Add-In anzeigen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"datePublished":"2026-07-04T14:02:58+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/AccessInfos_per_COMAddIn_anzeigen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Access-Infos per COM-Add-In anzeigen"}]},{"@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\/55001607","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=55001607"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001607\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}