{"id":55001429,"date":"2023-04-01T00:00:00","date_gmt":"2023-06-17T09:31:34","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1429"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Steuerelemente_ausrichten_per_VBA","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/","title":{"rendered":"Steuerelemente ausrichten per VBA"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/a88cdbfb98f1406d88c8fec874de2b44\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Access bietet verschiedene M&ouml;glichkeiten, um Steuerelemente auszurichten. Diese stellen wir im Beitrag Steuerelemente ausrichten (www.access-im-unternehmen.de\/1431) vor. All diese Methoden haben jedoch Vor- und Nachteile. Der gr&ouml;&szlig;te Nachteil ist, dass sie Zeit kosten &#8211; Zeit, die man in viel sch&ouml;nere Arbeiten investieren k&ouml;nnte. Deshalb schauen wir uns in diesem Beitrag an, wie wir in der Entwurfsansicht selektierte Steuerelemente einfach per VBA ausrichten k&ouml;nnen. Dabei ist nicht die Technik die entscheidende Frage, sondern die Vorgabe, nach welchen Regeln die Ausrichtung genau erfolgen soll. In diesem Beitrag beschreiben wir, wie man per VBA solche Steuerelemente wie Textfeld, Kombinationsfeld, Listenfeld und Kontrollk&auml;stchen und ihre Bezeichnungsfelder, die untereinander angeordnet sind, ausrichten kann.<\/b><\/p>\n<h2>Ausgangssituation im Formular<\/h2>\n<p>Wir gehen davon aus, dass Sie als Entwickler auch mit dem Zusammenstellen von Formularen und dem Layout der enthaltenen Steuerelemente zu tun haben.<\/p>\n<p>In vielen F&auml;llen kann man sich die Aufgabe, Steuerelemente sauber ausgerichtet anzulegen, erleichtern &#8211; zum Beispiel durch das Ziehen der gebundenen Felder aus der Feldliste in das Formular.<\/p>\n<p>Aber sobald man der Datensatzquelle des Formulars ein weiteres Feld hinzugef&uuml;gt hat, das nun auch im Formularentwurf landen soll, muss man seine Position an die der anderen anpassen.<\/p>\n<p>Da ist man mit den im oben genannten Beitrag vorgestellten Methoden durchaus ein paar Sekunden besch&auml;ftigt &#8211; und dabei handelt es sich um eine T&auml;tigkeit, die man w&auml;hrend eines Access-Entwicklerlebens sehr oft wiederholt.<\/p>\n<p>Wir wollen die Ausgangssituation noch ein wenig chaotischer darstellen und gehen w&auml;hrend der Entwicklung von Steuerelementen aus, die wie in Bild 1 angeordnet sind.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1429_001.png\" alt=\"Ausgangssituation im Formular\" width=\"424,5589\" height=\"332,5217\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ausgangssituation im Formular<\/span><\/b><\/p>\n<h2>Vorgaben zur Anordnung von Steuerelementen<\/h2>\n<p>Wenn man diese nun manuell anordnen w&uuml;rde, w&auml;re das Markieren aller Beschriftungsfelder durch Ausziehen eines geeigneten Rahmens wohl der erste Schritt. Dann w&uuml;rde man aus dem Kontextmen&uuml; den Befehl <b>Ausrichten|Linksb&uuml;ndig <\/b>w&auml;hlen. Als N&auml;chstes w&auml;ren dann die Textfelder an der Reihe, die man auf die gleiche Weise linksb&uuml;ndig anordnet.<\/p>\n<p>Dann bringt man diese vielleicht noch auf eine Breite und verschiebt sie so nah an die Beschriftungsfelder heran, dass der Abstand zwischen dem breitesten Beschriftungsfeld und den Textfeldern etwa so gro&szlig; ausf&auml;llt wie der vertikale Abstand zwischen den Textfeldern. Das Ergebnis sieht dann beispielsweise wie in Bild 2 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_02\/pic_1429_002.png\" alt=\"Fertig ausgerichtete Steuerelemente\" width=\"424,5589\" height=\"332,5217\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Fertig ausgerichtete Steuerelemente<\/span><\/b><\/p>\n<h2>Vorgang per VBA abbilden<\/h2>\n<p>Nun wollen wir diese ganzen Schritte per VBA erledigen. Dazu k&ouml;nnen wir grunds&auml;tzlich &auml;hnlich vorgehen. Aber welche Rahmenbedingungen dazu wollen wir festhalten? Als Erstes ben&ouml;tigen wir die Position unseres Blocks vom linken und vom oberen Rand aus betrachtet. Deshalb ermitteln wir die Y-Position des obersten Steuerelements und die X-Position des am weitesten links befindlichen Steuerelements. <\/p>\n<p>Danach w&uuml;rden wir die Position aller Bezeichnungsfelder links an der soeben ermittelten Position ausrichten.<\/p>\n<p>Danach wird es schon spannend &#8211; n&auml;mlich bei der Positionierung der Steuerelemente von oben nach unten. Die erste Idee war, einfach alle markierten Steuerelemente von oben nach unten zu durchlaufen und dabei dem obersten Steuerelement den soeben ermittelten Abstand vom oberen Rand zu vergeben. Die nachfolgenden Steuerelemente w&uuml;rden wir dann jeweils unter dem zuvor ausgerichteten Steuerelement positionieren &#8211; mit einem kleinen zus&auml;tzlichen Abstand.<\/p>\n<p>Allerdings durchl&auml;uft Access die Steuerelemente &uuml;ber die <b>Controls<\/b>-Auflistung in der Reihenfolge, die durch die Aktivierreihenfolge vorgegeben wurde. Hier stellt sich die Frage, ob wir die Steuerelemente nach der Aktivierreihenfolge ausrichten wollen oder nach der aktuellen vertikalen Anordnung. Intuitiver scheint es, die Steuerelemente nach der aktuellen Anordnung auszurichten.<\/p>\n<p>Diese m&uuml;ssten wir dann erst einmal ermitteln &#8211; und das ist nicht gerade trivial. Unsere L&ouml;sung f&uuml;r diese Frage ist, den Steuerelementnamen und die Y-Position in einem zweidimensionalen Array zu speichern und die Daten in diesem Array nach der Y-Position zu sortieren, bevor wir sie in der so festgelegten Reihenfolge ausrichten.<\/p>\n<p>Des Weiteren stellt sich die Frage, ob wir uns bei der H&ouml;he f&uuml;r ein Bezeichnungsfeld-Steuerelement-Paar nach der H&ouml;he des Bezeichnungsfeldes oder des Steuerelements richten. Es kann sowohl vorkommen, dass das Bezeichnungsfeld h&ouml;her ist als das Steuerelement (bei einer l&auml;ngeren Bezeichnung), aber auch Textfelder kommen gelegentlich mit einer gr&ouml;&szlig;eren H&ouml;he, beispielsweise um mehrere Zeilen anzuzeigen.<\/p>\n<p>Sp&auml;testens wenn Listenfelder ins Spiel kommen, sind diese meist h&ouml;her als das jeweilige Bezeichnungsfeld.<\/p>\n<p>Die einfachste L&ouml;sung f&uuml;r diesen Fall scheint zu sein, das jeweils h&ouml;here Element zu ber&uuml;cksichtigen.<\/p>\n<p>Bei den Bezeichnungsfeldern stellt sich die Frage, ob diese bereits die richtige Breite aufweisen. Sicherheitshalber wollen wir die Breite auf den tats&auml;chlich enthaltenen Bezeichnungstext anpassen. Damit ermitteln wir nun die maximale Breite der Bezeichnungsfelder und stellen alle Bezeichnungsfelder auf diese Breite ein. Dies ist eine Vorbereitung auf den Fall, dass der Benutzer seine Bezeichnungsfelder rechtsb&uuml;ndig ausrichten m&ouml;chte.<\/p>\n<p>Danach richten wir die eigentlichen Steuerelemente, in unserem Beispiel also die Textfelder, entsprechend aus. Dabei nutzen wir die X-Position der Bezeichnungsfelder plus ihre Breite plus wiederum einem kleinen Abstand, wie wir ihn auch bereits f&uuml;r die vertikale Anordnung genutzt haben.<\/p>\n<h2>Sonderfall Kontrollk&auml;stchen<\/h2>\n<p>W&auml;hrend die H&ouml;he von Textfeldern in der Regel an die jeweiligen Bezeichnungsfelder angepasst ist, sind Kontrollk&auml;stchen etwas weniger hoch und ihr Abstand vom oberen Rand des Formulars stimmt nicht mit dem des dazugeh&ouml;rigen Bezeichnungsfelds &uuml;berein. Hier m&uuml;ssen wir eine Spezialbehandlung vornehmen. Wir k&ouml;nnen das Kontrollk&auml;stchen nicht auf der gleichen Y-Position wie das Bezeichnungsfeld platzieren, da es sonst optisch etwas zu weit oben angezeigt wird.<\/p>\n<p>Also bauen wir beim Ausrichten des Kontrollk&auml;stchens einen zus&auml;tzlichen Abstand von oben ein. Da es normalerweise auch noch weniger hoch als ein Textfeld oder Bezeichnungsfeld ist, m&uuml;ssen wir in diesem Fall die H&ouml;he des Bezeichnungsfeldes als Ma&szlig;stab f&uuml;r die Ausrichtung des darunter liegenden Steuerelements nutzen.<\/p>\n<h2>Zus&auml;tzliche Einstellungen<\/h2>\n<p>Neben den bereits erw&auml;hnten Vorgaben wollen wir dem Benutzer noch die M&ouml;glichkeit geben, weitere Einstellungen vorzunehmen. Dazu stellen wir der Hauptprozedur einige Parameter bereit. Damit wollen wir die folgenden Einstellungen vornehmen:<\/p>\n<ul>\n<li>Abstand zwischen Bezeichnungsfeld und Steuerelement in Pixeln<\/li>\n<li>Vertikaler Abstand zwischen zwei Steuerelementen<\/li>\n<li>Ausrichtung der Bezeichnungsfelder &#8211; wahlweise Standard, links, mittig oder rechts zentriert oder verteilt<\/li>\n<li>Optionales Hinzuf&uuml;gen von Doppelpunkten rechts von den Beschriftungen, sofern noch nicht vorhanden<\/li>\n<\/ul>\n<h2>Doppelpunkte hinter Beschriftungen setzen<\/h2>\n<p>Zum Aufw&auml;rmen wollen wir die Prozedur schreiben, mit der wir den aktuell markierten Bezeichnungsfeldern einen Doppelpunkt hinzuf&uuml;gen, sofern dieser noch nicht vorhanden ist. Diese Prozedur hei&szlig;t <b>AddColonToLabels <\/b>und ist in Listing 1 abgebildet.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AddColonToLabels()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Set<\/span> frm = Screen.ActiveForm\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             Select Case ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acLabel\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Right<\/span>(ctl.Caption, 1) = \":\"<span style=\"color:blue;\"> Then<\/span>\r\n                         ctl.Caption = ctl.Caption & \":\"\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End Select<\/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 1: Hinzuf&uuml;gen von Doppelpunkten zu den Bezeichnungsfeldern<\/span><\/b><\/p>\n<p>Die Prozedur k&ouml;nnen wir auch allein aufrufen. Sie deklariert eine <b>Form<\/b>&#8211; und eine <b>Control<\/b>-Variable. Mit der <b>Form<\/b>-Variable <b>frm <\/b>referenziert sie &uuml;ber die Eigenschaft <b>Screen.ActiveForm <\/b>das aktuell markierte Formular. Die Variable <b>ctl <\/b>kann alle Steuerelemente referenzieren. Damit durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Steuerelemente des referenzierten Formulars.<\/p>\n<p>In der folgenden <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen wir mit der Eigenschaft <b>InSelection<\/b>, ob das aktuelle mit <b>ctl <\/b>&uuml;ber die Schleife referenzierte Steuerelement derzeit markiert ist. Ist das der Fall, untersuchen wir in einer <b>Select Case<\/b>-Bedingung durch einen Vergleich der Eigenschaft <b>ControlType <\/b>mit der Konstanten <b>acLabel<\/b>, ob es sich um ein Bezeichnungsfeld handelt. Falls ja, pr&uuml;fen wir schlie&szlig;lich noch, ob das letzte Zeichen ein Doppelpunkt ist. Ist das nicht der Fall, f&uuml;gen wir der Eigenschaft Caption am Ende einen Doppelpunkt hinzu.<\/p>\n<p>Diese Prozedur k&ouml;nnen Sie nun bereits ausprobieren. Dazu f&uuml;gen Sie einem Formular in der Entwurfsansicht ein beliebiges Steuerelement mit einem Bezeichnungsfeld hinzu oder ein einzelnes Bezeichnungsfeld. Dieses markieren Sie nun. Anschlie&szlig;end rufen Sie die Prozedur <b>AddColonToLabels <\/b>auf. Sollte das Bezeichnungsfeld zu diesem Zeitpunkt noch keinen abschlie&szlig;enden Doppelpunkt haben, wird dieser nun hinzugef&uuml;gt.<\/p>\n<h2>Prozedur zum Ausrichten der Steuerelemente<\/h2>\n<p>Nach dem Aufw&auml;rmen schauen wir uns gleich die Hauptprozedur der L&ouml;sung aus diesem Beitrag an. Diese hei&szlig;t <b>AlignControls <\/b>und erwartet vier Parameter:<\/p>\n<ul>\n<li><b>lngDistanceLabelControl<\/b>: Abstand zwischen Beschriftungsfeld und Steuerelement in Punkten<\/li>\n<li><b>lngVerticalDistance<\/b>: Vertikaler Abstand zwischen Steuerelementen<\/li>\n<li><b>varAlignment<\/b>: Ausrichtung des Textes in den Bezeichnungsfeldern (<b>0<\/b>: <b>Standard<\/b>, <b>1<\/b>: <b>Links<\/b>, <b>2<\/b>: <b>Zentriert<\/b>, <b>3<\/b>: <b>Rechts<\/b>, <b>4<\/b>: <b>Verteilen<\/b>)<\/li>\n<li><b>bolColons<\/b>: Gibt an, ob Doppelpunkte hinzugef&uuml;gt werden sollen.<\/li>\n<\/ul>\n<p>Die Prozedur finden Sie in Listing 2. Die von dieser Prozedur aufgerufenen weiteren Funktionen und Prozeduren bilden wir im Verlauf ab. Die Prozedur deklariert zun&auml;chst einige Variablen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AlignControls(<span style=\"color:blue;\">Optional<\/span> lngDistanceLabelControl<span style=\"color:blue;\"> As Long<\/span> = 100, <span style=\"color:blue;\">Optional<\/span> lngVerticalDistance<span style=\"color:blue;\"> As Long<\/span> = 100, _\r\n         <span style=\"color:blue;\">Optional<\/span> varAlignment<span style=\"color:blue;\"> As Variant<\/span> = 0, <span style=\"color:blue;\">Optional<\/span> bolColons<span style=\"color:blue;\"> As Boolean<\/span> = <span style=\"color:blue;\">False<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form, ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>lngLabelLeft<span style=\"color:blue;\"> As Long<\/span>, lngLabelWidth<span style=\"color:blue;\"> As Long<\/span>, lngControlLeft<span style=\"color:blue;\"> As Long<\/span>, lngTop<span style=\"color:blue;\"> As Long<\/span>, lngMaxHeight<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lblControl<span style=\"color:blue;\"> As <\/span>Label, varControls()<span style=\"color:blue;\"> As Variant<\/span>, i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> GetFormInDesignView(frm)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es ist kein Formular 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     <span style=\"color:blue;\">If <\/span>GetSelectedControlCount(frm) &lt; 2<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es m&uuml;ssen mindestens zwei Steuerelemente ausgew&auml;hlt sein.\", vbOKOnly + vbExclamation\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     DoCmd.Echo <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">If <\/span>bolColons<span style=\"color:blue;\"> Then<\/span>\r\n         AddColonToLabels\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     OptimizeLabelSizes frm\r\n     lngLabel<span style=\"color:blue;\">Left<\/span> = GetMostLeftLabel(frm)\r\n     lngLabelWidth = GetMaxLabelWidth(frm)\r\n     lngControl<span style=\"color:blue;\">Left<\/span> = lngLabelWidth + lngDistanceLabelControl + lngLabelLeft\r\n     varControls = GetControlArray(frm)\r\n     SortArray varControls\r\n     lngTop = varControls(0, 0)\r\n     For i = 0 To <span style=\"color:blue;\">UBound<\/span>(varControls, 2)\r\n         <span style=\"color:blue;\">Set<\/span> ctl = frm.Controls(varControls(1, i))\r\n         ctl.<span style=\"color:blue;\">Left<\/span> = lngControlLeft\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngTop = 0<span style=\"color:blue;\"> Then<\/span>\r\n             ctl.Top = lngTop\r\n             <span style=\"color:blue;\">If <\/span>ctl.ControlType = acCheckBox<span style=\"color:blue;\"> Then<\/span> ''Korrektur f&uuml;r Kontrollk&auml;stchen\r\n                 ctl.Top = ctl.Top + 30\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> lblControl = ctl.Controls(0)\r\n             lngMaxHeight = ctl.Height\r\n             <span style=\"color:blue;\">If <\/span>lblControl.Height &gt; lngMaxHeight<span style=\"color:blue;\"> Then<\/span>\r\n                 lngMaxHeight = lblControl.Height\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             lblControl.Top = lngTop\r\n             lblControl.<span style=\"color:blue;\">Left<\/span> = lngLabelLeft\r\n             lblControl.Width = lngLabelWidth\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsMissing(varAlignment)<span style=\"color:blue;\"> Then<\/span>\r\n                 lblControl.TextAlign = varAlignment\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         lngTop = lngTop + lngMaxHeight + lngVerticalDistance\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     DoCmd.Echo <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Hauptprozedur zum Ausrichten von Steuerelementen<\/span><\/b><\/p>\n<h2>Aktuelles Formular in der Entwurfsansicht holen<\/h2>\n<p>Direkt die erste Anweisung ruft eine Hilfsfunktion namens <b>GetFormInDesignView <\/b>auf, welche eine leere R&uuml;ckgabevariable namens <b>frm <\/b>als Parameter erh&auml;lt. Die Funktion, die wir in Listing 3 abgebildet haben, hat die Aufgabe, das aktuelle Formular zu ermitteln und gleich noch zu pr&uuml;fen, ob dieses in der Entwurfsansicht ge&ouml;ffnet ist. Anderenfalls k&ouml;nnen wir n&auml;mlich nicht auf die aktuell markierten Steuerelemente zugreifen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetFormInDesignView(frm<span style=\"color:blue;\"> As <\/span>Form)<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 = Screen.ActiveForm\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             GetFormInDesignView = <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><span style=\"color:darkgrey;\">Listing 3: Funktion zum Holen des aktuellen Formulars in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Funktion holt mit <b>Screen.ActiveForm <\/b>das Formular, welches aktuell den Fokus hat. Das kann bereits schiefgehen, wenn gerade kein Formular den Fokus hat &#8211; in diesem Fall ist <b>frm <\/b>danach leer und die Funktion wird mit dem Wert <b>False <\/b>verlassen.<\/p>\n<p>Enth&auml;lt <b>frm <\/b>danach jedoch ein Formular, pr&uuml;fen wir seine Ansicht mit der <b>CurrentView<\/b>-Eigenschaft. Hat diese den Wert <b>0<\/b>, ist das aktuelle Objekt ein Formular in der Entwurfsansicht und wir k&ouml;nnen den Wert <b>True <\/b>als Funktionswert zur&uuml;ckliefern &#8211; die R&uuml;ckgabevariable <b>frm <\/b>ist ja ohnehin bereits mit einem Verweis auf das betroffene Formular gef&uuml;llt.<\/p>\n<p>Liefert <b>GetFormInDesignView <\/b>den Wert <b>False <\/b>zur&uuml;ck, erscheint eine entsprechende Meldung und die Prozedur <b>AlignControls <\/b>wird beendet.<\/p>\n<h2>Markierte Steuerelemente z&auml;hlen<\/h2>\n<p>Die Prozedur macht nur Sinn, wenn zumindest zwei Steuerelemente markiert sind &#8211; genau genommen ein Steuerelement plus seinem Bezeichnungsfeld.<\/p>\n<p>Diese Information holen wir mit der Funktion <b>GetSelectedControlCount<\/b>, der wir einen Verweis auf das zu untersuchende Formular &uuml;bergeben und welche die Anzahl der markierten Steuerelemente zur&uuml;ckliefern soll.<\/p>\n<p>Die Funktion finden wir in Listing 4. In dieser Funktion durchlaufen wir alle Steuerelemente des Formulars und untersuchen eine Eigenschaft, die wohl eher selten eingesetzt wird: Sie hei&szlig;t <b>InSelection <\/b>und gibt an, ob das Steuerelement, f&uuml;r das sie abgefragt wird, markiert ist.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetSelectedControlCount(frm<span style=\"color:blue;\"> As <\/span>Form)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>lngCount<span style=\"color:blue;\"> As Long<\/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             lngCount = lngCount + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     GetSelectedControlCount = lngCount\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Z&auml;hlen der markierten Steuerelemente<\/span><\/b><\/p>\n<p>F&uuml;r jedes markierte Element addieren wir den Wert <b>1 <\/b>zur Variablen <b>lngCount <\/b>hinzu. Den Wert dieser Variablen geben wir nach dem Durchlaufen aller Steuerelemente als Funktionsergebnis zur&uuml;ck.<\/p>\n<p>Sind weniger als zwei Steuerelemente ausgew&auml;hlt, wird die aufrufende Prozedur nach einer entsprechenden Meldung beendet.<\/p>\n<h2>Flackern und Effekte ausschalten<\/h2>\n<p>Mit den n&auml;chsten Anweisungen werden wir schnell viele Steuerelemente manipulieren.<\/p>\n<p>Dies f&uuml;hrt gelegentlich zu Flackern und Artefakten von verschobenen Steuerelementen. Um dies zu verhindern, deaktivieren wir f&uuml;r diesen Zeitraum die Aktualisierung der Anzeige und aktivieren sie am Ende der Prozedur wieder:<\/p>\n<pre>DoCmd.Echo <span style=\"color:blue;\">False<\/span>\r\n...\r\nDoCmd.Echo <span style=\"color:blue;\">True<\/span><\/pre>\n<h2>Bezeichnungsfelder mit Doppelpunkten versehen<\/h2>\n<p>Wenn der Benutzer mit dem Parameter <b>bolColons <\/b>den Wert <b>True <\/b>&uuml;bergeben hat, ruft die Prozedur die Routine <b>AddColonToLabels <\/b>auf, um den Bezeichnungsfeldern Doppelpunkte hinzuzuf&uuml;gen, wo noch keine vorhanden sind.<\/p>\n<h2>Gr&ouml;&szlig;e der Bezeichnungsfelder optimieren<\/h2>\n<p>Die n&auml;chste Anweisung ruft die Prozedur <b>OptimizeLabelSizes <\/b>auf und &uuml;bergibt einen Verweis auf das zu bearbeitende Formular. Die Prozedur durchl&auml;uft wiederum alle Steuerelemente in einer Schleife, um die Bezeichnungsfelder der markierten Steuerelemente anzupassen (siehe Listing 5). In der Schleife pr&uuml;ft die Prozedur, ob es sich um ein markiertes Steuerelement handelt. Ist dieses kein Bezeichnungsfeld, holt es sich &uuml;ber <b>Controls(0) <\/b>das zum Steuerelement geh&ouml;rende Bezeichnungsfeld und stellt seine Gr&ouml;&szlig;e mit der Methode <b>SizeToFit <\/b>auf die Gr&ouml;&szlig;e des enthaltenen Texts ein.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OptimizeLabelSizes(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\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             Select Case ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acLabel\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     <span style=\"color:blue;\">Set<\/span> lbl = ctl.Controls(0)\r\n                     lbl.SizeToFit\r\n             <span style=\"color:blue;\">End Select<\/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: Prozedur zum Optimieren der Gr&ouml;&szlig;e der Bezeichnungsfelder<\/span><\/b><\/p>\n<h2>Bezeichnungsfeld ermitteln, das am weitesten links liegt<\/h2>\n<p>Die nun aufgerufene Funktion <b>GetMostLeftLabel <\/b>soll den Abstand des am meisten links liegenden Bezeichnungsfeldes vom linken Rand des Formulars ermitteln (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetMostLeftLabel(frm<span style=\"color:blue;\"> As <\/span>Form)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>lngLeft<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\r\n     lng<span style=\"color:blue;\">Left<\/span> = 999999\r\n     For Each ctl In frm.Controls\r\n         Select Case ctl.ControlType\r\n             <span style=\"color:blue;\">Case <\/span>acLabel\r\n                 <span style=\"color:blue;\">Set<\/span> lbl = ctl\r\n                 <span style=\"color:blue;\">If <\/span>lbl.<span style=\"color:blue;\">Left<\/span> &lt; lngLeft<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>ctl.InSelection = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                         lng<span style=\"color:blue;\">Left<\/span> = lbl.Left\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 Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     GetMostLeftLabel = lngLeft\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Funktion zum Ermitteln des am weitesten links liegenden Bezeichnungsfeldes<\/span><\/b><\/p>\n<p>Die Funktion durchl&auml;uft alle Steuerelemente und pr&uuml;ft, ob das aktuelle Element markiert ist. In einer <b>Select Case<\/b>-Bedingung untersucht sie nur die Bezeichnungsfelder. Der Abstand des am weitesten links befindlichen Steuerelements vom linken Rand soll in der Variablen <b>lngLeft <\/b>gespeichert werden. Der Wert ist zu Beginn auf <b>999.999 <\/b>eingestellt. Ist der Wert der Eigenschaft <b>Left <\/b>des aktuell durchlaufenen Bezeichnungsfeldes kleiner als dieser Wert, wird dieser in <b>lngLeft <\/b>gespeichert. Nach dem Untersuchen aller Bezeichnungsfelder landet so der entsprechende Wert in der Variablen <b>lngLeft<\/b> und wird an die aufrufende Prozedur zur&uuml;ckgegeben.<\/p>\n<p>Der folgende Funktionsaufruf ermittelt die Breite des breitesten Bezeichnungsfeldes unter den markierten Steuerelementen. Die Funktion hei&szlig;t <b>GetMaxLabelWidth <\/b>und erwartet das zu untersuchende Formular als Parameter (siehe Listing 7).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetMaxLabelWidth(frm<span style=\"color:blue;\"> As <\/span>Form)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>lngMaxLabelWidth<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lbl<span style=\"color:blue;\"> As <\/span>Label\r\n     For Each ctl In frm.Controls\r\n         Select Case ctl.ControlType\r\n             <span style=\"color:blue;\">Case <\/span>acLabel\r\n                 <span style=\"color:blue;\">Set<\/span> lbl = ctl\r\n                 <span style=\"color:blue;\">If <\/span>ctl.InSelection = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>lbl.Width &gt; lngMaxLabelWidth<span style=\"color:blue;\"> Then<\/span>\r\n                         lngMaxLabelWidth = lbl.Width\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 Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     GetMaxLabelWidth = lngMaxLabelWidth\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Funktion zum Ermitteln der gr&ouml;&szlig;ten Breite eines Bezeichnungsfeldes<\/span><\/b><\/p>\n<p>Sie funktioniert so &auml;hnlich wie die zuvor beschriebene Funktion, nur dass sie die Breite der markierten Bezeichnungsfelder untersucht und jeweils die Breite des aktuellen Bezeichnungsfeldes in der Variablen <b>lngWidth <\/b>speichert, wenn diese gr&ouml;&szlig;er als der bisher darin enthaltene Wert ist. Der zur&uuml;ckgegebene Wert landet in der Variablen <b>lngLabelWidth<\/b>.<\/p>\n<p>Damit k&ouml;nnen wir nun den gew&uuml;nschten Abstand der Steuerelemente (nicht der Bezeichnungsfelder) vom linken Rand des Formulars ermitteln. Er entspricht der Breite der Bezeichnungsfelder plus dem Abstand zwischen Bezeichnungsfeld und Steuerelement plus dem Abstand der Bezeichnungsfelder vom linken Formularrand und wird in der Variablen <b>lngControlLeft <\/b>gespeichert.<\/p>\n<h2>Steuerelemente von oben nach unten sortieren<\/h2>\n<p>Hier ein wichtiger Hinweis: Die Prozedur soll die Steuerelemente in der Reihenfolge von oben nach unten anordnen, in der sich diese auch vor dem Aufruf der Prozedur befinden. Dazu sind ein paar zus&auml;tzliche Schritte erforderlich, denn wenn wir einfach alle Steuerelemente durchlaufen und diese von oben nach unten anordnen w&uuml;rden, w&uuml;rden wir diese in der Reihenfolge der Aktivierung durchlaufen.<\/p>\n<p>Um diese nach der Position von oben aus gesehen zu durchlaufen (was die gleiche Reihenfolge sein kann), f&uuml;gen wir die Steuerelemente samt der H&ouml;he in ein Array ein und sortieren dessen Eintr&auml;ge anschlie&szlig;end nach der jeweiligen H&ouml;he. Die erste Funktion, die wir ben&ouml;tigen, hei&szlig;t <b>GetControlArray <\/b>und f&uuml;gt die markierten Steuerelemente (au&szlig;er die Bezeichnungsfelder) in ein zweidimensionales Array ein (siehe Listing 8).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetControlArray(frm<span style=\"color:blue;\"> As <\/span>Form)<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varControls()<span style=\"color:blue;\"> As Variant<\/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             Select Case ctl.ControlType\r\n                 <span style=\"color:blue;\">Case <\/span>acLabel\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     ReDim Preserve varControls(1, i)\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ctl.ControlType = acCheckBox<span style=\"color:blue;\"> Then<\/span>\r\n                         varControls(0, i) = ctl.Top\r\n                     <span style=\"color:blue;\">Else<\/span>\r\n                         varControls(0, i) = ctl.Controls(0).Top\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     varControls(1, i) = ctl.Name\r\n                     i = i + 1\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     GetControlArray = varControls\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Funktion zum Einlesen der Steuerelemente in ein Array<\/span><\/b><\/p>\n<p>Beim Durchlaufen der Steuerelemente in einer <b>For Each<\/b>-Schleife pr&uuml;ft auch diese Funktion, ob es sich beim aktuellen Steuerelement erstens um ein markiertes Steuerelement handelt und zweitens um eines, das kein Bezeichnungsfeld ist. In diesem Fall vergr&ouml;&szlig;ert es das Array <b>varControls <\/b>um ein Element. Eigentlich w&uuml;rden wir immer den Abstand vom oberen Rand des Formulars speichern, aber bei Kontrollk&auml;stchen, die etwas weniger hoch als beispielsweise Textfelder sind, verwenden wir den Abstand des damit verkn&uuml;pften Bezeichnungsfeldes vom oberen Formularrand. Wir speichern jeweils den Abstand vom oberen Rand als ersten Wert und den Namen des Steuerelements als zweiten Wert eines Eintrags des Arrays.<\/p>\n<p>Das Array sortieren wir gleich im Anschluss mithilfe der Funktion <b>SortArray <\/b>nach dem Wert im ersten Feld (siehe Listing 9).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SortArray(var()<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>j<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intTemp<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     For j = 0 To <span style=\"color:blue;\">UBound<\/span>(var, 2) - 1\r\n         For i = 0 To <span style=\"color:blue;\">UBound<\/span>(var, 2) - 1 - j\r\n             <span style=\"color:blue;\">If <\/span>var(0, i) &gt; var(0, i + 1)<span style=\"color:blue;\"> Then<\/span>\r\n                 intTemp = var(0, i)\r\n                 strTemp = var(1, i)\r\n                 var(0, i) = var(0, i + 1)\r\n                 var(1, i) = var(1, i + 1)\r\n                 var(0, i + 1) = intTemp\r\n                 var(1, i + 1) = strTemp\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">Next<\/span> j\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Funktion zum Sortieren der Elemente eines Array nach der ersten Spalte<\/span><\/b><\/p>\n<p>Die Funktion nimmt das Array als Parameter entgegen. Da die Anzahl der Steuerelemente meist &uuml;berschaubar ist, ben&ouml;tigen wir keinen auf Performance optimierten Algorithmus, sondern haben einfach eine Routine programmiert, welche die Elemente Schritt f&uuml;r Schritt vergleicht und umsortiert. Die &auml;u&szlig;ere Schleife gibt an, wie oft die innere Schleife durchlaufen wird &#8211; und zwar entsprechend der Anzahl der Elemente des Arrays minus eins. Die innere Schleife vergleicht jeweils das aktuelle mit dem n&auml;chsten Element und vertauscht beide, wenn der Abstand des ersten Elements vom oberen Rand gr&ouml;&szlig;er ist als der des zweiten Elements. Auf diese Weise landet nach dem ersten Durchlauf der &auml;u&szlig;eren Schleife das Element mit dem gr&ouml;&szlig;ten Abstand von oben auf der letzten Position. Nach dem zweiten Durchlauf landet das mit dem zweitgr&ouml;&szlig;ten Abstand von oben auf der vorletzten Position und so weiter &#8211; bis das Element mit dem geringsten Abstand vom oberen Rand auf der ersten Position landet. Mit dem Ergebnis arbeitet die aufrufende Prozedur anschlie&szlig;end gleich weiter.<\/p>\n<h2>Anordnen der Steuerelemente<\/h2>\n<p>Der Abstand des ersten Elements des Arrays vom oberen Rand landet nun in der Variablen <b>lngTop<\/b>. Damit steigen wir in eine <b>For&#8230;Next<\/b>-Schleife &uuml;ber alle Elemente des Arrays <b>varControls <\/b>ein. Darin referenzieren wir als Erstes das erste Steuerelement dieses Arrays, also das, welches ganz oben landen soll.<\/p>\n<p>Die Prozedur stellt f&uuml;r das Steuerelement (also nicht das dazugeh&ouml;rige Bezeichnungsfeld) den Abstand vom linken Rand ein. Dann legt es den Abstand vom oberen Rand fest. Falls wir gerade ein Kontrollk&auml;stchen anpassen, wird noch ein Korrekturfaktor eingebaut, da Kontrollk&auml;stchen in der Regel weniger hoch als die &uuml;brigen Steuerelemente sind und gegen&uuml;ber dem oberen Rand des Bezeichnungsfeldes etwas nach unten verschoben werden sollen.<\/p>\n<p>Danach referenziert die Prozedur das zu dem aktuellen Steuerelement geh&ouml;rende Bezeichnungsfeld mit <b>lblControl<\/b>. In der Variablen <b>lngMaxHeight <\/b>speichern wir die H&ouml;he des aktuellen Steuerelements oder seines Bezeichnungsfeldes &#8211; je nachdem, welche H&ouml;he gr&ouml;&szlig;er ist.<\/p>\n<p>Dann stellen wir f&uuml;r das Bezeichnungsfeld die Position vom oberen und vom rechten Formularrand ein sowie die Breite auf die des breitesten Bezeichnungsfeldes. Wurde beim Aufruf eine Ausrichtung f&uuml;r die Texte der Bezeichnungsfelder angegeben, wird diese nun der Eigenschaft <b>TextAlign <\/b>zugewiesen.<\/p>\n<p>Schlie&szlig;lich wird der Wert der Variablen <b>lngTop <\/b>um die H&ouml;he des aktuellen Steuerelements plus den bisherigen Wert von <b>lngTop <\/b>und dem vertikalen Abstand aus <b>lngVerticalDistance <\/b>eingestellt, damit das n&auml;chste Steuerelement entsprechend unterhalb des aktuellen Steuerelements platziert wird.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Das war es schon &#8211; mit dieser Prozedur k&ouml;nnen Sie die aktuell markierten Steuerelemente &uuml;bereinander anordnen. Die Einschr&auml;nkung ist, dass dieser Code nur f&uuml;r Textfelder, Kontrollk&auml;stchen, Kombinationsfelder und Listenfelder funktioniert, denen ein Bezeichnungsfeld zugeordnet ist &#8211; und wenn diese auch paarweise markiert sind.<\/p>\n<p>Im Beitrag <b>Steuerelemente ausrichten per COM-Add-In <\/b>(www.access-im-unternehmen.de\/1430) zeigen wir noch, wie Sie die Funktion in einem COM-Add-In unterbringen k&ouml;nnen, damit Sie die Funktion bequem &uuml;ber einen Ribbon-Eintrag aufrufen k&ouml;nnen statt &uuml;ber den VBA-Editor.<\/p>\n<p>Au&szlig;erdem steht die Prozedur dann automatisch zur Verf&uuml;gung und muss nicht in die jeweilige Access-Datenbank importiert werden.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SteuerelementeAusrichtenPerVBA.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/B7EEE5F8-FC09-4A1F-8719-781863F5FB3A\/aiu_1429.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Access bietet verschiedene M&ouml;glichkeiten, um Steuerelemente auszurichten. Diese stellen wir im Beitrag Steuerelemente ausrichten (www.access-im-unternehmen.de\/1431) vor. All diese Methoden haben jedoch Vor- und Nachteile. Der gr&ouml;&szlig;te Nachteil ist, dass sie Zeit kosten &#8211; Zeit, die man in viel sch&ouml;nere Arbeiten investieren k&ouml;nnte. Deshalb schauen wir uns in diesem Beitrag an, wie wir in der Entwurfsansicht selektierte Steuerelemente einfach per VBA ausrichten k&ouml;nnen. Dabei ist nicht die Technik die entscheidende Frage, sondern die Vorgabe, nach welchen Regeln die Ausrichtung genau erfolgen soll. In diesem Beitrag beschreiben wir, wie man per VBA solche Steuerelemente wie Textfeld, Kombinationsfeld, Listenfeld und Kontrollk&auml;stchen und ihre Bezeichnungsfelder, die untereinander angeordnet sind, ausrichten 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,44000025],"tags":[],"class_list":["post-55001429","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023","category-VBA_und_Programmiertechniken"],"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>Steuerelemente ausrichten per VBA - 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_VBA\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Steuerelemente ausrichten per VBA\" \/>\n<meta property=\"og:description\" content=\"Access bietet verschiedene M&ouml;glichkeiten, um Steuerelemente auszurichten. Diese stellen wir im Beitrag Steuerelemente ausrichten (www.access-im-unternehmen.de\/1431) vor. All diese Methoden haben jedoch Vor- und Nachteile. Der gr&ouml;&szlig;te Nachteil ist, dass sie Zeit kosten - Zeit, die man in viel sch&ouml;nere Arbeiten investieren k&ouml;nnte. Deshalb schauen wir uns in diesem Beitrag an, wie wir in der Entwurfsansicht selektierte Steuerelemente einfach per VBA ausrichten k&ouml;nnen. Dabei ist nicht die Technik die entscheidende Frage, sondern die Vorgabe, nach welchen Regeln die Ausrichtung genau erfolgen soll. In diesem Beitrag beschreiben wir, wie man per VBA solche Steuerelemente wie Textfeld, Kombinationsfeld, Listenfeld und Kontrollk&auml;stchen und ihre Bezeichnungsfelder, die untereinander angeordnet sind, ausrichten kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-17T09:31:34+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=\"19\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_VBA\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Steuerelemente ausrichten per VBA\",\"datePublished\":\"2023-06-17T09:31:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/\"},\"wordCount\":3155,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/a88cdbfb98f1406d88c8fec874de2b44\",\"articleSection\":[\"2\\\/2023\",\"2023\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/\",\"name\":\"Steuerelemente ausrichten per VBA - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/a88cdbfb98f1406d88c8fec874de2b44\",\"datePublished\":\"2023-06-17T09:31:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/a88cdbfb98f1406d88c8fec874de2b44\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/a88cdbfb98f1406d88c8fec874de2b44\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Steuerelemente_ausrichten_per_VBA\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Steuerelemente ausrichten per VBA\"}]},{\"@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":"Steuerelemente ausrichten per VBA - 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_VBA\/","og_locale":"de_DE","og_type":"article","og_title":"Steuerelemente ausrichten per VBA","og_description":"Access bietet verschiedene M&ouml;glichkeiten, um Steuerelemente auszurichten. Diese stellen wir im Beitrag Steuerelemente ausrichten (www.access-im-unternehmen.de\/1431) vor. All diese Methoden haben jedoch Vor- und Nachteile. Der gr&ouml;&szlig;te Nachteil ist, dass sie Zeit kosten - Zeit, die man in viel sch&ouml;nere Arbeiten investieren k&ouml;nnte. Deshalb schauen wir uns in diesem Beitrag an, wie wir in der Entwurfsansicht selektierte Steuerelemente einfach per VBA ausrichten k&ouml;nnen. Dabei ist nicht die Technik die entscheidende Frage, sondern die Vorgabe, nach welchen Regeln die Ausrichtung genau erfolgen soll. In diesem Beitrag beschreiben wir, wie man per VBA solche Steuerelemente wie Textfeld, Kombinationsfeld, Listenfeld und Kontrollk&auml;stchen und ihre Bezeichnungsfelder, die untereinander angeordnet sind, ausrichten kann.","og_url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-06-17T09:31:34+00:00","author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Steuerelemente ausrichten per VBA","datePublished":"2023-06-17T09:31:34+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/"},"wordCount":3155,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/a88cdbfb98f1406d88c8fec874de2b44","articleSection":["2\/2023","2023","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/","url":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/","name":"Steuerelemente ausrichten per VBA - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/a88cdbfb98f1406d88c8fec874de2b44","datePublished":"2023-06-17T09:31:34+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/a88cdbfb98f1406d88c8fec874de2b44","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/a88cdbfb98f1406d88c8fec874de2b44"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Steuerelemente_ausrichten_per_VBA\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Steuerelemente ausrichten per VBA"}]},{"@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\/55001429","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=55001429"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001429\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}