{"id":55001427,"date":"2023-04-01T00:00:00","date_gmt":"2023-06-17T09:31:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1427"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"AccessAddIn_per_Knopfdruck_erstellen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/","title":{"rendered":"Access-Add-In per Knopfdruck erstellen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/b24b1d7cd7f04454b2b4401d4c9331a0\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Immer, wenn ich ein neues Add-In f&uuml;r eine Automatisierung meiner Access-Entwicklung erstelle, f&uuml;hre ich die gleichen Schritte durch: Anlegen einer neuen Datenbank, Speichern als .accda, Erstellen der Tabelle USysRegInfo, Hinzuf&uuml;gen der Daten f&uuml;r die Registry, Einstellen der Datenbankinformationen, sodass diese im Add-In-Manager angezeigt werden und Programmieren der Funktion, die beim Start des Add-Ins aufgerufen werden soll. Und erst danach f&auml;ngt der eigentliche Spa&szlig; an, n&auml;mlich die Programmierung der Funktion, die ich gern mit dem Add-In erledigen m&ouml;chte. Weil ich das oft genug gemacht habe, baue ich im Rahmen dieses Beitrags ein Tool, mit dem ich solche Add-Ins per Mausklick erstellen kann &#8211; beziehungsweise ein Add-In, mit dem ich die aktuelle Datenbank in ein Add-In umwandeln kann. <\/b><\/p>\n<p>Wenn ich schon regelm&auml;&szlig;ig Access-Add-Ins programmiere, um damit l&auml;stige, immer wieder auftretende Aufgaben zu vereinfachen &#8211; warum sollte ich dann nicht das Zusammenstellen der wichtigsten Elemente dieses Add-Ins auch automatisieren?<\/p>\n<p>Ich habe erst &uuml;berlegt, mir eine Vorlage zu erstellen, die ich dann kopiere und anpasse. Aber letztlich sind doch einige Schritte zu erledigen.<\/p>\n<p>Selbst wenn die Tabelle <b>USysRegInfo <\/b>in einer solchen Vorlage bereits vorhanden ist, muss ich die dortigen Daten noch einstellen, und auch die Informationen der Access-Datenbank selbst, die sp&auml;ter im Add-In-Manager angezeigt werden, m&uuml;ssen immer wieder angepasst werden.<\/p>\n<p>Davon abgesehen schaffe ich es regelm&auml;&szlig;ig, die Daten in der Tabelle <b>USysRegInfo <\/b>nicht korrekt einzugeben, und selbst der kleinste Fehler f&uuml;hrt dazu, dass die Registrierung nicht durchgef&uuml;hrt wird oder das Access-Add-In anschlie&szlig;end dennoch nicht gestartet werden kann.<\/p>\n<p>Viel einfacher w&auml;re es doch, wenn es ein Formular g&auml;be, das die wichtigsten Einstellungen vor dem Erstellen des Access-Add-Ins abfragt und diese automatisch anlegt.<\/p>\n<h2>Neues Access-Add-In oder aktuell ge&ouml;ffnete Datenbank umr&uuml;sten?<\/h2>\n<p>Nun stellt sich die Frage, wie wir das Erstellen eines neuen Access-Add-Ins gestalten wollen. Wir k&ouml;nnten beispielsweise eine herk&ouml;mmliche Access-Datenbank erstellen, die ein Formular enth&auml;lt, welches die Parameter f&uuml;r das Access-Add-In abfragt und diese dann auf die gleiche Datenbank anwendet.<\/p>\n<p>In dieser Datenbank k&ouml;nnten wir die Tabelle <b>USysRegInfo <\/b>dann bereits vorbereiten und brauchen diese nur noch auf Basis der in das Formular eingegebenen Daten anzupassen &#8211; das gilt auch f&uuml;r die Datenbankinformationen.<\/p>\n<p>Die Alternative w&auml;re, wiederum ein Access-Add-In zu programmieren, das der aktuell ge&ouml;ffneten Datenbank die notwendigen Elemente hinzuf&uuml;gt. Das Access-Add-In m&uuml;sste dann die notwendigen Informationen abfragen, die Tabelle <b>USysRegInfo<\/b> anlegen und mit den Daten f&uuml;r die Registrierung f&uuml;llen, die Datenbankinformationen eintragen und das Modul mit der Funktion zum Starten des Access-Add-Ins anlegen.<\/p>\n<h2>Mein Weg zu Access-Add-Ins<\/h2>\n<p>Ich gehe an dieser Stelle einmal von meiner eigenen Vorgehensweise beim Erstellen eines Access-Add-Ins aus. Diese sieht so aus, dass ich zu Beginn meist gar kein Access-Add-In plane, sondern einfach nur in irgendeiner Datenbankanwendung, die ich gerade programmiere, eine VBA-Prozedur hinzuf&uuml;ge, mit der ich eine Aufgabe automatisiere.<\/p>\n<p>Diese setze ich dann ein, stelle fest, dass sie gut funktioniert, und f&uuml;ge dann gegebenenfalls ein Formular hinzu, von dem ich die Prozedur aufrufe.<\/p>\n<p>Wenig sp&auml;ter stelle ich dann fest, dass ich diese Funktion auch noch in weiteren Projekten nutzen k&ouml;nnte. Meistens kopiere ich diese dann zuerst in das betroffene Projekt und nutze es dort. Irgendwann kommt mir dann die Idee, dass ich ja auch ein Access-Add-In aus der Funktion machen k&ouml;nnte &#8211; und dann beginnen die Schritte, die ich bereits eingangs erw&auml;hnt habe.<\/p>\n<p>Ich starte also eher mit einer Datenbankanwendung, in der bereits die Funktionen des zuk&uuml;nftigen Access-Add-Ins enthalten sind und wandle diese dann in ein Add-In um. Dementsprechend legen wir die L&ouml;sung dieses Beitrags auch als Access-Add-In an &#8211; um damit &uuml;ber das Add-In-Men&uuml; die aktuell ge&ouml;ffnete Datenbank in ein Add-In umwandeln zu k&ouml;nnen.<\/p>\n<h2>Formular zum Erfassen der Add-In-Daten<\/h2>\n<p>Bevor wir loslegen, ben&ouml;tigen wir ein Formular, mit dem der Benutzer die Daten eingeben kann, die f&uuml;r das Umr&uuml;sten des Add-Ins ben&ouml;tigt werden. Dieses Formular sieht in der Entwurfsansicht wie in Bild 1 aus. Wir verwenden hier die folgenden Textfelder:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_001.png\" alt=\"Entwurf des Formulars zur Eingabe der Add-In-Daten\" width=\"424,5589\" height=\"302,7289\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf des Formulars zur Eingabe der Add-In-Daten<\/span><\/b><\/p>\n<ul>\n<li><b>txtAddInName<\/b>: Diese Bezeichnung wird in der Liste der Add-Ins im Ribbon verwendet sowie als Schl&uuml;ssel in der Registry.<\/li>\n<li><b>txtBeschreibung<\/b>: Die Beschreibung wird in die Eigenschaft Kommentare der Datenbank geschrieben. Sie wird im Add-In-Manager angezeigt, wenn das Add-In darin markiert wurde.<\/li>\n<li><b>txtHersteller<\/b>: Der Hersteller wird in die Eigenschaft <b>Firma <\/b>der Add-In-Datenbank geschrieben. Auch diese Information landet im Add-In-Manager.<\/li>\n<li><b>txtStartfunktion<\/b>: Name der VBA-Funktion, die beim Starten des Add-Ins aufgerufen werden soll.<\/li>\n<li><b>txtAddInDatei<\/b>: Aktueller Dateiname, bei dem gegebenenfalls noch die Dateiendung <b>.accdb <\/b>durch <b>.accda <\/b>ersetzt wird. Der tats&auml;chliche Dateiname muss dem hier angegebenen Dateinamen entsprechen.<\/li>\n<\/ul>\n<p>Damit gleich beim &Ouml;ffnen des Formulars einige Beispieldaten erscheinen, f&uuml;llen wir die Textfelder beim Laden des Formulars mit der folgenden Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!txtAddInName = \"Add-In-Name\"\r\n     Me!txtBeschreibung = _\r\n         \"Dies ist die Beschreibung des Add-Ins.\"\r\n     Me!txtHersteller = \"Hersteller\"\r\n     Me!txtStartfunktion = \"Autostart\"\r\n     Me!txtAddInDatei = _\r\n         <span style=\"color:blue;\">Replace<\/span>(CurrentProject.Name, \".accdb\", \".accda\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dadurch sieht das Formular nach dem &Ouml;ffnen wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_002.png\" alt=\"Das Formular zur Eingabe der Add-In-Daten in der Formularansicht\" width=\"424,5589\" height=\"268,411\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Das Formular zur Eingabe der Add-In-Daten in der Formularansicht<\/span><\/b><\/p>\n<h2>Umwandeln der Access-Datenbank in ein Access-Add-In<\/h2>\n<p>Damit wir die Access-Datenbank als Access-Add-In nutzen k&ouml;nnen, sind einige Schritte n&ouml;tig, die im Code der Prozedur, die durch die Schaltfl&auml;che <b>cmdZumAddInUmruesten <\/b>bereits skizziert sind (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdZumAddInUmruesten_Click()\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>dbc<span style=\"color:blue;\"> As <\/span>dao.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> dbc = CodeDb\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> CreateUSysRegInfo(db)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Offensichtlich ist bereits eine Tabelle namens ''USysRegInfo'' vorhanden.\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Pr&uuml;fen Sie die aktuelle Datenbank.\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Der Vorgang wird abgebrochen.\", vbOKOnly + vbExclamation\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     AddRegistryEntries db, dbc, Me!txtAddInName, 1, Me!txtStartfunktion, Me!txtBeschreibung, Me!txtAddInDatei\r\n     ChangeProperties db, Me!txtAddInName, Me!txtBeschreibung, Me!txtHersteller\r\n     AddStartfunction db, Me!txtStartfunktion\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Right<\/span>(CurrentProject.Name, 6) = \".accda\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Dateiendung muss noch in .accda ge&auml;ndert werden.\", vbOKOnly + vbExclamation, \"Dateiendung anpassen\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Code zum Umwandeln der aktuell ge&ouml;ffneten Datenbank in ein Access-Add-In<\/span><\/b><\/p>\n<p>Die Prozedur deklariert und f&uuml;llt zwei Database-Variablen: Die erste hei&szlig;t <b>db <\/b>und referenziert die aktuell ge&ouml;ffnete Datenbank (mit <b>CurrentDb<\/b>), die zweite hei&szlig;t <b>dbc <\/b>und bezieht sich auf die Add-In-Datenbank (mit <b>CodeDb<\/b>).<\/p>\n<p>Bedenken Sie: Die Datenbank, die wir gerade programmieren, wird ja selbst ein Access-Add-In, mit dem wir die dann geladene Datenbank in ein Access-Add-In umwandeln wollen.<\/p>\n<p>Die Prozedur ruft danach weitere Routinen auf. Die erste hei&szlig;t <b>CreateUSysRegInfo <\/b>und wird mit dem Verweis auf die aktuell ge&ouml;ffnete Datenbank als Parameter aufgerufen. Sie hat die Aufgabe, die Tabelle <b>USysRegInfo <\/b>zu erstellen, welche die Informationen aufnimmt, die beim Installieren des Access-Add-Ins in die Registry geschrieben werden sollen, damit Access beim &Ouml;ffnen auslesen kann, welche Access-Add-Ins verf&uuml;gbar sind.<\/p>\n<p>Diese Funktion pr&uuml;ft auch, ob die Tabelle <b>USysRegInfo <\/b>bereits vorhanden ist &#8211; falls ja, wird der Vorgang abgebrochen.<\/p>\n<p>Der Aufruf der Prozedur <b>AddRegistryEntries <\/b>&uuml;bergibt Verweise auf die aktuelle Datenbank, das aktuelle Access-Add-In, den Namen des zu erstellenden Add-Ins, den Wert <b>1 <\/b>als Parameter f&uuml;r den zu erstellenden Add-In-Typ (aktuell gibt es nur den einen), den Namen der beim Start aufzurufenden Funktion, die Beschreibung und den Dateinamen der zuk&uuml;nftigen Add-In-Datenbank. Sie soll die ben&ouml;tigten Daten in die Tabelle <b>USysRegInfo <\/b>schreiben.<\/p>\n<p>[<\/p>\n<p>Die Prozedur <b>ChangeProperties <\/b>soll die Eigenschaften der Datenbankdatei &auml;ndern, die sp&auml;ter im Add-In-Manager angezeigt werden. Dazu erh&auml;lt sie als Parameter den Verweis auf die zu &auml;ndernde Datenbank, den Namen des Add-Ins, die Beschreibung und den Hersteller.<\/p>\n<p>Schlie&szlig;lich folgt noch die Prozedur <b>AddStartfunction<\/b>, der wir den Verweis auf die Datenbank &uuml;bergeben, welche um ein Modul mit dieser Funktion erweitert werden soll &#8211; und den Namen der anzulegenden Funktion.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur noch, ob die Zieldatenbank bereits die Dateiendung <b>.accda <\/b>hat und weist den Benutzer darauf hin, diesen gegebenenfalls anzupassen.<\/p>\n<h2>Erstellen der Tabelle USysRegInfo<\/h2>\n<p>Die erste Funktion namens <b>CreateUSysRegInfo <\/b>erwartet einen Verweis auf die in ein Access-Add-In umzuwandelnde Datenbank als Parameter (siehe Listing 2). Sie versucht zun&auml;chst, eine bereits bestehende Tabelle namens <b>USysRegInfo <\/b>zu referenzieren. Gelingt dies, wird die Funktion mit dem Ergebnis <b>False <\/b>abgebrochen, damit keine eventuell bereits angelegten Elemente &uuml;berschrieben werden.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>CreateUSysRegInfo(dbAddIn<span style=\"color:blue;\"> As <\/span>dao.Database)<span style=\"color:blue;\"> As Boolean<\/span>\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>fld<span style=\"color:blue;\"> As <\/span>dao.Field\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> tdf = dbAddIn.TableDefs(\"USysRegInfo\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> tdf Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">Set<\/span> tdf = dbAddIn.CreateTableDef(\"USysRegInfo\")\r\n     <span style=\"color:blue;\">With<\/span> tdf\r\n         <span style=\"color:blue;\">Set<\/span> fld = .CreateField(\"Subkey\", dbText, 255)\r\n         tdf.Fields.Append fld\r\n         <span style=\"color:blue;\">Set<\/span> fld = .CreateField(\"Type\", dbInteger)\r\n         tdf.Fields.Append fld\r\n         <span style=\"color:blue;\">Set<\/span> fld = .CreateField(\"ValName\", dbText, 255)\r\n         tdf.Fields.Append fld\r\n         <span style=\"color:blue;\">Set<\/span> fld = .CreateField(\"Value\", dbText, 255)\r\n         fld.AllowZeroLength = <span style=\"color:blue;\">True<\/span>\r\n         tdf.Fields.Append fld\r\n         dbAddIn.TableDefs.Append tdf\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     CreateUSysRegInfo = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Code zum Erstellen der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Ist die Tabelle jedoch noch nicht vorhanden, legt die Prozedur diese mit der Methode <b>CreateTableDef <\/b>des <b>Database<\/b>-Objekts an und legt dabei direkt den Namen <b>USysRegInfo <\/b>fest. Danach f&uuml;gt sie durch mehrfaches Aufrufen der <b>CreateField<\/b>-Methode des zuvor erstellten <b>TableDef<\/b>-Objekts die Felder <b>Subkey<\/b>, <b>Type<\/b>, <b>ValName <\/b>und <b>Value <\/b>mit den entsprechenden Datentypen hinzu. Das Feld <b>Type <\/b>wird dabei als Zahlenfeld definiert und alle anderen als Textfelder mit einer L&auml;nge von 255 Zeichen.<\/p>\n<p>Jedes neue <b>Field<\/b>-Objekt wird nach dem Erstellen mit der <b>Append<\/b>-Methode an die <b>Fields<\/b>-Auflistung des <b>TableDef<\/b>-Objekts angeh&auml;ngt. F&uuml;r das Feld <b>Value <\/b>wird au&szlig;erdem die Eigenschaft <b>AllowZeroLength <\/b>auf <b>True <\/b>eingestellt.<\/p>\n<p>Schlie&szlig;lich h&auml;ngt die Prozedur auch das neue <b>TableDef<\/b>-Objekt an die <b>TableDefs<\/b>-Auflistung des <b>Database<\/b>-Objekts der aktuellen Datenbank an.<\/p>\n<h2>Anlegen der Tabelleneintr&auml;ge f&uuml;r die Registrierung<\/h2>\n<p>Die n&auml;chste Funktion namens <b>AddRegistryEntries <\/b>&uuml;bernimmt eine sehr wichtige Aufgabe, denn beim Anlegen der Eintr&auml;ge der Tabelle <b>USysRegInfo<\/b> treten die meisten Fehler beim Erstellen von Access-Add-Ins auf (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddRegistryEntries(dbAddIn<span style=\"color:blue;\"> As <\/span>dao.Database, dbTemplate<span style=\"color:blue;\"> As <\/span>dao.Database, strAddInName<span style=\"color:blue;\"> As String<\/span>, _\r\n         lngTemplateID<span style=\"color:blue;\"> As Long<\/span>, strExpression<span style=\"color:blue;\"> As String<\/span>, strDescription<span style=\"color:blue;\"> As String<\/span>, strFilename<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>rstTemplate<span style=\"color:blue;\"> As <\/span>dao.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstAddIn<span style=\"color:blue;\"> As <\/span>dao.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strValue<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> rstAddIn = dbAddIn.OpenRecordset(\"USysRegInfo\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstTemplate = dbTemplate.OpenRecordset(\"SELECT * FROM tblRegistryEntries WHERE TemplateID = \" _\r\n         & lngTemplateID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstTemplate.EOF\r\n         strValue = Nz(rstTemplate!RegistryValue)\r\n         strValue = <span style=\"color:blue;\">Replace<\/span>(strValue, \"[Expression]\", strExpression)\r\n         strValue = <span style=\"color:blue;\">Replace<\/span>(strValue, \"[Description]\", strDescription)\r\n         strValue = <span style=\"color:blue;\">Replace<\/span>(strValue, \"[Filename]\", strFilename)\r\n         rstAddIn.Add<span style=\"color:blue;\">New<\/span>\r\n         rstAddIn!Subkey = rstTemplate!RegistrySubkey & strAddInName\r\n         rstAddIn!Type = rstTemplate!RegistryEntryType\r\n         rstAddIn!ValName = rstTemplate!RegistryValname\r\n         rstAddIn!Value = strValue\r\n         rstAddIn.Update\r\n         rstTemplate.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Code zum F&uuml;llen der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p>Sie erwartet als Parameter neben den Verweisen auf das aktuelle und das zuk&uuml;nftige Add-In den Namen des Add-Ins, die ID des zu verwendenden Templates (hier gibt es aktuell nur den Wert <b>1 <\/b>f&uuml;r das Men&uuml;-Add-In), die aufzurufende Funktion, die Beschreibung und den Dateinamen (mit der Dateiendung <b>.accda<\/b>).<\/p>\n<p>Die Funktion &ouml;ffnet ein Recordset auf Basis der soeben angelegten Tabelle <b>USysRegInfo <\/b>in der Zieldatenbank. Au&szlig;erdem erstellt sie ein Recordset, das die Daten der Tabelle <b>tblRegistryEntries <\/b>des Add-In-Creators f&uuml;r das verwendete Template enth&auml;lt.<\/p>\n<p>Diese Tabelle enth&auml;lt im aktuellen Zustand nur die Basisdaten f&uuml;r das Anlegen von Men&uuml;-Add-Ins (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_003.png\" alt=\"Tabelle mit den Basisdaten zum F&uuml;llen der neuen USysRegInfo-Tabelle\" width=\"700\" height=\"169,4318\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Tabelle mit den Basisdaten zum F&uuml;llen der neuen USysRegInfo-Tabelle<\/span><\/b><\/p>\n<p>Die Funktion durchl&auml;uft anschlie&szlig;end alle Datens&auml;tze dieser Tabelle f&uuml;r die &uuml;bergebene TemplateID und schreibt den Wert des Feldes <b>RegistryValue <\/b>in die Variable <b>strValue<\/b>. F&uuml;r diese ersetzt sie die Platzhalter <b>[Expression]<\/b>, <b>[Description] <\/b>und <b>[Filename] <\/b>durch die jeweiligen mit <b>strExpression<\/b>, <b>strDescription <\/b>und <b>strFilename <\/b>gelieferten Werte.<\/p>\n<p>Dann legt sie f&uuml;r den aktuellen Datensatz der Tabelle <b>tblRegistryEntries <\/b>einen neuen Datensatz in der Tabelle <b>USysRegInfo <\/b>an und tr&auml;gt die Werte f&uuml;r die Felder <b>Subkey<\/b>, <b>Type<\/b>, <b>ValName <\/b>und <b>Value <\/b>ein.<\/p>\n<p>Das Ergebnis f&uuml;r die Beispieldaten aus dem Screenshot von oben finden Sie in Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_004.png\" alt=\"Frisch gef&uuml;llte USysRegInfo-Tabelle\" width=\"700\" height=\"145,9364\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Frisch gef&uuml;llte USysRegInfo-Tabelle<\/span><\/b><\/p>\n<h2>Anlegen und Schreiben der Datenbankeigenschaften<\/h2>\n<p>Die Prozedur <b>ChangeProperties <\/b>erwartet einen Verweis auf die zuk&uuml;nftige Add-In-Datenbank, den Namen des Add-Ins, die Beschreibung und die Firma als Parameter (siehe Listing 4). Sie soll die Datenbankeigenschaften &auml;ndern, die wir sehen, wenn wir im Ribbon auf <b>Datei|Informationen <\/b>und dann auf <b>Datenbankeigenschaften anzeigen und bearbeiten <\/b>klicken.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ChangeProperties(dbAddIn<span style=\"color:blue;\"> As <\/span>dao.Database, strAddInName<span style=\"color:blue;\"> As String<\/span>, strDescription<span style=\"color:blue;\"> As String<\/span>, _\r\n         strCompany<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>con<span style=\"color:blue;\"> As <\/span>dao.Container\r\n     <span style=\"color:blue;\">Dim <\/span>doc<span style=\"color:blue;\"> As <\/span>dao.Document\r\n     <span style=\"color:blue;\">Dim <\/span>prp<span style=\"color:blue;\"> As <\/span>dao.Property\r\n     <span style=\"color:blue;\">Set<\/span> con = dbAddIn.Containers(\"Databases\")\r\n     <span style=\"color:blue;\">Set<\/span> doc = con.Documents(\"SummaryInfo\")\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> prp = doc.CreateProperty(\"Title\", dbText, strAddInName)\r\n     doc.Properties.Append prp\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         doc.Properties(\"Title\") = strAddInName\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> prp = doc.CreateProperty(\"Company\", dbText, strCompany)\r\n     doc.Properties.Append prp\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         doc.Properties(\"Company\") = strCompany\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> prp = doc.CreateProperty(\"Comments\", dbText, strDescription)\r\n     doc.Properties.Append prp\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         doc.Properties(\"Comments\") = strDescription\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Code zum Anlegen und F&uuml;llen von Datenbank-Eigenschaften<\/span><\/b><\/p>\n<p>Um diese Eigenschaften zu &auml;ndern, m&uuml;ssen wir mit <b>Container<\/b>-, <b>Document<\/b>&#8211; und <b>Property<\/b>-Eigenschaften arbeiten. Deshalb referenziert die Prozedur zuerst das <b>Container<\/b>-Objekt <b>Databases <\/b>des zuk&uuml;nftigen Access-Add-Ins und dann das darin enthaltene <b>Document<\/b>-Objekt <b>SummaryInfo<\/b>. Hier versuchen wir nacheinander, bei deaktivierter Fehlerbehandlung die Eigenschaften <b>Title<\/b>, <b>Company <\/b>und <b>Comments <\/b>anzulegen und zu f&uuml;llen. Den Fehler, der bei bereits vorhandenen Properties ausgel&ouml;st wird, ignorieren wir so und f&uuml;llen sicherheitshalber anschlie&szlig;end nochmals die Properties mit den Werten aus den jeweiligen Parametern.<\/p>\n<p>Das Ergebnis sieht anschlie&szlig;end wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_005.png\" alt=\"Automatisch gef&uuml;llte Datenbankeigenschaften\" width=\"424,5589\" height=\"458,6841\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Automatisch gef&uuml;llte Datenbankeigenschaften<\/span><\/b><\/p>\n<h2>Hinzuf&uuml;gen eines Moduls mit der Startfunktion<\/h2>\n<p>Damit fehlt noch das Hinzuf&uuml;gen der VBA-Funktion, die beim Starten des Access-Add-Ins ausgel&ouml;st werden soll und die wir bereits in die Tabelle <b>USysRegInfo <\/b>eingetragen haben. Diese Aufgabe &uuml;bernimmt die Funktion <b>AddStartfunction<\/b>, die eine Verweis auf die zuk&uuml;nftige Add-In-Datenbank erwartet sowie den Namen der anzulegenden Funktion (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddStartfunction(dbAddIn<span style=\"color:blue;\"> As <\/span>dao.Database, strFunction<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strModulePath<span style=\"color:blue;\"> As String<\/span>\r\n     strModulePath = CurrentProject.Path & \"\\mdlAddIn.bas\"\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill strModulePath\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     strCode = \"Option Explicit\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"Option Compare Database\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"Public Function \" & strFunction & \"()\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"    Msgbox \"\"Beispiel-Add-In\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strCode = strCode & \"End Function\"\r\n     Open strModulePath For Append<span style=\"color:blue;\"> As <\/span>#1\r\n     Print #1, strCode\r\n     Close #1\r\n     LoadFromText acModule, \"mdlAddIn\", strModulePath\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Code zum Hinzuf&uuml;gen der Startfunktion des Access-Add-Ins<\/span><\/b><\/p>\n<p>Sie stellt den Pfad f&uuml;r eine Textdatei zusammen, die im gleichen Verzeichnis wie die aktuell bearbeitete Datenbank liegt und den Namen <b>mdlAddIn.bas <\/b>erh&auml;lt.<\/p>\n<p>Sollte diese Datei bereits vorhanden sein, wird sie zuvor gel&ouml;scht. Dann stellt die Prozedur in der Variablen <b>strCode <\/b>den Inhalt des zu erstellenden Moduls zusammen. Dabei f&uuml;gt sie den Namen der Funktion an die entsprechende Stelle im Code ein.<\/p>\n<p>Den vollst&auml;ndigen Inhalt des Moduls speichert die Prozedur anschlie&szlig;end in der Datei aus <b>strModulePath<\/b>.<\/p>\n<p>Schlie&szlig;lich liest sie diese Datei mit der <b>LoadFromText<\/b>-Methode als neues Modul in die aktuelle Datenbank ein.<\/p>\n<p>Damit sind die Arbeiten abgeschlossen &#8211; der letzte Schritt ist gegebenenfalls das Umbenennen des Datenbanknamens, sodass die Dateiendung <b>.accda <\/b>lautet. Der Teil vor der Dateiendung sollte nun allerdings nicht mehr ge&auml;ndert werden, da sonst die Eintr&auml;ge in der Tabelle <b>USysRegInfo <\/b>nicht mehr passen.<\/p>\n<h2>Add-In-Creator als Add-In installieren<\/h2>\n<p>Bevor wir mit dem Add-In andere Add-Ins erstellen k&ouml;nnen, m&uuml;ssen wir es jedoch erst noch als Add-In installieren. Der Vorteil ist: Das Add-In hat alle Werkzeuge an Bord, um sich selbst in ein Access-Add-In umzur&uuml;sten. Dazu rufen wir das Formular <b>frmAddInCreator <\/b>auf und f&uuml;llen die Felder wie in Bild 6.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_006.png\" alt=\"Umr&uuml;sten des Add-In-Creators zu einem Add-In\" width=\"424,5589\" height=\"268,411\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Umr&uuml;sten des Add-In-Creators zu einem Add-In<\/span><\/b><\/p>\n<p>Dann klicken wir auf die Schaltfl&auml;che <b>Zum Add-In umr&uuml;sten<\/b>. Im Navigationsbereich sollten die Tabelle <b>USysRegInfo <\/b>und das Modul <b>mdlAddIn <\/b>erscheinen (die Tabelle ist nur sichtbar, wenn die Anzeige von Systemobjekten aktiviert ist). Wenn die Datenbank bereits die richtige Dateiendung hat, k&ouml;nnen wir diese nun schlie&szlig;en, eine beliebige andere Datenbank &ouml;ffnen und dort den Add-In-Manager aktivieren.<\/p>\n<p>Zuvor m&uuml;ssen wir allerdings noch die Funktion <b>Autostart <\/b>anpassen. Diese zeigt aktuell noch ein Meldungsfenster an, aber wir wollen das Formular <b>frmAddInCreator <\/b>&ouml;ffnen. Deshalb gestalten wir die Funktion wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart()\r\n     DoCmd.OpenForm \"frmAddInCreator\"\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Ausprobieren des so erstellten Access-Add-Ins<\/h2>\n<p>Um das frisch erstellte Access-Add-In zu testen, m&uuml;ssen wir es noch als Add-In installieren.<\/p>\n<p>Dazu &ouml;ffnen wir eine beliebige Access-Datenbank und rufen dann den Ribbonbefehl <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>auf (siehe Bild 7). Dort klicken wir auf <b>Neues hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen unsere Add-In-Creator-Datenbank aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_007.png\" alt=\"Installieren eines Access-Add-Ins\" width=\"424,5589\" height=\"253,7593\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Installieren eines Access-Add-Ins<\/span><\/b><\/p>\n<p>Anschlie&szlig;end finden wir den neuen Eintrag bereits im Add-In-Manager vor (siehe Bild 8). Damit haben wir auch gleichzeitig gezeigt, dass die Funktionen schon wie gew&uuml;nscht arbeiten. Auch der nachfolgende Aufruf des Add-Ins &uuml;ber das Ribbon sollte ohne Probleme erfolgen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1427_008.png\" alt=\"Das neue Add-In im Add-In-Manager\" width=\"424,5589\" height=\"253,7593\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das neue Add-In im Add-In-Manager<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Die hier vorgestellte Version wandelt Datenbanken ausschlie&szlig;lich in Men&uuml;-Add-Ins um. Es gibt noch viele weitere Add-In-Typen, die andere Eintr&auml;ge in der Tabelle <b>USysRegInfo <\/b>erfordern und deren Startfunktion mit anderen Parametern ausgestattet werden muss.<\/p>\n<p>Die notwendigen Anpassungen an diesem Access-Add-In m&uuml;sste man noch erg&auml;nzen, wenn man auch andere Add-In-Typen erstellen m&ouml;chte.<\/p>\n<p>Grunds&auml;tzlich spart die hier vorgestellte L&ouml;sung bei regelm&auml;&szlig;iger Erstellung von Men&uuml;-Add-In jedoch schon viel Zeit ein und vor allem den &Auml;rger, den man sonst hat, wenn man nur einen kleinen Fehler bei der Zusammenstellung der Daten in der Tabelle <b>USysRegInfo <\/b>macht.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>AccessAddInCreator.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/8323483A-E97E-4FFA-8A3A-F09FD23DEC1A\/aiu_1427.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Immer, wenn ich ein neues Add-In f&uuml;r eine Automatisierung meiner Access-Entwicklung erstelle, f&uuml;hre ich die gleichen Schritte durch: Anlegen einer neuen Datenbank, Speichern als .accda, Erstellen der Tabelle USysRegInfo, Hinzuf&uuml;gen der Daten f&uuml;r die Registry, Einstellen der Datenbankinformationen, sodass diese im Add-In-Manager angezeigt werden und Programmieren der Funktion, die beim Start des Add-Ins aufgerufen werden soll. Und erst danach f&auml;ngt der eigentliche Spa&szlig; an, n&auml;mlich die Programmierung der Funktion, die ich gern mit dem Add-In erledigen m&ouml;chte. Weil ich das oft genug gemacht habe, baue ich im Rahmen dieses Beitrags ein Tool, mit dem ich solche Add-Ins per Mausklick erstellen kann &#8211; beziehungsweise ein Add-In, mit dem ich die aktuelle Datenbank in ein Add-In umwandeln kann. <\/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":[66022023,662023,44000027],"tags":[],"class_list":["post-55001427","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Access-Add-In per Knopfdruck erstellen - 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\/AccessAddIn_per_Knopfdruck_erstellen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Access-Add-In per Knopfdruck erstellen\" \/>\n<meta property=\"og:description\" content=\"Immer, wenn ich ein neues Add-In f&uuml;r eine Automatisierung meiner Access-Entwicklung erstelle, f&uuml;hre ich die gleichen Schritte durch: Anlegen einer neuen Datenbank, Speichern als .accda, Erstellen der Tabelle USysRegInfo, Hinzuf&uuml;gen der Daten f&uuml;r die Registry, Einstellen der Datenbankinformationen, sodass diese im Add-In-Manager angezeigt werden und Programmieren der Funktion, die beim Start des Add-Ins aufgerufen werden soll. Und erst danach f&auml;ngt der eigentliche Spa&szlig; an, n&auml;mlich die Programmierung der Funktion, die ich gern mit dem Add-In erledigen m&ouml;chte. Weil ich das oft genug gemacht habe, baue ich im Rahmen dieses Beitrags ein Tool, mit dem ich solche Add-Ins per Mausklick erstellen kann - beziehungsweise ein Add-In, mit dem ich die aktuelle Datenbank in ein Add-In umwandeln kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-17T09:31:26+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=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Access-Add-In per Knopfdruck erstellen\",\"datePublished\":\"2023-06-17T09:31:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/\"},\"wordCount\":2522,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/b24b1d7cd7f04454b2b4401d4c9331a0\",\"articleSection\":[\"2\\\/2023\",\"2023\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/\",\"name\":\"Access-Add-In per Knopfdruck erstellen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/b24b1d7cd7f04454b2b4401d4c9331a0\",\"datePublished\":\"2023-06-17T09:31:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/b24b1d7cd7f04454b2b4401d4c9331a0\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/b24b1d7cd7f04454b2b4401d4c9331a0\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/AccessAddIn_per_Knopfdruck_erstellen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Access-Add-In per Knopfdruck erstellen\"}]},{\"@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-Add-In per Knopfdruck erstellen - 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\/AccessAddIn_per_Knopfdruck_erstellen\/","og_locale":"de_DE","og_type":"article","og_title":"Access-Add-In per Knopfdruck erstellen","og_description":"Immer, wenn ich ein neues Add-In f&uuml;r eine Automatisierung meiner Access-Entwicklung erstelle, f&uuml;hre ich die gleichen Schritte durch: Anlegen einer neuen Datenbank, Speichern als .accda, Erstellen der Tabelle USysRegInfo, Hinzuf&uuml;gen der Daten f&uuml;r die Registry, Einstellen der Datenbankinformationen, sodass diese im Add-In-Manager angezeigt werden und Programmieren der Funktion, die beim Start des Add-Ins aufgerufen werden soll. Und erst danach f&auml;ngt der eigentliche Spa&szlig; an, n&auml;mlich die Programmierung der Funktion, die ich gern mit dem Add-In erledigen m&ouml;chte. Weil ich das oft genug gemacht habe, baue ich im Rahmen dieses Beitrags ein Tool, mit dem ich solche Add-Ins per Mausklick erstellen kann - beziehungsweise ein Add-In, mit dem ich die aktuelle Datenbank in ein Add-In umwandeln kann.","og_url":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-06-17T09:31:26+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Access-Add-In per Knopfdruck erstellen","datePublished":"2023-06-17T09:31:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/"},"wordCount":2522,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/b24b1d7cd7f04454b2b4401d4c9331a0","articleSection":["2\/2023","2023","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/","url":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/","name":"Access-Add-In per Knopfdruck erstellen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/b24b1d7cd7f04454b2b4401d4c9331a0","datePublished":"2023-06-17T09:31:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/b24b1d7cd7f04454b2b4401d4c9331a0","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/b24b1d7cd7f04454b2b4401d4c9331a0"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/AccessAddIn_per_Knopfdruck_erstellen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Access-Add-In per Knopfdruck erstellen"}]},{"@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\/55001427","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=55001427"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001427\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}