{"id":55001547,"date":"2025-06-01T00:00:00","date_gmt":"2025-06-02T10:22:11","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1547"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Spaltenbreiten_und_position_in_ACCDE_speichern","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDE_speichern\/","title":{"rendered":"Spaltenbreiten und -position in ACCDE speichern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/ea156dcc8e73478daa19efb796f084fd\" width=\"1\" height=\"1\" alt=\"\"><b>Wenn Sie eine Datenbank an die Benutzer weitergeben, verwenden Sie je nach Zielgruppe eine .accde-Datenbank, also eine Datenbank, in welcher der Entwurf von Tabellen, Abfragen, Formularen, Berichten und VBA nicht mehr m&ouml;glich ist. Damit sch&uuml;tzen wir auch den wertvollen VBA-Code vor den Blicken anderer Menschen. Es bringt aber auch mit sich, dass &Auml;nderungen an Eigenschaften wie Spaltenbreiten, Spaltenreihenfolge oder die Sichtbarkeit der Spalten nicht gespeichert werden k&ouml;nnen, da es sich dabei um &Auml;nderungen am Design des Formulars in der Datenblattansicht handelt. Gerade wenn Benutzer die Datenbl&auml;tter nach ihren eigenen Vorlieben umgestalten und dies bei jedem &Ouml;ffnen eines Formular erneut erledigen m&uuml;ssen, macht sich schnell Frustration breit. Daher zeigen wir in diesem Beitrag, wie Sie eine Funktion zum Speichern und Wiederherstellen der Spalteneigenschaften von Formularen in der Datenblattansicht programmieren k&ouml;nnen.<\/b><\/p>\n<p>Datenblattansichten gibt es  in den meisten Datenbanken &#8211; wie  hier zum Beispiel zur Anzeige der Daten einer Mitarbeitertabelle (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_001.png\" alt=\"Beispiel f&uuml;r eine Datenblattansicht\" width=\"674,559\" height=\"434,8478\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r eine Datenblattansicht<\/span><\/b><\/p>\n<p>Sie bieten viele Vorteile, wenn wir die Daten einer Tabelle oder Abfrage als Liste anzeigen wollen.<\/p>\n<p>Dazu geh&ouml;rt die M&ouml;glichkeit, die Spaltenbreiten anzupassen,  die Spalten nach unseren W&uuml;nschen zu arrangieren und Spalten ein- oder auszublenden.<\/p>\n<h2>M&ouml;gliche Anpassungen der Datenblattansicht<\/h2>\n<p>Wir k&ouml;nnen also folgende &Auml;nderungen an der Datenblattansicht durchf&uuml;hren:<\/p>\n<ul>\n<li>Einstellen der Spaltenbreite durch Ziehen des rechten Randes des Spaltenkopfes<\/li>\n<li>&Auml;ndern der Reihenfolge der Spalten, indem wir die zu verschiebende Spalte am Spaltenkopf mit der Maus anfassen und an die gew&uuml;nschte Position ziehen<\/li>\n<li>Ausblenden der aktuellen Spalte per Rechtsklick und Auswahl des Befehls <b>Felder ausblenden<\/b> (siehe Bild 2). Hier k&ouml;nnen wir auch mehrere zusammenh&auml;ngende Felder gleichzeitig ausblenden.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_002.png\" alt=\"Ausblenden einer Spalte\" width=\"424,5589\" height=\"296,1068\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ausblenden einer Spalte<\/span><\/b><\/p>\n<li>Wiedereinblenden von Spalten durch Bet&auml;tigen des Kontextmen&uuml;befehls <b>Felder wieder einblenden <\/b>und Auswahl der einzublendenden Felder im Dialog <b>Spalten einblenden <\/b>(siehe Bild 3).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_003.png\" alt=\"Erneutes Einblenden von Spalten\" width=\"424,5589\" height=\"350,3134\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Erneutes Einblenden von Spalten<\/span><\/b><\/p>\n<li>Fixieren von Feldern durch Auswahl eines oder mehrerer Felder und anschlie&szlig;endes Bet&auml;tigen des Kontextmen&uuml;befehls <b>Felder fixieren<\/b> des Spaltenkopfes, wodurch alle Felder links des rechten markierten Feldes inklusive dieses Feldes fixiert werden. Scrollen wir nun nach rechts, bleiben die fixierten Felder immer sichtbar.<\/li>\n<li>Aufhebung der Fixierung aller Felder durch den Kontextmen&uuml;befehl <b>Fixierung aller Felder aufheben<\/b><\/li>\n<\/ul>\n<h2>Verhalten in der .accdb-Version der Datenbank<\/h2>\n<p>Wenn wir in der <b>.accdb<\/b>-Version der Datenbank arbeiten und eine oder mehrere dieser &Auml;nderungen vorgenommen haben, k&ouml;nnen wir das Formular schlie&szlig;en und wieder &ouml;ffnen und finden alle Einstellungen vor, wie sie zuletzt eingestellt waren. Wenn wir eine solche &Auml;nderung vornehmen, stellen wir sogar fest, dass diese &Auml;nderungen noch nicht einmal die R&uuml;ckfrage ausl&ouml;st, ob &Auml;nderungen an diesem Formular gespeichert werden sollen. Selbst nach dem Schlie&szlig;en und erneutem &Ouml;ffnen der Datenbank finden wir die letzten Einstellungen erneut vor.<\/p>\n<h2>Speichern der Datenbank als .accde-Datenbank<\/h2>\n<p>Nun wollen wir die Datenbank als <b>.accde<\/b>-Datenbank speichern und somit in einem Format, das keine &Auml;nderungen mehr an dem Entwurf der Objekte zulassen sollte.<\/p>\n<p>Dazu klicken wir in Access auf den Reiter <b>Datei <\/b>und dann auf <b>Speichern unter<\/b>. Damit blenden wir den Bereich <b>Speichern unter <\/b>ein, wo wir im rechten Bereich den Befehl <b>ACCDE erstellen <\/b>vorfinden (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_004.png\" alt=\"Speichern der Datenbank als .accde-Datenbank\" width=\"700\" height=\"340,3972\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Speichern der Datenbank als .accde-Datenbank<\/span><\/b><\/p>\n<p>Klicken wir diesen doppelt an, erscheint ein Dialog, mit dem wir den Namen f&uuml;r die zu erstellende Datei angeben k&ouml;nnen. Access schl&auml;gt hierzu den gleichen Dateinamen vor, allerdings mit der Dateiendung <b>.accde<\/b>. Diesen Dateinamen behalten wir bei und speichern die neue Datei.<\/p>\n<h2>Experimente mit der .accde-Version<\/h2>\n<p>Nun &ouml;ffnen wir die Datenbank in der <b>.accde<\/b>-Version. Das Formular <b>frmMitarbeiterUebersicht <\/b>erscheint genauso wie in der <b>.accdb<\/b>-Version. Dass es sich &uuml;berhaupt um die <b>.accde<\/b>-Version handelt, k&ouml;nnen wir leicht feststellen, indem wir versuchen, die Entwurfsansicht des Formulars anzuzeigen. Dies gelingt nicht, weil die entsprechende Schaltfl&auml;che im Formular gar nicht verf&uuml;gbar ist (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_005.png\" alt=\"In der .accde-Version kann die Entwurfsansicht nicht mehr ge&ouml;ffnet werden.\" width=\"424,5589\" height=\"217,6973\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: In der .accde-Version kann die Entwurfsansicht nicht mehr ge&ouml;ffnet werden.<\/span><\/b><\/p>\n<p>Nun nehmen wir einige &Auml;nderungen vor &#8211; wir &auml;ndern die Reihenfolge der Spalten, passen ihre Breite an, blenden eine Spalte aus und fixieren eine am linken Rand.<\/p>\n<p>Das gelingt alles ohne Probleme. Wenn wir das Formular jedoch schlie&szlig;en und erneut &ouml;ffnen, finden wir genau die gleiche Ansicht vor, wie wir sie in der Originaldatenbank im <b>.accdb<\/b>-Format vor dem Erstellen der <b>.accde<\/b>-Datenbank eingestellt hatten.<\/p>\n<h2>Spalteneinstellungen manuell speichern und wiederherstellen<\/h2>\n<p>Was nun? Zum Gl&uuml;ck k&ouml;nnen wir die Eigenschaften der Spalten der Datenblattansicht per VBA auslesen.<\/p>\n<p>Das bedeutet, dass wir sie auch wiederherstellen k&ouml;nnen. Alles, was wir ben&ouml;tigen, ist eine Tabelle, in der wir die Einstellungen speichern k&ouml;nnen, w&auml;hrend das Formular oder die Anwendung geschlossen werden, und aus der wir die Einstellungen wieder auslesen und wiederherstellen k&ouml;nnen.<\/p>\n<h2>Ermitteln der Spalteneinstellungen des Formulars<\/h2>\n<p>Wir starten mit dem Auslesen der Einstellungen der Spalten des Formulars. Dazu &ouml;ffnen wir zun&auml;chst wieder die <b>.accdb<\/b>-Version der Datenbank &#8211; in der <b>.accde<\/b>-Datenbank k&ouml;nnen wir schlie&szlig;lich erst gar nicht auf den VBA-Code zugreifen.<\/p>\n<h2>Spalteneigenschaften unter VBA<\/h2>\n<p>F&uuml;r das Ermitteln der Positionen, Sichtbarkeit und Breite sowie der fixierten Spalten k&ouml;nnen wir einige VBA-Eigenschaften verwenden.<\/p>\n<h2>Fixierte Spalten per VBA ermitteln<\/h2>\n<p>Zun&auml;chst einmal verwenden wir eine Eigenschaft des Formulars in der Datenblattansicht namens <b>FrozenColumns<\/b>. Diese liefert uns Informationen dar&uuml;ber, wie viele Spalten fixiert sind. Dabei ist der zur&uuml;ckgegebene Wert etwas irref&uuml;hrend:<\/p>\n<ul>\n<li><b>1<\/b>: keine Spalte ist fixiert<\/li>\n<li><b>2<\/b>: es ist eine Spalte fixiert<\/li>\n<li><b>3<\/b>: es sind zwei Spalten fixiert<\/li>\n<li>und so weiter<\/li>\n<\/ul>\n<p>Beispiel f&uuml;r das Hauptformular <b>frmMitarbeiterUebersicht <\/b>mit dem Unterformular <b>sfmMitarbeiterUebersicht<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht.Form.FrozenColumns<\/pre>\n<h2>Reihenfolge der Spalten per VBA ermitteln<\/h2>\n<p>Zum Ermitteln der Reihenfolge k&ouml;nnen wir die Eigenschaft <b>ColumnOrder <\/b>der einzelnen Steuerelemente nutzen. Diese liefert uns f&uuml;r jede Spalte den Index, den die aktuelle Spalte in der Reihenfolge hat. Die linke Spalte liefert den Wert <b>1<\/b>, die zweite von links den Wert <b>2 <\/b>und so weiter.<\/p>\n<p>Beispiel: <\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnOrder<\/pre>\n<h2>Spaltenbreiten ermitteln<\/h2>\n<p>Die Eigenschaft zum Ermitteln der Spaltenbreite lautet <b>ColumnWidth<\/b>. Sie liefert die Breite in Twips:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnWidth<\/pre>\n<h2>Sichtbarkeit einer Spalte ermitteln<\/h2>\n<p>Schlie&szlig;lich fehlt noch die Sichtbarkeit. Diese ermitteln wir im Gegensatz zu Steuerelementen in Formularen in der Formularansicht nicht mit der <b>Visible<\/b>-Eigenschaft, sondern mit der Eigenschaft <b>ColumnHidden<\/b>. Sie liefert den Wert <b>False<\/b>, wenn das Steuerelement sichtbar ist, und <b>True<\/b>, falls es ausgeblendet ist.<\/p>\n<p>Beispiel:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnHidden<\/pre>\n<h2>Keine Steuerelementeigenschaften<\/h2>\n<p>Die Eigenschaften <b>ColumnOrder<\/b>, <b>ColumnWidth <\/b>und <b>ColumnHidden <\/b>sind keine allgemeinen Eigenschaften von Steuerelementen, werden also von IntelliSense nicht angezeigt, wenn wir &uuml;ber den Typ <b>Control <\/b>darauf zugreifen wollen.<\/p>\n<p>Wir finden die Eigenschaften erst f&uuml;r explizit angegebene Steuerelementtypen, die wir beispielsweise im Objektkatalog sehen (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_006.png\" alt=\"Die Spalteneigenschaften im Objektkatalog\" width=\"424,5589\" height=\"335,8696\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Spalteneigenschaften im Objektkatalog<\/span><\/b><\/p>\n<p>Wir k&ouml;nnen diese aber auch &uuml;ber den Datentyp <b>Control  <\/b>nutzen, vorausgesetzt das referenzierte Steuerelement verf&uuml;gt &uuml;ber die entsprechende Eigenschaft. Bei Beschriftungsfeldern ist das beispielsweise nicht der Fall.<\/p>\n<h2>Durchlaufen der Spalten und Ermitteln der Eigenschaften<\/h2>\n<p>In der Prozedur aus Listing 1 geben wir zun&auml;chst einmal alle Eigenschaften der gebundenen Steuerelemente des Unterformulars <b>sfmMitarbeiterUebersicht <\/b>aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>DatenblattAuslesen()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<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>strControlSource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> frm = Forms!frmMitarbeiterUebersicht\r\n     <span style=\"color:blue;\">Set<\/span> sfm = frm!sfmMitarbeiterUebersicht.Form\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Fixierte Spalte: \" & sfm.FrozenColumns\r\n     For Each ctl In sfm.Controls\r\n         strControlSource = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strControlSource = ctl.ControlSource\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strControlSource, ctl.ColumnHidden, ctl.ColumnWidth, ctl.ColumnOrder\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: Auslesen der Spalteneigenschaften f&uuml;r die Steuerelemente unseres Beispielformulars<\/span><\/b><\/p>\n<p>Dabei referenzieren wir mit der Variablen <b>frm <\/b>das Hauptformular <b>frmMitarbeiterUebersicht <\/b>und mit <b>sfm <\/b>das im Unterformularsteuerelement <b>sfmMitarbeiterUebersicht <\/b>enthaltene Formular.<\/p>\n<p>Bevor wir die Steuerelemente durchlaufen, geben wir die Eigenschaft <b>FrozenColumns <\/b>des Unterformulars aus. Dann durchlaufen wir alle Steuerelemente der Auflistung <b>Controls <\/b>des Unterformulars und referenzieren diese jeweils mit der Variablen <b>ctl <\/b>mit dem Datentyp <b>Control<\/b>.<\/p>\n<p>In der Schleife pr&uuml;fen wir, ob es sich bei dem aktuellen Steuerelement um ein gebundenes Steuerelement handelt.<\/p>\n<p>Das ist n&ouml;tig, weil dieses ja auch Bezeichnungsfelder enth&auml;lt. Dazu versuchen wir bei deaktivierter Fehlerbehandlung, den Wert der Eigenschaft <b>ControlSource <\/b>(<b>Steuerelementinhalt<\/b>) auszulesen und speichern  diesen in der Variablen <b>strControlSource<\/b>.<\/p>\n<p>Ist <b>strControlSource <\/b>dann nicht leer, handelt es sich um ein gebundenes Steuerelement. Dann geben wir den Namen des Steuerelements und die Werte der Eigenschaften <b>ColumnHidden<\/b>, <b>ColumnWidth <\/b>und <b>ColumnOrder <\/b>im Direktbereich des VBA-Editors aus. Das Ergebnis f&uuml;r ein Datenblatt mit einigen Anpassungen sieht wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_007.png\" alt=\"Ausgabe der Spalteneigenschaften im Direktbereich des VBA-Editors\" width=\"549,559\" height=\"359,1787\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Ausgabe der Spalteneigenschaften im Direktbereich des VBA-Editors<\/span><\/b><\/p>\n<h2>Felder fixieren &auml;ndert gegebenenfalls Reihenfolge<\/h2>\n<p>Es fehlt noch ein Hinweis darauf, dass wir mit dem Fixieren von Spalten eventuell die Reihenfolge der Spalten &auml;ndern. Das ist der Fall, wenn wir nicht ausschlie&szlig;lich Spalten am linken Rand fixieren wollen.<\/p>\n<p>Wenn wir beispielsweise nur die zweite Spalte von links fixieren wollen, wird diese ganz nach links verschoben und fixiert.<\/p>\n<h2>Tabelle zum Speichern vorbereiten<\/h2>\n<p>Wenn wir in einer <b>.accde<\/b>-Datenbank die vom Benutzer eingestellten Spalteneigenschaften speichern und sp&auml;ter wieder herstellen wollen, ben&ouml;tigen wir eine Tabelle, um die Informationen zu speichern. Diese soll zumindest einmal f&uuml;r jede Spalte die Position, die Breite und die Sichtbarkeit  aufnehmen.<\/p>\n<p>Au&szlig;erdem wollen wir die Information &uuml;ber die Fixierung von Spalten sichern. Dies ist aber eine Information, die  wir f&uuml;r das Formular speichern, in dem sich die Spalten befinden.<\/p>\n<p>Wir wollen die Daten allerdings nicht nur f&uuml;r ein Formular speichern k&ouml;nnen, sondern gegebenenfalls auch f&uuml;r mehrere. Deshalb m&uuml;ssen wir auch noch Informationen &uuml;ber das betroffene Formular und nat&uuml;rlich auch noch die Steuerelementnamen sichern.<\/p>\n<p>Damit wir die Anzahl der fixierten Spalten nicht mehrfach speichern m&uuml;ssen, legen wir zwei Tabellen an:<\/p>\n<ul>\n<li>Die erste speichert den Namen des Formulars und die Anzahl der fixierten Spalten.<\/li>\n<li>Die zweite referenziert den entsprechenden Datensatz der ersten Tabelle und die Werte f&uuml;r die Eigenschaften <b>ColumnWidth<\/b>, <b>ColumnOrder <\/b>und <b>ColumnHidden<\/b>.<\/li>\n<\/ul>\n<p>Die Tabelle <b>tblColumnsForms <\/b>enth&auml;lt ein Prim&auml;rschl&uuml;sselfeld namens <b>FormID <\/b>sowie ein Feld f&uuml;r den Formularnamen (<b>Formname<\/b>) und die Anzahl der fixierten Spalten (<b>FrozenColumns<\/b>) &#8211; siehe Bild 8.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_008.png\" alt=\"Tabelle f&uuml;r die Formulare\" width=\"549,559\" height=\"368,1953\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Tabelle f&uuml;r die Formulare<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblColumnsProperties<\/b> sieht wie in Bild 9 aus. Hier finden wir neben dem Prim&auml;rschl&uuml;sselfeld <b>ColumnID <\/b>das Fremdschl&uuml;sselfeld <b>FormID<\/b>, mit dem das Formular festgelegt wird, in dem sich das Steuerelement befindet. Den Namen des Steuerelements speichern wir im Feld <b>Controlname<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_009.png\" alt=\"Tabelle mit den Spalten\" width=\"549,559\" height=\"384,9931\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Tabelle mit den Spalten<\/span><\/b><\/p>\n<p>Au&szlig;erdem speichern wir in den Feldern <b>ColumnWidth<\/b>, <b>ColumnOrder <\/b>und <b>ColumnHidden <\/b>die jeweiligen Eigenschaftswerte.<\/p>\n<p>F&uuml;r die beiden Felder <b>FormID <\/b>und <b>Controlname <\/b>legen wir einen eindeutigen Index fest, damit jedes Steuerelement nur einmal f&uuml;r jedes Formular angelegt werden kann.<\/p>\n<p>F&uuml;r die Beziehung zwischen den beiden Tabellen stellen wir die <b>L&ouml;schweitergabe <\/b>auf <b>Ja <\/b>ein. Damit sorgen wir daf&uuml;r, dass wir beim Speichern der Daten f&uuml;r ein Formular direkt die kompletten Daten der beiden Tabellen nur durch das L&ouml;schen des entsprechenden Datensatzes der Tabelle <b>tblColumnsForms <\/b>entfernen k&ouml;nnen (siehe Bild 10).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_010.png\" alt=\"Beziehung zwischen den Tabellen\" width=\"549,559\" height=\"441,9972\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Beziehung zwischen den Tabellen<\/span><\/b><\/p>\n<h2>Schreiben der Spalteneigenschaften in die Tabellen<\/h2>\n<p>Um die Tabellen zu f&uuml;llen, erstellen wir eine neue, erweiterte Version der zuvor verwendeten Prozedur namens <b>SaveColumnConfiguration<\/b> (siehe Listing 2). Sie beginnt wie die vorherige Version, l&ouml;scht dann aber zun&auml;chst die Daten der Tabelle <b>tblColumnsForms <\/b>und somit auch die Daten der Tabelle <b>tblColumnsProperties<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SaveColumnConfiguration()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<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>strControlSource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFormID<span style=\"color:blue;\"> As Long<\/span>\r\n     \r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> frm = Forms!frmMitarbeiterUebersicht\r\n     <span style=\"color:blue;\">Set<\/span> sfm = frm!sfmMitarbeiterUebersicht.Form\r\n     \r\n     db.Execute \"DELETE FROM tblColumnsForms WHERE Formname = ''\" & sfm.Name & \"''\", dbFailOnError\r\n     db.Execute \"INSERT INTO tblColumnsForms(Formname, FrozenColumns) VALUES(''\" & sfm.Name & \"'', \" & sfm.FrozenColumns _\r\n         & \")\", dbFailOnError\r\n     lngFormID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n     \r\n     For Each ctl In sfm.Controls\r\n         strControlSource = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strControlSource = ctl.ControlSource\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             db.Execute \"INSERT INTO tblColumnsProperties(FormID, Controlname, ColumnWidth, ColumnOrder, \" _\r\n                 & \"ColumnHidden) VALUES(\" & lngFormID & \", ''\" & ctl.Name & \"'', \" & ctl.ColumnWidth & \", \" _\r\n                 & ctl.ColumnOrder & \", \" & CInt(ctl.ColumnHidden) & \")\", dbFailOnError\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 2: Schreiben der Spalteneigenschaften in die beiden Tabellen tblColumnsForms und tblColumnsProperties<\/span><\/b><\/p>\n<p>Dann legt sie einen neuen Datensatz in  der Tabelle <b>tblColumnsForms <\/b>an und tr&auml;gt dort den Namen des Formulars ein. Anschlie&szlig;end liest sie den Prim&auml;rschl&uuml;sselwert des neu angelegten Datensatzes in die Variable <b>lngFormID <\/b>ein.<\/p>\n<p>Nun durchl&auml;uft sie wie zuvor die Schleife &uuml;ber alle Steuerelemente und ermittelt darunter die gebundenen Steuerelemente. F&uuml;r diese schreibt sie die ID des dazugeh&ouml;renden Formulars aus der Tabelle <b>tblColumnsForms<\/b>, den Steuerelementnamen, die Spaltenbreite, die Spaltenposition und die Sichtbarkeit in die Felder der Tabelle <b>tblColumnsProperties<\/b>.<\/p>\n<p>Das Ergebnis sehen wir in Bild 11. F&uuml;r das Formular landet ein Datensatz in der Tabelle <b>tblColumnsForms<\/b>, f&uuml;r jedes Steuerelement einer in der Tabelle <b>tblColumnsProperties<\/b>. Damit sind wir soweit, dass wir nur noch die Konfiguration zur&uuml;ck in das Formular schreiben m&uuml;ssen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_011.png\" alt=\"Daten der Tabellen mit den Spalteneigenschaften\" width=\"649,559\" height=\"229,7937\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Daten der Tabellen mit den Spalteneigenschaften<\/span><\/b><\/p>\n<p>Zuvor passen wir unsere Prozedur noch leicht an, sodass sie mit der Version aus der Beispieldatenbank &uuml;bereinstimmt.<\/p>\n<p>Dazu entfernen wir die Deklaration der Formulare (<b>frm<\/b>, <b>sfm<\/b>) sowie die Zuweisung dieser Elemente aus der Prozedur <b>SaveColumnConfiguration <\/b>und f&uuml;gen der Prozedur einen Parameter namens <b>sfm <\/b>als Parameter zur Kopfzeile hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>SaveColumnConfiguration(sfm<span style=\"color:blue;\"> As <\/span>Form)\r\n...<\/pre>\n<p>Den Aufruf zum Testen k&ouml;nnen wir nun wie folgt in einer eigenen Prozedur hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_SaveColumnConfiguration()\r\n     <span style=\"color:blue;\">Dim <\/span>frm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Dim <\/span>sfm<span style=\"color:blue;\"> As <\/span>Form\r\n     <span style=\"color:blue;\">Set<\/span> frm = Forms!frmMitarbeiterUebersicht\r\n     <span style=\"color:blue;\">Set<\/span> sfm = frm!sfmMitarbeiterUebersicht.Form\r\n     SaveColumnConfiguration sfm\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In dem Formular, dessen Konfiguration wir speichern wollen, nehmen wir keine &Auml;nderungen vor &#8211; wohl aber im Unterformular. Hier legen wir eine Prozedur f&uuml;r das Ereignis <b>Beim Entladen <\/b>an und f&uuml;llen sie mit dem folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     SaveColumnConfiguration Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit wird beim Schlie&szlig;en des Formulars die Konfiguration der Spalten des Datenblatts gespeichert.<\/p>\n<h2>Konfiguration beim Laden des Formulars auslesen<\/h2>\n<p>Nun wollen wir die Konfiguration beim Laden des Formulars beziehungsweise des Unterformulars wiederherstellen. Das ist allerdings alles andere als trivial, wie sich gleich herausstellen wird.<\/p>\n<p>Der Grund daf&uuml;r ist, dass wir auf die Eigenschaft <b>FrozenColumns <\/b>nur lesend, aber nicht schreibend zugreifen k&ouml;nnen. Das bedeutet, dass wir zwar ermitteln k&ouml;nnen, wie viele Spalten von links aus fixiert wurden, aber wir k&ouml;nnen diesen Wert f&uuml;r ein neu ge&ouml;ffnetes Formular &uuml;ber diese Eigenschaft nicht wiederherstellen.<\/p>\n<p>Allerdings gibt es die M&ouml;glichkeit, dies &uuml;ber die Benutzeroberfl&auml;che zu erledigen &#8211; zum Beispiel wie weiter oben gezeigt &uuml;ber den Befehl <b>Spalten fixieren <\/b>des Kontextmen&uuml;s der Spaltenk&ouml;pfe des Formulars. Auch finden wir hier einen Befehl namens <b>Fixierung aller Spalten aufheben<\/b>. Und wenn es die M&ouml;glichkeit gibt, eine Aktion &uuml;ber die Benutzeroberfl&auml;che durchzuf&uuml;hren, finden wir in der Regel auch eine entsprechende Konstante f&uuml;r die Methode <b>Application.RunCommand<\/b>.<\/p>\n<p>Da wir wissen, dass die Eigenschaft zum Fixieren von Spalten <b>FrozenColumns <\/b>hei&szlig;t, suchen wir einmal im Objektkatalog des VBA-Editors nach Begriffen wie <b>Frozen <\/b>oder <b>Freeze<\/b>. Die Suche ist schnell von Erfolg gekr&ouml;nt, wie Bild 12 zeigt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_03\/pic_1547_012.png\" alt=\"Suchen von RunCommand-Konstanten im Objektkatalog\" width=\"549,559\" height=\"434,7574\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Suchen von RunCommand-Konstanten im Objektkatalog<\/span><\/b><\/p>\n<p>Nun gestaltet es sich allerdings wesentlich umst&auml;ndlicher als mit der Eigenschaft <b>FrozenColumns<\/b>, damit die fixierten Spalten wiederherzustellen. Wir k&ouml;nnen damit n&auml;mlich immer nur eine Spalte gleichzeitig fixieren. Immerhin k&ouml;nnen wir so von links nach rechts die Anzahl Spalten fixieren, die wir auch in der Konfigurationstabelle gespeichert haben.<\/p>\n<p>So setzen wir nacheinander den Fokus auf die jeweils zu den fixierten Spalten hinzuzuf&uuml;gende Spalte und fixieren diese. Wie das geht, schauen wir uns gleich an.<\/p>\n<p>Die Prozedur <b>LoadColumnConfiguration <\/b>haben wir direkt so aufgebaut wie die Prozedur <b>SaveColumnConfiguration<\/b>. Wir &uuml;bergeben dieser einen Verweis auf das Formular, das die entsprechende Datenblattansicht anzeigt (siehe Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>LoadColumnConfiguration(sfm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rstForm<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>rstColumns<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strFormname<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngFormID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strControlSource<span style=\"color:blue;\"> As String<\/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>bolFokusGesetzt<span style=\"color:blue;\"> As Boolean<\/span>\r\n     \r\n     For Each ctl In sfm.Controls\r\n         strControlSource = \"\"\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         strControlSource = ctl.ControlSource\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strControlSource) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> ctl.Name\r\n             ctl.ColumnHidden = <span style=\"color:blue;\">False<\/span>\r\n             <span style=\"color:blue;\">If <\/span>bolFokusGesetzt = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                 ctl.SetFocus\r\n                 bolFokusGesetzt = <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;\">Next<\/span> ctl\r\n     RunCommand acCmdUnfreezeAllColumns\r\n     strFormname = sfm.Name\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rstForm = db.OpenRecordset(\"SELECT * FROM tblColumnsForms WHERE Formname = ''\" & strFormname & \"''\", _\r\n         dbOpenDynaset)\r\n     lngFormID = rstForm!FormID\r\n     <span style=\"color:blue;\">Set<\/span> rstColumns = db.OpenRecordset(\"SELECT * FROM tblColumnsProperties WHERE FormID = \" & lngFormID _\r\n         & \" ORDER BY ColumnOrder ASC\", dbOpenDynaset)\r\n     \r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstColumns.EOF\r\n         <span style=\"color:blue;\">With<\/span> sfm.Controls(rstColumns!ControlName)\r\n             .ColumnOrder = rstColumns!ColumnOrder\r\n             .ColumnWidth = rstColumns!ColumnWidth\r\n             <span style=\"color:blue;\">If <\/span>rstColumns!ColumnOrder &lt; rstForm!FrozenColumns<span style=\"color:blue;\"> Then<\/span>\r\n                 .SetFocus\r\n                 RunCommand acCmdFreezeColumn\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             .ColumnHidden = rstColumns!ColumnHidden\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         rstColumns.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Schreiben der Spalteneinstellungen aus den Tabellen in die Steuerelemente<\/span><\/b><\/p>\n<p>Damit k&ouml;nnen wir diese beim Laden des Unterformulars wie in der folgenden Ereignisprozedur aufrufen und mit dem Schl&uuml;sselwort <b>Me <\/b>einen entsprechenden Verweis &uuml;bergeben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     LoadColumnConfiguration Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur selbst erledigt mehrere Aufgaben. Die erste ist, alle Spalten des Formulars sichtbar zu machen. Dazu durchlaufen wir alle Steuerelemente in einer <b>For Each<\/b>-Schleife &uuml;ber die Auflistung <b>sfm.Controls<\/b>.<\/p>\n<p>Hier ermitteln wir wieder, ob es sich bei dem aktuellen Steuerelement um ein gebundenes Steuerelement handelt. Falls ja, stellen wir die Eigenschaft <b>ColumnHidden <\/b>auf <b>False <\/b>ein und blenden die Spalte somit ein.<\/p>\n<p>Au&szlig;erdem wollen wir in diesem Durchlauf daf&uuml;r sorgen, dass die erste Spalte den Fokus erh&auml;lt. Dazu haben wir eine Variable namens <b>bolFokusGesetzt <\/b>erstellt, die zun&auml;chst den Wert <b>False <\/b>enth&auml;lt. Sobald wir das erste Mal den Fokus gesetzt haben, in diesem Fall f&uuml;r die erste Spalte, wird <b>bolFokusGesetzt <\/b>auf <b>True <\/b>eingestellt, sodass der Fokus auf der ersten Spalte verbleibt.<\/p>\n<p>Nachdem so alle Spalten sichtbar gemacht wurden, entfernen wir auch noch die aktuelle Fixierung, indem wir die Methode <b>RunCommand <\/b>mit dem Parameter <b>acCmdUnfreezeAllColumns <\/b>aufrufen. Dazu muss mindestens eine Spalte den Fokus haben, daher haben wir diese vorher auf die erste Spalte gesetzt.<\/p>\n<p>Danach k&uuml;mmern wir uns um die eigentliche Wiederherstellung der Konfiguration. Hier tragen wir zun&auml;chst den Namen des Formulars in die Variable <b>strFormname <\/b>ein und erstellen ein Recordset auf Basis der Tabelle <b>tblColumnsForms<\/b>, der den Datensatz enth&auml;lt, der sich auf dieses Formular bezieht. Aus dieser Tabelle lesen wir den Prim&auml;rschl&uuml;sselwert aus und speichern ihn in der Variablen <b>lngFormID<\/b>.<\/p>\n<p>Dann erstellen wir ein zweites Recordset namens <b>rstColumns<\/b>, diesmal auf Basis der Tabelle <b>tblColumnsProperties<\/b>. Diese filtern wir in dem Recordset nach dem Prim&auml;rschl&uuml;sselwert des verkn&uuml;pften Datensatzes der Tabelle <b>tblColumnsForms<\/b> und sortieren die Daten nach dem Wert des Feldes <b>ColumnOrder<\/b>.<\/p>\n<p>Auf diese Weise k&ouml;nnen wir die Spalten in der folgenden <b>Do While<\/b>-Schleife gleich in der Reihenfolge durchlaufen, in welcher die Spalten von links nach rechts angeordnet werden sollen.<\/p>\n<p>Wir referenzieren das aktuell anzupassende Steuerelement mit <b>sfm.Controls(rstColumns!ControlName)<\/b>. Dann stellen wir zun&auml;chst den Wert der Eigenschaft <b>ColumnOrder <\/b>auf den Wert des Feldes <b>ColumnOrder <\/b>des Recordsets ein. Wenn sich dieses Feld zuvor an einer anderen, weiter hinten liegenden Position befand, werden die Werte der Eigenschaft <b>ColumnOrder <\/b>f&uuml;r alle Felder, die dadurch nach rechts verschoben werden, um 1 erh&ouml;ht.<\/p>\n<p>Danach stellen wir die Werte der Eigenschaft <b>ColumnWidth <\/b>wieder her.<\/p>\n<p>Und damit kommen wir zum spannenden Teil dieser Prozedur: Wie sorgen wir daf&uuml;r, dass die ersten <b>n <\/b>Spalten von links als fixierte Spalten markiert werden?<\/p>\n<p>Dazu pr&uuml;fen wir in einer <b>If&#8230;Then<\/b>-Bedingung, ob der aktuelle Wert von <b>rstColumns!ColumnOrder <\/b>kleiner ist als der Wert des Feldes <b>FrozenColumn <\/b>des Recordsets <b>rstForm<\/b>.<\/p>\n<p>Wenn die ersten beiden Spalten fixiert waren, lautet dieser Wert beispielsweise <b>3<\/b>. Dann fixieren wir so viele Spalten, bis die Anzahl der Spalten gleich <b>3 <\/b>ist &#8211; diese Spalte wird dann nicht mehr fixiert.<\/p>\n<p>Wir setzen den Fokus auf die aktuelle Spalte und rufen dann die Methode <b>RunCommand <\/b>mit dem Parameter <b>acCmdFreezeColumn <\/b>auf.<\/p>\n<p>Schlie&szlig;lich stellen wir noch die Eigenschaft <b>ColumnHidden <\/b>auf den Wert des entsprechenden Feldes des Recordsets <b>rstColumns <\/b>ein. Auf diese Weise passen wir alle Spalten an die in den Tabellen gespeicherten Konfigurationen an.<\/p>\n<h2>Testen der Funktion in einer .accde-Datenbank<\/h2>\n<p>Nun speichern wir die aktuelle Datenbank im Format <b>.accde <\/b>und starten diese. Hier stellen wir fest, dass alle zuvor ge&auml;nderten Einstellungen wiederhergestellt wurden.<\/p>\n<p>Wenn wir nun einige Einstellungen &auml;ndern und das Formular schlie&szlig;en und erneut &ouml;ffnen, finden wir die Einstellungen unver&auml;ndert vor. Das Gleiche geschieht, wenn wir die vollst&auml;ndige Datenbank schlie&szlig;en und erneut &ouml;ffnen &#8211; alle Einstellungen werden wiederhergestellt.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>In <b>.accde<\/b>-Datenbanken werden die vom Benutzer vorgenommenen Einstellungen an den Spalten der Datenblattansicht nicht gespeichert. Eventuelle &Auml;nderungen, die der Benutzer f&uuml;r eine ergonomischere Arbeitsweise mit den jeweiligen Daten vorgenommen hat, muss er bei jedem &Ouml;ffnen des Formulars manuell wiederherstellen.<\/p>\n<p>Diese Arbeit wollen wir dem Benutzer ersparen und haben dazu in diesem Beitrag zwei Prozeduren erarbeitet, mit denen wir zun&auml;chst die aktuelle, vom Benutzer vorgenommene Konfiguration beim Schlie&szlig;en des Formulars mit der Datenblattansicht in zwei Tabellen speichern.<\/p>\n<p>Die zweite Prozedur wird beim Laden des Formulars mit der Datenblattansicht aufgerufen und liest die Daten aus den Tabellen, um die Konfiguration im Formular wiederherzustellen.<\/p>\n<h2>Einbau in eigene Anwendungen<\/h2>\n<p>Wenn Sie diese Funktionen in eigenen Anwendungen nutzen wollen, sind nur wenige Schritte zu erledigen:<\/p>\n<ul>\n<li>F&uuml;gen Sie die beiden Tabellen <b>tblColumnsForms <\/b>und <b>tblColumnsProperties <\/b>in die Zieldatenbank ein.<\/li>\n<li>F&uuml;gen Sie au&szlig;erdem das Modul <b>mdlDatenblattkonfiguration <\/b>in die Datenbank ein.<\/li>\n<li>Stellen Sie f&uuml;r das Formular, das die Datenblattansicht anzeigt, die beiden Eigenschaften <b>Beim Laden <\/b>und <b>Beim Entladen <\/b>auf <b>[Ereignisprozedur] <\/b>ein und hinterlegen Sie daf&uuml;r die folgenden Prozeduren:<\/li>\n<\/ul>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     LoadColumnConfiguration Me\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     SaveColumnConfiguration Me\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DatenblattInDerACCDE.accdb<\/p>\n<p>DatenblattInDerACCDE.accde<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/BBB43B4A-2BA2-4901-88C1-AF7162BC6772\/aiu_1547.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie eine Datenbank an die Benutzer weitergeben, verwenden Sie je nach Zielgruppe eine .accde-Datenbank, also eine Datenbank, in welcher der Entwurf von Tabellen, Abfragen, Formularen, Berichten und VBA nicht mehr m&ouml;glich ist. Damit sch&uuml;tzen wir auch den wertvollen VBA-Code vor den Blicken anderer Menschen. Es bringt aber auch mit sich, dass &Auml;nderungen an Eigenschaften wie Spaltenbreiten, Spaltenreihenfolge oder die Sichtbarkeit der Spalten nicht gespeichert werden k&ouml;nnen, da es sich dabei um &Auml;nderungen am Design des Formulars in der Datenblattansicht handelt. Gerade wenn Benutzer die Datenbl&auml;tter nach ihren eigenen Vorlieben umgestalten und dies bei jedem &Ouml;ffnen eines Formular erneut erledigen m&uuml;ssen, macht sich schnell Frustration breit. Daher zeigen wir in diesem Beitrag, wie Sie eine Funktion zum Speichern und Wiederherstellen der Spalteneigenschaften von Formularen in der Datenblattansicht programmieren k&ouml;nnen.<\/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":[662025,66032025,44000023],"tags":[],"class_list":["post-55001547","post","type-post","status-publish","format-standard","hentry","category-662025","category-66032025","category-Mit_Formularen_arbeiten"],"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>Spaltenbreiten und -position in ACCDE speichern - 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\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spaltenbreiten und -position in ACCDE speichern\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie eine Datenbank an die Benutzer weitergeben, verwenden Sie je nach Zielgruppe eine .accde-Datenbank, also eine Datenbank, in welcher der Entwurf von Tabellen, Abfragen, Formularen, Berichten und VBA nicht mehr m&ouml;glich ist. Damit sch&uuml;tzen wir auch den wertvollen VBA-Code vor den Blicken anderer Menschen. Es bringt aber auch mit sich, dass &Auml;nderungen an Eigenschaften wie Spaltenbreiten, Spaltenreihenfolge oder die Sichtbarkeit der Spalten nicht gespeichert werden k&ouml;nnen, da es sich dabei um &Auml;nderungen am Design des Formulars in der Datenblattansicht handelt. Gerade wenn Benutzer die Datenbl&auml;tter nach ihren eigenen Vorlieben umgestalten und dies bei jedem &Ouml;ffnen eines Formular erneut erledigen m&uuml;ssen, macht sich schnell Frustration breit. Daher zeigen wir in diesem Beitrag, wie Sie eine Funktion zum Speichern und Wiederherstellen der Spalteneigenschaften von Formularen in der Datenblattansicht programmieren k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-02T10:22:11+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\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Spaltenbreiten und -position in ACCDE speichern\",\"datePublished\":\"2025-06-02T10:22:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/\"},\"wordCount\":3336,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/ea156dcc8e73478daa19efb796f084fd\",\"articleSection\":[\"2025\",\"3\\\/2025\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/\",\"name\":\"Spaltenbreiten und -position in ACCDE speichern - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/ea156dcc8e73478daa19efb796f084fd\",\"datePublished\":\"2025-06-02T10:22:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/ea156dcc8e73478daa19efb796f084fd\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/ea156dcc8e73478daa19efb796f084fd\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Spaltenbreiten_und_position_in_ACCDEs_speichern\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spaltenbreiten und -position in ACCDEs speichern\"}]},{\"@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":"Spaltenbreiten und -position in ACCDE speichern - 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\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/","og_locale":"de_DE","og_type":"article","og_title":"Spaltenbreiten und -position in ACCDE speichern","og_description":"Wenn Sie eine Datenbank an die Benutzer weitergeben, verwenden Sie je nach Zielgruppe eine .accde-Datenbank, also eine Datenbank, in welcher der Entwurf von Tabellen, Abfragen, Formularen, Berichten und VBA nicht mehr m&ouml;glich ist. Damit sch&uuml;tzen wir auch den wertvollen VBA-Code vor den Blicken anderer Menschen. Es bringt aber auch mit sich, dass &Auml;nderungen an Eigenschaften wie Spaltenbreiten, Spaltenreihenfolge oder die Sichtbarkeit der Spalten nicht gespeichert werden k&ouml;nnen, da es sich dabei um &Auml;nderungen am Design des Formulars in der Datenblattansicht handelt. Gerade wenn Benutzer die Datenbl&auml;tter nach ihren eigenen Vorlieben umgestalten und dies bei jedem &Ouml;ffnen eines Formular erneut erledigen m&uuml;ssen, macht sich schnell Frustration breit. Daher zeigen wir in diesem Beitrag, wie Sie eine Funktion zum Speichern und Wiederherstellen der Spalteneigenschaften von Formularen in der Datenblattansicht programmieren k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/","og_site_name":"Access im Unternehmen","article_published_time":"2025-06-02T10:22:11+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\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Spaltenbreiten und -position in ACCDE speichern","datePublished":"2025-06-02T10:22:11+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/"},"wordCount":3336,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/ea156dcc8e73478daa19efb796f084fd","articleSection":["2025","3\/2025","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/","url":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/","name":"Spaltenbreiten und -position in ACCDE speichern - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/ea156dcc8e73478daa19efb796f084fd","datePublished":"2025-06-02T10:22:11+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/ea156dcc8e73478daa19efb796f084fd","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/ea156dcc8e73478daa19efb796f084fd"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Spaltenbreiten_und_position_in_ACCDEs_speichern\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Spaltenbreiten und -position in ACCDEs speichern"}]},{"@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\/55001547","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=55001547"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001547\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}