{"id":55001627,"date":"2026-12-01T00:00:00","date_gmt":"2026-11-09T18:56:25","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1627"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Steuerelemente_ausrichten_per_COMAddIn","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/","title":{"rendered":"Steuerelemente ausrichten per COM-Add-In"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870\" width=\"1\" height=\"1\" alt=\"\"><b>Im Beitrag &#8222;Steuerelemente ausrichten per VBA&#8220; (www.access-im-unternehmen.de\/1429) haben wir eine Prozedur entwickelt, die markierte Steuerelemente samt Bezeichnungsfeldern in der Entwurfsansicht ausrichtet. Damit wir sie nutzen k&ouml;nnen, muss der Code in der jeweiligen Datenbank vorliegen. Bequemer ist es, wenn sie in jeder Datenbank &uuml;ber das Ribbon und das Kontextmen&uuml; der Steuerelemente bereitsteht. Wie wir dazu ein COM-Add-In mit twinBASIC bauen, zeigt der vorliegende Beitrag.<\/b><\/p>\n<h2>Von der VBA-Prozedur zum COM-Add-In<\/h2>\n<p>Access l&auml;dt ein COM-Add-In beim Start. Seine Funktionen stehen damit unabh&auml;ngig von der ge&ouml;ffneten Datenbank zur Verf&uuml;gung. Wir m&uuml;ssen keinen Code in einzelne Datenbanken kopieren. Die Prozedur aus dem VBA-Beitrag bleibt im Kern erhalten. Es &auml;ndert sich, wie wir ihre Parameter festlegen und wie wir sie aufrufen.<\/p>\n<p>Die Parameter <b>lngDistanceLabelControl<\/b>, <b>lngVerticalDistance<\/b>, <b>lngAlignment<\/b> und <b>bolColons<\/b> der Prozedur <b>AlignControls<\/b> erscheinen als Elemente im Ribbon. Zwei Textfelder legen den horizontalen Abstand zwischen Bezeichnungsfeld und Steuerelement sowie den vertikalen Abstand fest, jeweils in Twips. Eine Dropdownliste bestimmt die Textausrichtung der Bezeichnungsfelder, und ein Kontrollk&auml;stchen schaltet den Doppelpunkt (<b>:<\/b>) hinter den Beschriftungen ein. Zwei Schaltfl&auml;chen starten das Ausrichten und das Anh&auml;ngen der Doppelpunkte (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1627_001.png\" alt=\"Der neue Bereich im Ribbon\" width=\"700\" height=\"339,4648\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Der neue Bereich im Ribbon<\/span><\/b><\/p>\n<p>Dieselben beiden Befehle f&uuml;gen wir dem Kontextmen&uuml; der Steuerelemente hinzu (siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1627_002.png\" alt=\"Die beiden Befehle im Kontextmen&uuml;\" width=\"499,5589\" height=\"405,833\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die beiden Befehle im Kontextmen&uuml;<\/span><\/b><\/p>\n<p>Das Register im Ribbon soll nur erscheinen, wenn wir ein Formular oder einen Bericht in der Entwurfsansicht bearbeiten. Daf&uuml;r verwenden wir kontextbezogene Register.<\/p>\n<p>Das Add-In besteht aus drei Teilen. Die Klasse <b>ControlAligner<\/b> enth&auml;lt die Anbindung an Access, das Ribbon und die Kontextmen&uuml;s. Das Modul <b>Alignment<\/b> enth&auml;lt die Ausrichtungslogik. Das Modul <b>DllRegistration<\/b> tr&auml;gt das Add-In bei der Registrierung in die Registry ein.<\/p>\n<h2>Das twinBASIC-Projekt anlegen<\/h2>\n<p>Wie wir twinBASIC einrichten und ein COM-Add-In f&uuml;r Access aufbauen, haben wir in den Beitr&auml;gen <b>twinBASIC &#8211; VB\/VBA mit moderner Umgebung (www.access-im-unternehmen.de\/1303)<\/b> und <b>twinBASIC &#8211; COM-Add-Ins f&uuml;r Access (www.access-im-unternehmen.de\/1306)<\/b> beschrieben. Hier legen wir ein neues Projekt vom Typ <b>ActiveX-DLL <\/b>mit dem Namen <b>amvControlAligner<\/b> an und f&uuml;gen die drei Quelldateien hinzu. Das Projekt ben&ouml;tigt vier Verweise.<\/p>\n<ul>\n<li><b>OLE Automation:<\/b> liefert die Standardtypen (<b>stdole2.tlb<\/b>).<\/li>\n<li><b>Microsoft Add-In Designer:<\/b> liefert die Schnittstelle <b>IDTExtensibility2<\/b> (<b>MSADDNDR.DLL<\/b>).<\/li>\n<li><b>Microsoft Office 16.0 Object Library:<\/b> liefert die Schnittstellen <b>IRibbonExtensibility<\/b> und <b>IRibbonControl<\/b> (<b>MSO.DLL<\/b>).<\/li>\n<li><b>Microsoft Access 16.0 Object Library:<\/b> liefert die Typen von Access (<b>MSACC.OLB<\/b>).<\/li>\n<\/ul>\n<p>Au&szlig;erdem schalten wir <b>Option Explicit<\/b> f&uuml;r das Projekt ein. Die DLL muss dieselbe Bitbreite wie die installierte Access-Version haben. In unserem Beispiel ist das die 32-Bit-Version von Access.<\/p>\n<p>Nach dem Erstellen m&uuml;ssen wir die DLL registrieren. Das Modul <b>DllRegistration<\/b> schreibt dazu unter <b>HKCU\\SOFTWARE\\Microsoft\\Office\\Access\\Addins<\/b> einen Schl&uuml;ssel mit dem Namen <b>amvControlAligner.ControlAligner<\/b> und den Werten <b>FriendlyName<\/b>, <b>Description<\/b> und <b>LoadBehavior<\/b>. Der Wert <b>3<\/b> f&uuml;r <b>LoadBehavior<\/b> bewirkt, dass Access das Add-In beim Start l&auml;dt. Das Vorgehen dazu zeigt der Beitrag <b>COM-Add-Ins und -DLLs installieren oder registrieren (www.access-im-unternehmen.de\/1484)<\/b>.<\/p>\n<h2>Die Klasse des Add-Ins<\/h2>\n<p>Die Klasse <b>ControlAligner<\/b> implementiert zwei Schnittstellen. <b>IDTExtensibility2<\/b> meldet dem Add-In, dass Access es l&auml;dt oder entl&auml;dt. <b>IRibbonExtensibility<\/b> liefert Access beim Laden die Ribbondefinition:<\/p>\n<pre>[ ClassId (\"940037E2-0FB7-89-B188-3212448EA4EC\") ]\r\n<span style=\"color:blue;\">Class<\/span> ControlAligner\r\n    Implements IDTExtensibility2\r\n    [ WithDispatchForwarding ]\r\n    Implements IRibbonExtensibility\r\n    <span style=\"color:blue;\">Private <\/span>objAccess<span style=\"color:blue;\"> As <\/span>Access.Application\r\n    <span style=\"color:blue;\">Private <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>IRibbonUI\r\n    <span style=\"color:blue;\">Private <\/span>lngDistanceLabelControl<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Private <\/span>lngVerticalDistance<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Private <\/span>lngAlignment<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Private <\/span>bolColons<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Private <\/span>WithEvents cbbFormAlign<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    <span style=\"color:blue;\">Private <\/span>WithEvents cbbFormColons<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    <span style=\"color:blue;\">Private <\/span>WithEvents cbbReportAlign<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    <span style=\"color:blue;\">Private <\/span>WithEvents cbbReportColons<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    ...\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Das Attribut <b>ClassId<\/b> legt die Klassen-ID fest, unter der Access das Add-In findet. Jedes Add-In ben&ouml;tigt eine eigene ID. Das Attribut <b>WithDispatchForwarding<\/b> vor <b>IRibbonExtensibility<\/b> sorgt daf&uuml;r, dass Access die im Ribbon-XML angegebenen Callbackprozeduren anhand ihres Namens in der Klasse aufrufen kann.<\/p>\n<p>Die Variable <b>objAccess<\/b> nimmt die Access-Anwendung auf und <b>objRibbon<\/b> das Ribbon-Objekt, das wir zum Aktualisieren ben&ouml;tigen. Die vier Variablen f&uuml;r die Einstellungen entsprechen den Parametern der Ausrichtung. Die vier mit <b>WithEvents<\/b> deklarierten Variablen vom Typ <b>CommandBarButton<\/b> nehmen sp&auml;ter die Schaltfl&auml;chen der Kontextmen&uuml;s auf und liefern deren Ereignis <b>Click<\/b>.<\/p>\n<p>Beim Laden ruft Access die Prozedur <b>OnConnection<\/b> auf (siehe Listing 1). Sie speichert die Access-Anwendung in <b>objAccess<\/b>, l&auml;dt die gespeicherten Einstellungen und legt die Schaltfl&auml;chen in den Kontextmen&uuml;s an.<\/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    LoadSettings\r\n    SetCommandBars\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Die Prozedur OnConnection verbindet das Add-In mit Access<\/span><\/b><\/p>\n<p>Beim Entladen ruft Access die Prozedur <b>OnDisconnection<\/b> auf. Diese entfernt die Schaltfl&auml;chen wieder und gibt die Objektvariablen frei. Die &uuml;brigen Prozeduren der Schnittstelle (<b>OnAddInsUpdate<\/b>, <b>OnStartupComplete<\/b> und <b>OnBeginShutdown<\/b>) ben&ouml;tigen wir nicht und lassen sie leer. Da sie Teile der Schnittstelle <b>IDTExtensibility2 <\/b>sind, d&uuml;rfen wir sie nicht einfach weglassen.<\/p>\n<h2>Die Einstellungen speichern<\/h2>\n<p>Die Einstellungen sollen beim n&auml;chsten Start von Access wieder zur Verf&uuml;gung stehen. Das Add-In speichert sie mit der Funktion <b>SaveSetting<\/b> in der Registry und liest sie in der Prozedur <b>LoadSettings<\/b> mit der Funktion <b>GetSetting<\/b> wieder ein. Fehlt ein Eintrag, verwendet <b>LoadSettings<\/b> die Standardwerte. Das sind <b>100<\/b> Twips f&uuml;r beide Abst&auml;nde, die Textausrichtung <b>Standard<\/b> und keine Doppelpunkte.<\/p>\n<p>Die Prozedur <b>SaveSettings<\/b> schreibt die vier Werte und aktualisiert danach das Ribbon (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SaveSettings()\r\n    SaveSetting SETTINGS_APP, SETTINGS_SECTION, \"AbstandBezeichnung\", CStr(lngDistanceLabelControl)\r\n    SaveSetting SETTINGS_APP, SETTINGS_SECTION, \"AbstandVertikal\", CStr(lngVerticalDistance)\r\n    SaveSetting SETTINGS_APP, SETTINGS_SECTION, \"Ausrichtung\", CStr(lngAlignment)\r\n    SaveSetting SETTINGS_APP, SETTINGS_SECTION, \"Doppelpunkte\", IIf(bolColons, \"1\", \"0\")\r\n    'Das Ribbon enth&auml;lt die Steuerelemente je einmal f&uuml;r\r\n    'Formulare und Berichte und muss beide neu lesen.\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objRibbon Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        objRibbon.Invalidate\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 2: Die Prozedur SaveSettings speichert die Einstellungen<\/span><\/b><\/p>\n<p>Der Aufruf der Methode <b>Invalidate<\/b> ist erforderlich, weil das Ribbon die Elemente zweimal enth&auml;lt, einmal im Register f&uuml;r Formulare und einmal im Register f&uuml;r Berichte. &Auml;ndern wir einen Wert in einem der beiden Register, m&uuml;ssen beide ihre Anzeige neu einlesen.<\/p>\n<p>Die Eingaben in die beiden Textfelder pr&uuml;ft die Funktion <b>ParseDistance<\/b>. Sie wandelt den Text mit der Funktion <b>Val<\/b> in eine ganze Zahl zwischen <b>0<\/b> und <b>99999<\/b> um.<\/p>\n<p>Ist die Eingabe keine Zahl oder liegt sie au&szlig;erhalb dieses Bereichs, liefert die Funktion den Standardwert <b>100<\/b>. Die Obergrenze ergibt sich aus der L&auml;nge der Eingabe, die wir im Ribbon mit dem Attribut <b>maxLength<\/b> auf f&uuml;nf Zeichen begrenzen:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ParseDistance(ByVal strText<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">If <\/span>IsNumeric(strText)<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">If <\/span>Val(strText) &gt;= 0 And Val(strText) &lt;= 99999<span style=\"color:blue;\"> Then<\/span>\r\n            ParseDistance = CLng(Val(strText))\r\n            <span style=\"color:blue;\">Exit Function<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    ParseDistance = 100\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Das Ribbon mit kontextbezogenen Registern<\/h2>\n<p>Access ruft beim Laden die Funktion <b>GetCustomUI<\/b> der Schnittstelle <b>IRibbonExtensibility<\/b> auf und erwartet als Ergebnis den XML-Code der Ribbondefinition. Wir erzeugen ihn in dieser Funktion (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetCustomUI(ByVal RibbonID<span style=\"color:blue;\"> As String<\/span>) _\r\n       <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\"\"\" & _\r\n              \" onLoad=\"\"OnRibbonLoad\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;ribbon startFromScratch=\"\"false\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;contextualTabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;tab<span style=\"color:blue;\">Set<\/span> idMso=\"\"TabSetFormTools\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= GetTabXml(\"Form\")\r\n    strXML &= \"&lt;\/tabSet&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;tab<span style=\"color:blue;\">Set<\/span> idMso=\"\"TabSetReportTools\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= GetTabXml(\"Report\")\r\n    strXML &= \"&lt;\/tabSet&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;\/contextualTabs&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"&lt;\/ribbon&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    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 3: Die Funktion GetCustomUI liefert die Ribbondefinition<\/span><\/b><\/p>\n<p>Das Attribut <b>onLoad<\/b> des Elements <b>customUI<\/b> nennt die Callbackprozedur <b>OnRibbonLoad<\/b>, &uuml;ber die wir das Ribbon-Objekt erhalten. Das Register soll nur im Entwurf von Formularen und Berichten erscheinen.<\/p>\n<p>Deshalb enth&auml;lt das Element <b>contextualTabs<\/b> zwei Elemente <b>tabSet<\/b>. &Uuml;ber die Werte <b>TabSetFormTools<\/b> und <b>TabSetReportTools<\/b> des Attributs <b>idMso<\/b> w&auml;hlen wir die kontextbezogenen Registergruppen f&uuml;r Formulare und Berichte aus. Access blendet das Register ein, wenn das Objekt in der Entwurfsansicht ge&ouml;ffnet ist. In der Formularansicht erscheint es nicht.<\/p>\n<p>Access pr&uuml;ft die Werte f&uuml;r <b>idMso<\/b> beim Laden des Ribbons.<\/p>\n<p>Verwenden wir einen unbekannten Wert, meldet Access einen Fehler in der benutzerdefinierten Benutzeroberfl&auml;che.<\/p>\n<p>Beide Registergruppen erhalten dasselbe Register. Weil jedes Element im Ribbon eine eindeutige ID ben&ouml;tigt, h&auml;ngt die Funktion <b>GetTabXml<\/b> an alle IDs ein Suffix an, n&auml;mlich <b>Form<\/b> f&uuml;r Formulare und <b>Report<\/b> f&uuml;r Berichte (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetTabXml(ByVal strSuffix<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strXML<span style=\"color:blue;\"> As String<\/span>\r\n    strXML &= \"        &lt;tab id=\"\"tabAmvAlign\" & strSuffix & \"\"\" label=\"\"Steuerelemente ausrichten\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"          &lt;group id=\"\"grpAmvSettings\" & strSuffix & \"\"\" label=\"\"Einstellungen\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;editBox id=\"\"edtDistanceLabel\" & strSuffix & \"\"\" label=\"\"Abstand Bezeichnung\/Feld\"\" \" & _\r\n              \"sizeString=\"\"99999\"\" maxLength=\"\"5\"\"\" & \" screentip=\"\"Horizontaler Abstand in Twips\"\" \" & _\r\n              \"getText=\"\"GetDistanceLabelText\"\" onChange=\"\"OnDistanceLabelChange\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;editBox id=\"\"edtDistanceVertical\" & strSuffix & \"\"\" label=\"\"Vertikaler Abstand\"\" \" & _\r\n              \"sizeString=\"\"99999\"\" maxLength=\"\"5\"\"\" & \" screentip=\"\"Vertikaler Abstand zwischen den Zeilen in \" & _\r\n              \"Twips\"\" getText=\"\"GetDistanceVerticalText\"\" onChange=\"\"OnDistanceVerticalChange\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;dropDown id=\"\"ddAlignment\" & strSuffix & \"\"\" label=\"\"Beschriftung\"\" \" & _\r\n              \"screentip=\"\"Textausrichtung der Bezeichnungsfelder\"\"\" & _\r\n              \" getSelectedItemIndex=\"\"GetAlignmentIndex\"\" onAction=\"\"OnAlignmentChange\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"              &lt;item id=\"\"itmAlign0\" & strSuffix & \"\"\" label=\"\"Standard\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"              &lt;item id=\"\"itmAlign1\" & strSuffix & \"\"\" label=\"\"Links\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"              &lt;item id=\"\"itmAlign2\" & strSuffix & \"\"\" label=\"\"Zentriert\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"              &lt;item id=\"\"itmAlign3\" & strSuffix & \"\"\" label=\"\"Rechts\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"              &lt;item id=\"\"itmAlign4\" & strSuffix & \"\"\" label=\"\"Verteilen\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;\/dropDown&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;checkBox id=\"\"chkColons\" & strSuffix & \"\"\" label=\"\"Mit Doppelpunkten\"\" \" & _\r\n              \"screentip=\"\"Beim Ausrichten Doppelpunkte hinter die Beschriftungen setzen\"\"\" & _\r\n              \" getPressed=\"\"GetColonsPressed\"\" onAction=\"\"OnColonsChange\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"          &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"          &lt;group id=\"\"grpAmvActions\" & strSuffix & \"\"\" label=\"\"Befehle\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;button id=\"\"btnAlign\" & strSuffix & \"\"\" label=\"\"Steuerelemente ausrichten\"\" \" & _\r\n              \"size=\"\"large\"\" imageMso=\"\"AlignLeft\"\"\" & \" screentip=\"\"Markierte Steuerelemente ausrichten\"\" \" & _\r\n              \"onAction=\"\"OnAlignClicked\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"            &lt;button id=\"\"btnColons\" & strSuffix & \"\"\" label=\"\"Doppelpunkte anh&auml;ngen\"\" \" & _\r\n              \"size=\"\"large\"\" imageMso=\"\"AlignRight\"\"\" & \" screentip=\"\"Markierten Bezeichnungsfeldern einen \" & _\r\n              \"Doppelpunkt anh&auml;ngen\"\" onAction=\"\"OnColonsClicked\"\"\/&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"          &lt;\/group&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    strXML &= \"        &lt;\/tab&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 4: Die Funktion GetTabXml erzeugt das Register<\/span><\/b><\/p>\n<p>Die Gruppe <b>Einstellungen<\/b> enth&auml;lt zwei Elemente <b>editBox<\/b> f&uuml;r die Abst&auml;nde, ein Element <b>dropDown<\/b> mit den f&uuml;nf Eintr&auml;gen <b>Standard<\/b>, <b>Links<\/b>, <b>Zentriert<\/b>, <b>Rechts<\/b> und <b>Verteilen<\/b> f&uuml;r die Textausrichtung der Bezeichnungsfelder sowie ein Element <b>checkBox<\/b> f&uuml;r die Doppelpunkte. Die Reihenfolge der Eintr&auml;ge in der Dropdownliste entspricht den Werten der Eigenschaft <b>TextAlign<\/b>, also <b>0<\/b> f&uuml;r <b>Standard<\/b> bis <b>4<\/b> f&uuml;r <b>Verteilen<\/b>. Die Gruppe <b>Befehle<\/b> enth&auml;lt die Schaltfl&auml;chen <b>Steuerelemente ausrichten<\/b> und <b>Doppelpunkte anh&auml;ngen<\/b>.<\/p>\n<p>Im Formularentwurf zeigt Access es hinter dem Register <b>Format<\/b> an (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1627_003.png\" alt=\"Das Register Steuerelemente ausrichten im Entwurf eines Formulars\" width=\"700\" height=\"127,9288\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Das Register Steuerelemente ausrichten im Entwurf eines Formulars<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;chen zeigen eingebaute Symbole von Office, die wir &uuml;ber das Attribut <b>imageMso<\/b> angeben. Eigene Bilder binden wir nach dem Muster aus dem Beitrag <b>Benutzerdefinierte Bilder in twinBASIC (www.access-im-unternehmen.de\/1325)<\/b> ein.<\/p>\n<h2>Die Callbackprozeduren des Ribbons<\/h2>\n<p>Die Callbackprozeduren stehen in derselben Klasse. Die erste ist <b>OnRibbonLoad<\/b>. Access &uuml;bergibt ihr das Objekt <b>IRibbonUI<\/b>, das wir in der Variablen <b>objRibbon<\/b> speichern.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnRibbonLoad(Ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n    <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>F&uuml;r jedes Element, das seinen Wert beim Anzeigen abfragt, gibt es eine Funktion, die den gespeicherten Wert liefert. Die Auswahl in der Dropdownliste liefert die Funktion <b>GetAlignmentIndex<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetAlignmentIndex(Control<span style=\"color:blue;\"> As <\/span>_\r\n        IRibbonControl)<span style=\"color:blue;\"> As Long<\/span>\r\n    Return lngAlignment\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Diese Callbacks sind in twinBASIC Funktionen mit einem R&uuml;ckgabewert. In VBA deklarieren wir Callbacks zum Abfragen eines Wertes als Prozedur mit einem Ausgabeparameter, den wir mit dem Schl&uuml;sselwort <b>ByRef<\/b> &uuml;bergeben. Verwenden wir diese Schreibweise im Add-In, zeigt Access beim Aufrufen die Meldung <b>Fehler beim Aufrufen der R&uuml;ckruffunktion<\/b> mit dem Namen der Prozedur an.<\/p>\n<p>W&auml;hlen wir einen anderen Eintrag der Dropdownliste, ruft Access die Prozedur <b>OnAlignmentChange<\/b> auf. Sie speichert den Index des gew&auml;hlten Eintrags in <b>lngAlignment<\/b> und ruft <b>SaveSettings<\/b> auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OnAlignmentChange(Control<span style=\"color:blue;\"> As <\/span>IRibbonControl, _\r\n        SelectedId<span style=\"color:blue;\"> As String<\/span>, SelectedIndex<span style=\"color:blue;\"> As Long<\/span>)\r\n    lngAlignment = SelectedIndex\r\n    SaveSettings\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Funktionen <b>GetDistanceLabelText<\/b>, <b>GetDistanceVerticalText<\/b> und <b>GetColonsPressed<\/b> liefern ihre Werte nach demselben Muster. Die Prozeduren <b>OnDistanceLabelChange<\/b> und <b>OnDistanceVerticalChange<\/b> wandeln die Eingabe mit <b>ParseDistance<\/b> um. <b>OnColonsChange<\/b> &uuml;bernimmt den Zustand des Kontrollk&auml;stchens. Diese drei Prozeduren speichern die Einstellungen anschlie&szlig;end mit <b>SaveSettings<\/b>. Den vollst&auml;ndigen Quellcode enthalten die Beispieldateien zu diesem Beitrag.<\/p>\n<p>Die beiden Schaltfl&auml;chen im Ribbon rufen die Prozeduren <b>OnAlignClicked<\/b> und <b>OnColonsClicked<\/b> auf. Sie rufen die Prozeduren <b>RunAlign<\/b> und <b>RunColons<\/b> auf, die auch die Kontextmen&uuml;befehle verwenden. <b>RunColons<\/b> ruft <b>AddColonsToLabels<\/b> auf. <b>RunAlign<\/b> &uuml;bergibt die Einstellungen an <b>AlignControls<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>RunAlign()\r\n    AlignControls objAccess, lngDistanceLabelControl, _\r\n        lngVerticalDistance, lngAlignment, bolColons\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Die Ausrichtung in einem Modul<\/h2>\n<p>Die Prozedur <b>AlignControls<\/b> im Modul <b>Alignment<\/b> &uuml;bernimmt die Logik aus dem VBA-Beitrag. Sie ist in VBA-Syntax geschrieben und l&auml;sst sich deshalb auch in ein twinBASIC-Modul &uuml;bernehmen. Gegen&uuml;ber der VBA-Fassung &auml;ndert sich Folgendes.<\/p>\n<ul>\n<li><b>Access-Anwendung:<\/b> Das Add-In geh&ouml;rt nicht zum VBA-Projekt einer Datenbank. Die Prozedur erh&auml;lt die Anwendung deshalb als Parameter <b>objAccess<\/b> und verwendet <b>objAccess.DoCmd<\/b> statt <b>DoCmd<\/b>. Die Funktion <b>GetDesignObject<\/b> verwendet <b>objAccess.Screen<\/b> statt <b>Screen<\/b>.<\/li>\n<li><b>Objekt:<\/b> Die Variable <b>frm<\/b> hat den Typ <b>Object<\/b> statt <b>Access.Form<\/b>, damit die Prozedur Formulare und Berichte bearbeiten kann.<\/li>\n<li><b>Einstellungen:<\/b> Die Abst&auml;nde, die Textausrichtung und die Doppelpunkte kommen als Parameter aus dem Ribbon.<\/li>\n<li><b>Meldungen:<\/b> Ist kein Bezeichnungsfeld markiert oder fehlt dem markierten Steuerelement das Bezeichnungsfeld, zeigt die Prozedur einen Hinweis an.<\/li>\n<li><b>Bildschirmaktualisierung:<\/b> Die Prozedur schaltet die Anzeige mit der Methode <b>DoCmd.Echo<\/b> auch nach einem Fehler wieder ein.<\/li>\n<\/ul>\n<p>Welches Objekt die Prozedur bearbeitet, ermittelt die Funktion <b>GetDesignObject<\/b>. Sie pr&uuml;ft zuerst, ob ein Bericht aktiv ist, und danach, ob ein Formular aktiv ist. Das Objekt muss sich in der Entwurfsansicht befinden. Das erkennt die Funktion an der Eigenschaft <b>CurrentView<\/b> mit dem Wert <b>0<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetDesignObject( _\r\n        ByVal objAccess<span style=\"color:blue;\"> As <\/span>Access.Application, _\r\n        ByRef frm<span style=\"color:blue;\"> As Object<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> frm = Nothing\r\n    <span style=\"color:blue;\">Set<\/span> frm = objAccess.Screen.ActiveReport\r\n    <span style=\"color:blue;\">If <\/span>frm Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">Set<\/span> frm = objAccess.Screen.ActiveForm\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> frm Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">If <\/span>frm.CurrentView = 0<span style=\"color:blue;\"> Then<\/span>\r\n            GetDesignObject = <span style=\"color:blue;\">True<\/span>\r\n        <span style=\"color:blue;\">End If<\/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;\">End Function<\/span><\/pre>\n<p><b>Screen.ActiveReport<\/b> und <b>Screen.ActiveForm<\/b> l&ouml;sen einen Fehler aus, wenn das jeweils andere Objekt aktiv ist. Deshalb steht <b>On Error Resume Next<\/b> vor den Zugriffen, wobei die Variable <b>frm<\/b> in diesem Fall den Wert <b>Nothing<\/b> beh&auml;lt. Findet die Funktion kein Objekt in der Entwurfsansicht, liefert sie den Wert <b>False<\/b>. Die Prozedur <b>AlignControls<\/b> zeigt dann die Meldung <b>Es ist weder ein Formular noch ein Bericht in der Entwurfsansicht ge&ouml;ffnet<\/b>.<\/p>\n<p>Die Prozedur <b>AddColonsToLabels<\/b> h&auml;ngt allen markierten Bezeichnungsfeldern einen Doppelpunkt an, sofern er noch fehlt (siehe Listing 5). Die Prozedur <b>AlignControls<\/b> ruft sie auf, wenn im Ribbon das Kontrollk&auml;stchen <b>Mit Doppelpunkten<\/b> aktiviert ist. Mit dem Befehl <b>Doppelpunkte anh&auml;ngen<\/b> starten wir sie auch einzeln.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddColonsToLabels(ByVal objAccess<span style=\"color:blue;\"> As <\/span>Access.Application)\r\n    <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As Object<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Access.Control\r\n    <span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Access.Label\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> GetDesignObject(objAccess, frm)<span style=\"color:blue;\"> Then<\/span>\r\n        <span style=\"color:blue;\">MsgBox<\/span> \"Es ist weder ein Formular noch ein Bericht in der Entwurfsansicht ge&ouml;ffnet.\", vbOKOnly + vbExclamation\r\n        <span style=\"color:blue;\">Exit Sub<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    For Each ctl In frm.Controls\r\n        <span style=\"color:blue;\">If <\/span>ctl.InSelection<span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">If <\/span>ctl.ControlType = acLabel<span style=\"color:blue;\"> Then<\/span>\r\n                <span style=\"color:blue;\">Set<\/span> lbl = ctl\r\n                <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Right<\/span>(lbl.Caption, 1) = \":\"<span style=\"color:blue;\"> Then<\/span>\r\n                    lbl.Caption = lbl.Caption & \":\"\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 If<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> ctl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Prozedur AddColonsToLabels h&auml;ngt Doppelpunkte an<\/span><\/b><\/p>\n<p>Die Hilfsprozeduren zum Anpassen der Gr&ouml;&szlig;e der Bezeichnungsfelder, zum Sortieren der Steuerelemente und zum Bestimmen des am weitesten links stehenden Bezeichnungsfeldes &uuml;bernehmen wir aus dem VBA-Beitrag. Der Parameter f&uuml;r das Formular oder den Bericht hat in diesen Prozeduren den Typ <b>Object<\/b> statt <b>Access.Form<\/b>.<\/p>\n<h2>Die Befehle im Kontextmen&uuml; der Steuerelemente<\/h2>\n<p>Neben dem Ribbon sollen die beiden Befehle im Kontextmen&uuml; der Steuerelemente erscheinen, damit wir markierte Steuerelemente per Rechtsklick ausrichten k&ouml;nnen. Das Kontextmen&uuml; eines Steuerelements im Formularentwurf hei&szlig;t <b>Form Design Control<\/b>, im Berichtsentwurf <b>Report Design Control<\/b>. Beide sind Elemente der Auflistung <b>CommandBars<\/b>. In beide f&uuml;gen wir zwei Schaltfl&auml;chen ein. Die Prozedur <b>SetCommandBars<\/b> legt die vier Schaltfl&auml;chen an und speichert sie in den Variablen, die wir mit <b>WithEvents<\/b> deklariert haben (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SetCommandBars()\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> ErrorHandler\r\n    <span style=\"color:blue;\">Set<\/span> cbbFormAlign = AddMenuButton(\"Form Design Control\", \"Steuerelemente ausrichten\", <span style=\"color:blue;\">True<\/span>)\r\n    <span style=\"color:blue;\">Set<\/span> cbbFormColons = AddMenuButton(\"Form Design Control\", \"Doppelpunkte anh&auml;ngen\", <span style=\"color:blue;\">False<\/span>)\r\n    <span style=\"color:blue;\">Set<\/span> cbbReportAlign = AddMenuButton(\"Report Design Control\", \"Steuerelemente ausrichten\", <span style=\"color:blue;\">True<\/span>)\r\n    <span style=\"color:blue;\">Set<\/span> cbbReportColons = AddMenuButton(\"Report Design Control\", \"Doppelpunkte anh&auml;ngen\", <span style=\"color:blue;\">False<\/span>)\r\n    <span style=\"color:blue;\">Exit Sub<\/span>\r\nErrorHandler:\r\n    <span style=\"color:blue;\">MsgBox<\/span> \"Die Kontextmen&uuml;befehle konnten nicht angelegt werden:\" _\r\n        & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description & \" (\" & Err.Number & \")\", _\r\n        vbOKOnly + vbExclamation\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Die Prozedur SetCommandBars legt die Schaltfl&auml;chen im Kontextmen&uuml; an<\/span><\/b><\/p>\n<p>Das Anlegen &uuml;bernimmt die Funktion <b>AddMenuButton<\/b> (siehe Listing 7). Sie f&uuml;gt am Ende des Kontextmen&uuml;s eine Schaltfl&auml;che hinzu und legt deren Beschriftung fest. Mit der Eigenschaft <b>BeginGroup<\/b> beginnt die jeweils erste Schaltfl&auml;che eines Men&uuml;s eine neue Gruppe.<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>AddMenuButton(ByVal strBarName<span style=\"color:blue;\"> As String<\/span>, _\r\n        ByVal strCaption<span style=\"color:blue;\"> As String<\/span>, _\r\n        ByVal bolBeginGroup<span style=\"color:blue;\"> As Boolean<\/span>)<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    <span style=\"color:blue;\">Dim <\/span>cbr<span style=\"color:blue;\"> As <\/span>CommandBar\r\n    <span style=\"color:blue;\">Dim <\/span>cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton\r\n    <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> cbr = objAccess.CommandBars(strBarName)\r\n    'Reste fr&uuml;herer Sitzungen entfernen, damit die Eintr&auml;ge nicht doppelt erscheinen\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    For i = cbr.Controls.Count To 1 Step -1\r\n        If cbr.Controls(i).Tag = MENU_TAG & strCaption Or _\r\n                cbr.Controls(i).Caption = strCaption Then\r\n            cbr.Controls(i).Delete <span style=\"color:blue;\">True<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Next<\/span> i\r\n    <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n    <span style=\"color:blue;\">Set<\/span> cbb = cbr.Controls.Add(Type:=msoControlButton, Temporary:=<span style=\"color:blue;\">True<\/span>)\r\n    cbb.Caption = strCaption\r\n    cbb.Tag = MENU_TAG & strCaption\r\n    cbb.BeginGroup = bolBeginGroup\r\n    <span style=\"color:blue;\">Set<\/span> AddMenuButton = cbb\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Funktion AddMenuButton legt eine Schaltfl&auml;che an<\/span><\/b><\/p>\n<p>Wir legen die Schaltfl&auml;chen mit <b>Temporary:=True<\/b> an. L&auml;uft <b>OnDisconnection<\/b> nicht vollst&auml;ndig durch, etwa weil wir die DLL in der laufenden Access-Sitzung neu bauen und laden, bleiben Eintr&auml;ge der fr&uuml;heren Verbindung im Men&uuml; stehen. Diese sind nicht mit den Variablen des neuen Add-Ins verbunden und reagieren nicht auf einen Klick. Im Men&uuml; erscheinen die Befehle dann doppelt, und nur die unteren Eintr&auml;ge funktionieren. Deshalb durchl&auml;uft <b>AddMenuButton<\/b> vor dem Anlegen alle Eintr&auml;ge des Men&uuml;s r&uuml;ckw&auml;rts und l&ouml;scht jeden Eintrag mit derselben Beschriftung oder derselben Kennung in der Eigenschaft <b>Tag<\/b>. Jede neue Schaltfl&auml;che erh&auml;lt diese Kennung. Klicken wir auf eine der Schaltfl&auml;chen, l&ouml;st die zugeh&ouml;rige Variable das Ereignis <b>Click<\/b> aus. F&uuml;r die Schaltfl&auml;che <b>Steuerelemente ausrichten<\/b> im Formularentwurf ist das die Ereignisprozedur <b>cbbFormAlign_Click<\/b>. Sie ruft <b>RunAlign<\/b> auf, wie es auch die Schaltfl&auml;che im Ribbon tut. F&uuml;r die &uuml;brigen drei Schaltfl&auml;chen gilt dasselbe, jeweils mit <b>RunAlign<\/b> oder <b>RunColons<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cbbFormAlign_Click(ByVal Ctrl<span style=\"color:blue;\"> As <\/span>_\r\n        Office.CommandBarButton, CancelDefault<span style=\"color:blue;\"> As Boolean<\/span>)\r\n    RunAlign\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Beim Entladen ruft <b>RemoveCommandBars<\/b> f&uuml;r jede der vier Variablen die Prozedur <b>RemoveMenuButton<\/b> auf. Sie l&ouml;scht die Schaltfl&auml;che und setzt die Variable auf <b>Nothing<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>RemoveMenuButton( _\r\n        ByRef cbb<span style=\"color:blue;\"> As <\/span>CommandBarButton)\r\n    On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> cbb Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n        cbb.Delete <span style=\"color:blue;\">True<\/span>\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> cbb = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Im Kontextmen&uuml; eines markierten Steuerelements erscheinen die beiden Befehle am Ende des Men&uuml;s.<\/p>\n<h2>Das Add-In anwenden<\/h2>\n<p>Die Beispieldatenbank <b>SteuerelementeAusrichtenPerCOMAddIn.accdb<\/b> enth&auml;lt die Tabellen <b>tblKunden<\/b> und <b>tblProdukte<\/b> sowie vier Formulare mit ungeordneten Steuerelementen. Das Formular <b>frmKontakt_Klein<\/b> zeigt f&uuml;nf Felder in beliebiger Anordnung. Wir &ouml;ffnen es in der Entwurfsansicht und markieren die Felder samt Bezeichnungsfeldern mit einem Auswahlrahmen (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1627_004.png\" alt=\"Das Formular frmKontakt_Klein vor dem Ausrichten\" width=\"599,559\" height=\"244,2647\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Das Formular frmKontakt_Klein vor dem Ausrichten<\/span><\/b><\/p>\n<p>Anschlie&szlig;end klicken wir im Register <b>Steuerelemente ausrichten<\/b> auf die Schaltfl&auml;che <b>Steuerelemente ausrichten<\/b>. Alternativ w&auml;hlen wir denselben Befehl im Kontextmen&uuml; der Markierung. Die Bezeichnungsfelder haben danach dieselbe Breite, die Felder stehen untereinander, und die Abst&auml;nde entsprechen den Einstellungen im Ribbon (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2026_06\/pic_1627_005.png\" alt=\"Das Formular frmKontakt_Klein nach dem Ausrichten\" width=\"599,559\" height=\"240,7459\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Formular frmKontakt_Klein nach dem Ausrichten<\/span><\/b><\/p>\n<p>Stellen wir die Dropdownliste <b>Beschriftung<\/b> auf <b>Rechts<\/b> und aktivieren das Kontrollk&auml;stchen <b>Mit Doppelpunkten<\/b>, h&auml;ngt das Add-In vor dem Ausrichten einen Doppelpunkt an jedes markierte Bezeichnungsfeld an. Im Berichtsentwurf funktioniert die Ausrichtung auf dieselbe Weise.<\/p>\n<p>Das Formular <b>frmKunden_Unsortiert<\/b> enth&auml;lt die Felder in zwei Spalten. Hier markieren wir jeweils eine Spalte und richten sie einzeln aus, denn die Prozedur ordnet alle markierten Steuerelemente untereinander an.<\/p>\n<p>Sind weniger als zwei Steuerelemente markiert, zeigt das Add-In die Meldung <b>Es m&uuml;ssen mindestens zwei Steuerelemente ausgew&auml;hlt sein<\/b>. Das Formular <b>frmSonderfaelle<\/b> enth&auml;lt ein Textfeld ohne Bezeichnungsfeld und eine Schaltfl&auml;che, an denen wir die weiteren Meldungen des Add-Ins nachvollziehen k&ouml;nnen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Das COM-Add-In <b>amvControlAligner<\/b> stellt die Ausrichtung aus dem VBA-Beitrag im Ribbon und im Kontextmen&uuml; bereit. Die Klasse <b>ControlAligner<\/b> bindet Access, das Ribbon und die Kontextmen&uuml;s an, das Modul <b>Alignment<\/b> enth&auml;lt die Logik. Das Register erscheint im Entwurf von Formularen und Berichten. Die Einstellungen bleiben zwischen zwei Sitzungen erhalten.<\/p>\n<p>Wir k&ouml;nnen das Muster aus einem kontextbezogenen Register, Eintr&auml;gen im Kontextmen&uuml; und einer Logik im Modul auf weitere Funktionen f&uuml;r die Entwurfsansicht &uuml;bertragen, etwa auf das Anpassen von Gr&ouml;&szlig;en oder das Ausrichten mehrerer Spalten in einem Schritt.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvControlAligner.twinproj<\/p>\n<p>SteuerelementeAusrichtenPerCOMAddIn.accdb<\/p>\n<p>amvControlAligner_win32.dll<\/p>\n<p>amvControlAligner_win64.dll<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/1509958F-E29D-4389-AB5F-BA19DB95F4C1\/aiu_1627.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Steuerelemente ausrichten per VBA&#8220; (www.access-im-unternehmen.de\/1429) haben wir eine Prozedur entwickelt, die markierte Steuerelemente samt Bezeichnungsfeldern in der Entwurfsansicht ausrichtet. Damit wir sie nutzen k&ouml;nnen, muss der Code in der jeweiligen Datenbank vorliegen. Bequemer ist es, wenn sie in jeder Datenbank &uuml;ber das Ribbon und das Kontextmen&uuml; der Steuerelemente bereitsteht. Wie wir dazu ein COM-Add-In mit twinBASIC bauen, zeigt der vorliegende Beitrag.<\/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,"footnotes":""},"categories":[662026,66062026,44000047],"tags":[],"class_list":["post-55001627","post","type-post","status-publish","format-standard","hentry","category-662026","category-66062026","category-Access_und_VBAEditor_erweitern"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Steuerelemente ausrichten per COM-Add-In - 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\/Steuerelemente_ausrichten_per_COMAddIn\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Steuerelemente ausrichten per COM-Add-In - Access im Unternehmen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Steuerelemente ausrichten per VBA&quot; (www.access-im-unternehmen.de\/1429) haben wir eine Prozedur entwickelt, die markierte Steuerelemente samt Bezeichnungsfeldern in der Entwurfsansicht ausrichtet. Damit wir sie nutzen k&ouml;nnen, muss der Code in der jeweiligen Datenbank vorliegen. Bequemer ist es, wenn sie in jeder Datenbank &uuml;ber das Ribbon und das Kontextmen&uuml; der Steuerelemente bereitsteht. Wie wir dazu ein COM-Add-In mit twinBASIC bauen, zeigt der vorliegende Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-09T18:56:25+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870\" \/>\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=\"18\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/5efd1af2265d5b82ecce8bdb2db6694d\"},\"headline\":\"Steuerelemente ausrichten per COM-Add-In\",\"datePublished\":\"2026-11-09T18:56:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/\"},\"wordCount\":2671,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/97559dcc891c49d89b8fcc5f6bcb7870\",\"articleSection\":[\"2026\",\"6\\\/2026\",\"Access und VBA-Editor erweitern\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/\",\"name\":\"Steuerelemente ausrichten per COM-Add-In - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/97559dcc891c49d89b8fcc5f6bcb7870\",\"datePublished\":\"2026-11-09T18:56:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/97559dcc891c49d89b8fcc5f6bcb7870\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/97559dcc891c49d89b8fcc5f6bcb7870\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_COMAddIn\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Steuerelemente ausrichten per COM-Add-In\"}]},{\"@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\\\/5efd1af2265d5b82ecce8bdb2db6694d\",\"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 plugin. -->","yoast_head_json":{"title":"Steuerelemente ausrichten per COM-Add-In - 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\/Steuerelemente_ausrichten_per_COMAddIn\/","og_locale":"de_DE","og_type":"article","og_title":"Steuerelemente ausrichten per COM-Add-In - Access im Unternehmen","og_description":"Im Beitrag \"Steuerelemente ausrichten per VBA\" (www.access-im-unternehmen.de\/1429) haben wir eine Prozedur entwickelt, die markierte Steuerelemente samt Bezeichnungsfeldern in der Entwurfsansicht ausrichtet. Damit wir sie nutzen k&ouml;nnen, muss der Code in der jeweiligen Datenbank vorliegen. Bequemer ist es, wenn sie in jeder Datenbank &uuml;ber das Ribbon und das Kontextmen&uuml; der Steuerelemente bereitsteht. Wie wir dazu ein COM-Add-In mit twinBASIC bauen, zeigt der vorliegende Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/","og_site_name":"Access im Unternehmen","article_published_time":"2026-11-09T18:56:25+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"18\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/5efd1af2265d5b82ecce8bdb2db6694d"},"headline":"Steuerelemente ausrichten per COM-Add-In","datePublished":"2026-11-09T18:56:25+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/"},"wordCount":2671,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870","articleSection":["2026","6\/2026","Access und VBA-Editor erweitern"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/","url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/","name":"Steuerelemente ausrichten per COM-Add-In - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870","datePublished":"2026-11-09T18:56:25+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/97559dcc891c49d89b8fcc5f6bcb7870"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_COMAddIn\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Steuerelemente ausrichten per COM-Add-In"}]},{"@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\/5efd1af2265d5b82ecce8bdb2db6694d","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\/55001627","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=55001627"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001627\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}