Spaltenbreiten und -position in ACCDE speichern

Beispiel für eine Datenblattansicht

Bild 1: Beispiel für eine Datenblattansicht

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öglich ist. Damit schützen wir auch den wertvollen VBA-Code vor den Blicken anderer Menschen. Es bringt aber auch mit sich, dass Änderungen an Eigenschaften wie Spaltenbreiten, Spaltenreihenfolge oder die Sichtbarkeit der Spalten nicht gespeichert werden können, da es sich dabei um Änderungen am Design des Formulars in der Datenblattansicht handelt. Gerade wenn Benutzer die Datenblätter nach ihren eigenen Vorlieben umgestalten und dies bei jedem Öffnen eines Formular erneut erledigen mü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önnen.

Datenblattansichten gibt es in den meisten Datenbanken – wie hier zum Beispiel zur Anzeige der Daten einer Mitarbeitertabelle (siehe Bild 1).

Beispiel für eine Datenblattansicht

Bild 1: Beispiel für eine Datenblattansicht

Sie bieten viele Vorteile, wenn wir die Daten einer Tabelle oder Abfrage als Liste anzeigen wollen.

Dazu gehört die Möglichkeit, die Spaltenbreiten anzupassen, die Spalten nach unseren Wünschen zu arrangieren und Spalten ein- oder auszublenden.

Mögliche Anpassungen der Datenblattansicht

Wir können also folgende Änderungen an der Datenblattansicht durchführen:

  • Einstellen der Spaltenbreite durch Ziehen des rechten Randes des Spaltenkopfes
  • Ändern der Reihenfolge der Spalten, indem wir die zu verschiebende Spalte am Spaltenkopf mit der Maus anfassen und an die gewünschte Position ziehen
  • Ausblenden der aktuellen Spalte per Rechtsklick und Auswahl des Befehls Felder ausblenden (siehe Bild 2). Hier können wir auch mehrere zusammenhängende Felder gleichzeitig ausblenden.
  • Ausblenden einer Spalte

    Bild 2: Ausblenden einer Spalte

  • Wiedereinblenden von Spalten durch Betätigen des Kontextmenübefehls Felder wieder einblenden und Auswahl der einzublendenden Felder im Dialog Spalten einblenden (siehe Bild 3).
  • Erneutes Einblenden von Spalten

    Bild 3: Erneutes Einblenden von Spalten

  • Fixieren von Feldern durch Auswahl eines oder mehrerer Felder und anschließendes Betätigen des Kontextmenübefehls Felder fixieren 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.
  • Aufhebung der Fixierung aller Felder durch den Kontextmenübefehl Fixierung aller Felder aufheben

Verhalten in der .accdb-Version der Datenbank

Wenn wir in der .accdb-Version der Datenbank arbeiten und eine oder mehrere dieser Änderungen vorgenommen haben, können wir das Formular schließen und wieder öffnen und finden alle Einstellungen vor, wie sie zuletzt eingestellt waren. Wenn wir eine solche Änderung vornehmen, stellen wir sogar fest, dass diese Änderungen noch nicht einmal die Rückfrage auslöst, ob Änderungen an diesem Formular gespeichert werden sollen. Selbst nach dem Schließen und erneutem Öffnen der Datenbank finden wir die letzten Einstellungen erneut vor.

Speichern der Datenbank als .accde-Datenbank

Nun wollen wir die Datenbank als .accde-Datenbank speichern und somit in einem Format, das keine Änderungen mehr an dem Entwurf der Objekte zulassen sollte.

Dazu klicken wir in Access auf den Reiter Datei und dann auf Speichern unter. Damit blenden wir den Bereich Speichern unter ein, wo wir im rechten Bereich den Befehl ACCDE erstellen vorfinden (siehe Bild 4).

Speichern der Datenbank als .accde-Datenbank

Bild 4: Speichern der Datenbank als .accde-Datenbank

Klicken wir diesen doppelt an, erscheint ein Dialog, mit dem wir den Namen für die zu erstellende Datei angeben können. Access schlägt hierzu den gleichen Dateinamen vor, allerdings mit der Dateiendung .accde. Diesen Dateinamen behalten wir bei und speichern die neue Datei.

Experimente mit der .accde-Version

Nun öffnen wir die Datenbank in der .accde-Version. Das Formular frmMitarbeiterUebersicht erscheint genauso wie in der .accdb-Version. Dass es sich überhaupt um die .accde-Version handelt, können wir leicht feststellen, indem wir versuchen, die Entwurfsansicht des Formulars anzuzeigen. Dies gelingt nicht, weil die entsprechende Schaltfläche im Formular gar nicht verfügbar ist (siehe Bild 5).

In der .accde-Version kann die Entwurfsansicht nicht mehr geöffnet werden.

Bild 5: In der .accde-Version kann die Entwurfsansicht nicht mehr geöffnet werden.

Nun nehmen wir einige Änderungen vor – wir ändern die Reihenfolge der Spalten, passen ihre Breite an, blenden eine Spalte aus und fixieren eine am linken Rand.

Das gelingt alles ohne Probleme. Wenn wir das Formular jedoch schließen und erneut öffnen, finden wir genau die gleiche Ansicht vor, wie wir sie in der Originaldatenbank im .accdb-Format vor dem Erstellen der .accde-Datenbank eingestellt hatten.

Spalteneinstellungen manuell speichern und wiederherstellen

Was nun? Zum Glück können wir die Eigenschaften der Spalten der Datenblattansicht per VBA auslesen.

Das bedeutet, dass wir sie auch wiederherstellen können. Alles, was wir benötigen, ist eine Tabelle, in der wir die Einstellungen speichern können, während das Formular oder die Anwendung geschlossen werden, und aus der wir die Einstellungen wieder auslesen und wiederherstellen können.

Ermitteln der Spalteneinstellungen des Formulars

Wir starten mit dem Auslesen der Einstellungen der Spalten des Formulars. Dazu öffnen wir zunächst wieder die .accdb-Version der Datenbank – in der .accde-Datenbank können wir schließlich erst gar nicht auf den VBA-Code zugreifen.

Spalteneigenschaften unter VBA

Für das Ermitteln der Positionen, Sichtbarkeit und Breite sowie der fixierten Spalten können wir einige VBA-Eigenschaften verwenden.

Fixierte Spalten per VBA ermitteln

Zunächst einmal verwenden wir eine Eigenschaft des Formulars in der Datenblattansicht namens FrozenColumns. Diese liefert uns Informationen darüber, wie viele Spalten fixiert sind. Dabei ist der zurückgegebene Wert etwas irreführend:

  • 1: keine Spalte ist fixiert
  • 2: es ist eine Spalte fixiert
  • 3: es sind zwei Spalten fixiert
  • und so weiter

Beispiel für das Hauptformular frmMitarbeiterUebersicht mit dem Unterformular sfmMitarbeiterUebersicht:

Debug.Print Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht.Form.FrozenColumns

Reihenfolge der Spalten per VBA ermitteln

Zum Ermitteln der Reihenfolge können wir die Eigenschaft ColumnOrder der einzelnen Steuerelemente nutzen. Diese liefert uns für jede Spalte den Index, den die aktuelle Spalte in der Reihenfolge hat. Die linke Spalte liefert den Wert 1, die zweite von links den Wert 2 und so weiter.

Beispiel:

Debug.Print Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnOrder

Spaltenbreiten ermitteln

Die Eigenschaft zum Ermitteln der Spaltenbreite lautet ColumnWidth. Sie liefert die Breite in Twips:

Debug.Print Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnWidth

Sichtbarkeit einer Spalte ermitteln

Schließlich fehlt noch die Sichtbarkeit. Diese ermitteln wir im Gegensatz zu Steuerelementen in Formularen in der Formularansicht nicht mit der Visible-Eigenschaft, sondern mit der Eigenschaft ColumnHidden. Sie liefert den Wert False, wenn das Steuerelement sichtbar ist, und True, falls es ausgeblendet ist.

Beispiel:

Debug.Print Forms!frmMitarbeiterUebersicht! sfmMitarbeiterUebersicht!cboAnredeID.ColumnHidden

Keine Steuerelementeigenschaften

Die Eigenschaften ColumnOrder, ColumnWidth und ColumnHidden sind keine allgemeinen Eigenschaften von Steuerelementen, werden also von IntelliSense nicht angezeigt, wenn wir über den Typ Control darauf zugreifen wollen.

Wir finden die Eigenschaften erst für explizit angegebene Steuerelementtypen, die wir beispielsweise im Objektkatalog sehen (siehe Bild 6).

Die Spalteneigenschaften im Objektkatalog

Bild 6: Die Spalteneigenschaften im Objektkatalog

Wir können diese aber auch über den Datentyp Control nutzen, vorausgesetzt das referenzierte Steuerelement verfügt über die entsprechende Eigenschaft. Bei Beschriftungsfeldern ist das beispielsweise nicht der Fall.

Durchlaufen der Spalten und Ermitteln der Eigenschaften

In der Prozedur aus Listing 1 geben wir zunächst einmal alle Eigenschaften der gebundenen Steuerelemente des Unterformulars sfmMitarbeiterUebersicht aus.

Public Sub DatenblattAuslesen()
     Dim frm As Form
     Dim sfm As Form
     Dim ctl As Control
     Dim strControlSource As String
     Set frm = Forms!frmMitarbeiterUebersicht
     Set sfm = frm!sfmMitarbeiterUebersicht.Form
     Debug.Print "Fixierte Spalte: " & sfm.FrozenColumns
     For Each ctl In sfm.Controls
         strControlSource = ""
         On Error Resume Next
         strControlSource = ctl.ControlSource
         On Error GoTo 0
         If Not Len(strControlSource) = 0 Then
             Debug.Print strControlSource, ctl.ColumnHidden, ctl.ColumnWidth, ctl.ColumnOrder
         End If
     Next ctl
End Sub

Listing 1: Auslesen der Spalteneigenschaften für die Steuerelemente unseres Beispielformulars

Dabei referenzieren wir mit der Variablen frm das Hauptformular frmMitarbeiterUebersicht und mit sfm das im Unterformularsteuerelement sfmMitarbeiterUebersicht enthaltene Formular.

Bevor wir die Steuerelemente durchlaufen, geben wir die Eigenschaft FrozenColumns des Unterformulars aus. Dann durchlaufen wir alle Steuerelemente der Auflistung Controls des Unterformulars und referenzieren diese jeweils mit der Variablen ctl mit dem Datentyp Control.

In der Schleife prüfen wir, ob es sich bei dem aktuellen Steuerelement um ein gebundenes Steuerelement handelt.

Das ist nötig, weil dieses ja auch Bezeichnungsfelder enthält. Dazu versuchen wir bei deaktivierter Fehlerbehandlung, den Wert der Eigenschaft ControlSource (Steuerelementinhalt) auszulesen und speichern diesen in der Variablen strControlSource.

Ist strControlSource dann nicht leer, handelt es sich um ein gebundenes Steuerelement. Dann geben wir den Namen des Steuerelements und die Werte der Eigenschaften ColumnHidden, ColumnWidth und ColumnOrder im Direktbereich des VBA-Editors aus. Das Ergebnis für ein Datenblatt mit einigen Anpassungen sieht wie in Bild 7 aus.

Ausgabe der Spalteneigenschaften im Direktbereich des VBA-Editors

Bild 7: Ausgabe der Spalteneigenschaften im Direktbereich des VBA-Editors

Felder fixieren ändert gegebenenfalls Reihenfolge

Es fehlt noch ein Hinweis darauf, dass wir mit dem Fixieren von Spalten eventuell die Reihenfolge der Spalten ändern. Das ist der Fall, wenn wir nicht ausschließlich Spalten am linken Rand fixieren wollen.

Wenn wir beispielsweise nur die zweite Spalte von links fixieren wollen, wird diese ganz nach links verschoben und fixiert.

Tabelle zum Speichern vorbereiten

Wenn wir in einer .accde-Datenbank die vom Benutzer eingestellten Spalteneigenschaften speichern und später wieder herstellen wollen, benötigen wir eine Tabelle, um die Informationen zu speichern. Diese soll zumindest einmal für jede Spalte die Position, die Breite und die Sichtbarkeit aufnehmen.

Außerdem wollen wir die Information über die Fixierung von Spalten sichern. Dies ist aber eine Information, die wir für das Formular speichern, in dem sich die Spalten befinden.

Wir wollen die Daten allerdings nicht nur für ein Formular speichern können, sondern gegebenenfalls auch für mehrere. Deshalb müssen wir auch noch Informationen über das betroffene Formular und natürlich auch noch die Steuerelementnamen sichern.

Damit wir die Anzahl der fixierten Spalten nicht mehrfach speichern müssen, legen wir zwei Tabellen an:

  • Die erste speichert den Namen des Formulars und die Anzahl der fixierten Spalten.
  • Die zweite referenziert den entsprechenden Datensatz der ersten Tabelle und die Werte für die Eigenschaften ColumnWidth, ColumnOrder und ColumnHidden.

Die Tabelle tblColumnsForms enthält ein Primärschlüsselfeld namens FormID sowie ein Feld für den Formularnamen (Formname) und die Anzahl der fixierten Spalten (FrozenColumns) – siehe Bild 8.

Tabelle für die Formulare

Bild 8: Tabelle für die Formulare

Die Tabelle tblColumnsProperties sieht wie in Bild 9 aus. Hier finden wir neben dem Primärschlüsselfeld ColumnID das Fremdschlüsselfeld FormID, mit dem das Formular festgelegt wird, in dem sich das Steuerelement befindet. Den Namen des Steuerelements speichern wir im Feld Controlname.

Tabelle mit den Spalten

Bild 9: Tabelle mit den Spalten

Außerdem speichern wir in den Feldern ColumnWidth, ColumnOrder und ColumnHidden die jeweiligen Eigenschaftswerte.

Für die beiden Felder FormID und Controlname legen wir einen eindeutigen Index fest, damit jedes Steuerelement nur einmal für jedes Formular angelegt werden kann.

Für die Beziehung zwischen den beiden Tabellen stellen wir die Löschweitergabe auf Ja ein. Damit sorgen wir dafür, dass wir beim Speichern der Daten für ein Formular direkt die kompletten Daten der beiden Tabellen nur durch das Löschen des entsprechenden Datensatzes der Tabelle tblColumnsForms entfernen können (siehe Bild 10).

Beziehung zwischen den Tabellen

Bild 10: Beziehung zwischen den Tabellen

Schreiben der Spalteneigenschaften in die Tabellen

Um die Tabellen zu füllen, erstellen wir eine neue, erweiterte Version der zuvor verwendeten Prozedur namens SaveColumnConfiguration (siehe Listing 2). Sie beginnt wie die vorherige Version, löscht dann aber zunächst die Daten der Tabelle tblColumnsForms und somit auch die Daten der Tabelle tblColumnsProperties.

Public Sub SaveColumnConfiguration()
     Dim db As DAO.Database
     Dim frm As Form
     Dim sfm As Form
     Dim ctl As Control
     Dim strControlSource As String
     Dim lngFormID As Long
     
     Set db = CurrentDb
     Set frm = Forms!frmMitarbeiterUebersicht
     Set sfm = frm!sfmMitarbeiterUebersicht.Form
     
     db.Execute "DELETE FROM tblColumnsForms WHERE Formname = ''" & sfm.Name & "''", dbFailOnError
     db.Execute "INSERT INTO tblColumnsForms(Formname, FrozenColumns) VALUES(''" & sfm.Name & "'', " & sfm.FrozenColumns _
         & ")", dbFailOnError
     lngFormID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
     
     For Each ctl In sfm.Controls
         strControlSource = ""
         On Error Resume Next
         strControlSource = ctl.ControlSource
         On Error GoTo 0
         If Not Len(strControlSource) = 0 Then
             db.Execute "INSERT INTO tblColumnsProperties(FormID, Controlname, ColumnWidth, ColumnOrder, " _
                 & "ColumnHidden) VALUES(" & lngFormID & ", ''" & ctl.Name & "'', " & ctl.ColumnWidth & ", " _
                 & ctl.ColumnOrder & ", " & CInt(ctl.ColumnHidden) & ")", dbFailOnError
         End If
     Next ctl
End Sub

Listing 2: Schreiben der Spalteneigenschaften in die beiden Tabellen tblColumnsForms und tblColumnsProperties

Dann legt sie einen neuen Datensatz in der Tabelle tblColumnsForms an und trägt dort den Namen des Formulars ein. Anschließend liest sie den Primärschlüsselwert des neu angelegten Datensatzes in die Variable lngFormID ein.

Nun durchläuft sie wie zuvor die Schleife über alle Steuerelemente und ermittelt darunter die gebundenen Steuerelemente. Für diese schreibt sie die ID des dazugehörenden Formulars aus der Tabelle tblColumnsForms, den Steuerelementnamen, die Spaltenbreite, die Spaltenposition und die Sichtbarkeit in die Felder der Tabelle tblColumnsProperties.

Das Ergebnis sehen wir in Bild 11. Für das Formular landet ein Datensatz in der Tabelle tblColumnsForms, für jedes Steuerelement einer in der Tabelle tblColumnsProperties. Damit sind wir soweit, dass wir nur noch die Konfiguration zurück in das Formular schreiben müssen.

Daten der Tabellen mit den Spalteneigenschaften

Bild 11: Daten der Tabellen mit den Spalteneigenschaften

Zuvor passen wir unsere Prozedur noch leicht an, sodass sie mit der Version aus der Beispieldatenbank übereinstimmt.

Dazu entfernen wir die Deklaration der Formulare (frm, sfm) sowie die Zuweisung dieser Elemente aus der Prozedur SaveColumnConfiguration und fügen der Prozedur einen Parameter namens sfm als Parameter zur Kopfzeile hinzu:

Public Sub SaveColumnConfiguration(sfm As Form)
...

Den Aufruf zum Testen können wir nun wie folgt in einer eigenen Prozedur hinterlegen:

Public Sub Test_SaveColumnConfiguration()
     Dim frm As Form
     Dim sfm As Form
     Set frm = Forms!frmMitarbeiterUebersicht
     Set sfm = frm!sfmMitarbeiterUebersicht.Form
     SaveColumnConfiguration sfm
End Sub

In dem Formular, dessen Konfiguration wir speichern wollen, nehmen wir keine Änderungen vor – wohl aber im Unterformular. Hier legen wir eine Prozedur für das Ereignis Beim Entladen an und füllen sie mit dem folgenden Code:

Private Sub Form_Unload(Cancel As Integer)
     SaveColumnConfiguration Me
End Sub

Damit wird beim Schließen des Formulars die Konfiguration der Spalten des Datenblatts gespeichert.

Konfiguration beim Laden des Formulars auslesen

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.

Der Grund dafür ist, dass wir auf die Eigenschaft FrozenColumns nur lesend, aber nicht schreibend zugreifen können. Das bedeutet, dass wir zwar ermitteln können, wie viele Spalten von links aus fixiert wurden, aber wir können diesen Wert für ein neu geöffnetes Formular über diese Eigenschaft nicht wiederherstellen.

Allerdings gibt es die Möglichkeit, dies über die Benutzeroberfläche zu erledigen – zum Beispiel wie weiter oben gezeigt über den Befehl Spalten fixieren des Kontextmenüs der Spaltenköpfe des Formulars. Auch finden wir hier einen Befehl namens Fixierung aller Spalten aufheben. Und wenn es die Möglichkeit gibt, eine Aktion über die Benutzeroberfläche durchzuführen, finden wir in der Regel auch eine entsprechende Konstante für die Methode Application.RunCommand.

Da wir wissen, dass die Eigenschaft zum Fixieren von Spalten FrozenColumns heißt, suchen wir einmal im Objektkatalog des VBA-Editors nach Begriffen wie Frozen oder Freeze. Die Suche ist schnell von Erfolg gekrönt, wie Bild 12 zeigt.

Suchen von RunCommand-Konstanten im Objektkatalog

Bild 12: Suchen von RunCommand-Konstanten im Objektkatalog

Nun gestaltet es sich allerdings wesentlich umständlicher als mit der Eigenschaft FrozenColumns, damit die fixierten Spalten wiederherzustellen. Wir können damit nämlich immer nur eine Spalte gleichzeitig fixieren. Immerhin können wir so von links nach rechts die Anzahl Spalten fixieren, die wir auch in der Konfigurationstabelle gespeichert haben.

So setzen wir nacheinander den Fokus auf die jeweils zu den fixierten Spalten hinzuzufügende Spalte und fixieren diese. Wie das geht, schauen wir uns gleich an.

Die Prozedur LoadColumnConfiguration haben wir direkt so aufgebaut wie die Prozedur SaveColumnConfiguration. Wir übergeben dieser einen Verweis auf das Formular, das die entsprechende Datenblattansicht anzeigt (siehe Listing 3).

Public Sub LoadColumnConfiguration(sfm As Form)
     Dim db As DAO.Database
     Dim rstForm As DAO.Recordset
     Dim rstColumns As DAO.Recordset
     Dim strFormname As String
     Dim lngFormID As Long
     Dim strControlSource As String
     Dim ctl As Control
     Dim bolFokusGesetzt As Boolean
     
     For Each ctl In sfm.Controls
         strControlSource = ""
         On Error Resume Next
         strControlSource = ctl.ControlSource
         On Error GoTo 0
         If Not Len(strControlSource) = 0 Then
             Debug.Print ctl.Name
             ctl.ColumnHidden = False
             If bolFokusGesetzt = False Then
                 ctl.SetFocus
                 bolFokusGesetzt = True
             End If
         End If
     Next ctl
     RunCommand acCmdUnfreezeAllColumns
     strFormname = sfm.Name
     Set db = CurrentDb
     Set rstForm = db.OpenRecordset("SELECT * FROM tblColumnsForms WHERE Formname = ''" & strFormname & "''", _
         dbOpenDynaset)
     lngFormID = rstForm!FormID
     Set rstColumns = db.OpenRecordset("SELECT * FROM tblColumnsProperties WHERE FormID = " & lngFormID _
         & " ORDER BY ColumnOrder ASC", dbOpenDynaset)
     
     Do While Not rstColumns.EOF
         With sfm.Controls(rstColumns!ControlName)
             .ColumnOrder = rstColumns!ColumnOrder
             .ColumnWidth = rstColumns!ColumnWidth
             If rstColumns!ColumnOrder < rstForm!FrozenColumns Then
                 .SetFocus
                 RunCommand acCmdFreezeColumn
             End If
             .ColumnHidden = rstColumns!ColumnHidden
         End With
         rstColumns.MoveNext
     Loop
End Sub

Listing 3: Schreiben der Spalteneinstellungen aus den Tabellen in die Steuerelemente

Damit können wir diese beim Laden des Unterformulars wie in der folgenden Ereignisprozedur aufrufen und mit dem Schlüsselwort Me einen entsprechenden Verweis übergeben:

Private Sub Form_Load()
     LoadColumnConfiguration Me
End Sub

Die Prozedur selbst erledigt mehrere Aufgaben. Die erste ist, alle Spalten des Formulars sichtbar zu machen. Dazu durchlaufen wir alle Steuerelemente in einer For Each-Schleife über die Auflistung sfm.Controls.

Hier ermitteln wir wieder, ob es sich bei dem aktuellen Steuerelement um ein gebundenes Steuerelement handelt. Falls ja, stellen wir die Eigenschaft ColumnHidden auf False ein und blenden die Spalte somit ein.

Außerdem wollen wir in diesem Durchlauf dafür sorgen, dass die erste Spalte den Fokus erhält. Dazu haben wir eine Variable namens bolFokusGesetzt erstellt, die zunächst den Wert False enthält. Sobald wir das erste Mal den Fokus gesetzt haben, in diesem Fall für die erste Spalte, wird bolFokusGesetzt auf True eingestellt, sodass der Fokus auf der ersten Spalte verbleibt.

Nachdem so alle Spalten sichtbar gemacht wurden, entfernen wir auch noch die aktuelle Fixierung, indem wir die Methode RunCommand mit dem Parameter acCmdUnfreezeAllColumns aufrufen. Dazu muss mindestens eine Spalte den Fokus haben, daher haben wir diese vorher auf die erste Spalte gesetzt.

Danach kümmern wir uns um die eigentliche Wiederherstellung der Konfiguration. Hier tragen wir zunächst den Namen des Formulars in die Variable strFormname ein und erstellen ein Recordset auf Basis der Tabelle tblColumnsForms, der den Datensatz enthält, der sich auf dieses Formular bezieht. Aus dieser Tabelle lesen wir den Primärschlüsselwert aus und speichern ihn in der Variablen lngFormID.

Dann erstellen wir ein zweites Recordset namens rstColumns, diesmal auf Basis der Tabelle tblColumnsProperties. Diese filtern wir in dem Recordset nach dem Primärschlüsselwert des verknüpften Datensatzes der Tabelle tblColumnsForms und sortieren die Daten nach dem Wert des Feldes ColumnOrder.

Auf diese Weise können wir die Spalten in der folgenden Do While-Schleife gleich in der Reihenfolge durchlaufen, in welcher die Spalten von links nach rechts angeordnet werden sollen.

Wir referenzieren das aktuell anzupassende Steuerelement mit sfm.Controls(rstColumns!ControlName). Dann stellen wir zunächst den Wert der Eigenschaft ColumnOrder auf den Wert des Feldes ColumnOrder des Recordsets ein. Wenn sich dieses Feld zuvor an einer anderen, weiter hinten liegenden Position befand, werden die Werte der Eigenschaft ColumnOrder für alle Felder, die dadurch nach rechts verschoben werden, um 1 erhöht.

Danach stellen wir die Werte der Eigenschaft ColumnWidth wieder her.

Und damit kommen wir zum spannenden Teil dieser Prozedur: Wie sorgen wir dafür, dass die ersten n Spalten von links als fixierte Spalten markiert werden?

Dazu prüfen wir in einer If…Then-Bedingung, ob der aktuelle Wert von rstColumns!ColumnOrder kleiner ist als der Wert des Feldes FrozenColumn des Recordsets rstForm.

Wenn die ersten beiden Spalten fixiert waren, lautet dieser Wert beispielsweise 3. Dann fixieren wir so viele Spalten, bis die Anzahl der Spalten gleich 3 ist – diese Spalte wird dann nicht mehr fixiert.

Wir setzen den Fokus auf die aktuelle Spalte und rufen dann die Methode RunCommand mit dem Parameter acCmdFreezeColumn auf.

Schließlich stellen wir noch die Eigenschaft ColumnHidden auf den Wert des entsprechenden Feldes des Recordsets rstColumns ein. Auf diese Weise passen wir alle Spalten an die in den Tabellen gespeicherten Konfigurationen an.

Testen der Funktion in einer .accde-Datenbank

Nun speichern wir die aktuelle Datenbank im Format .accde und starten diese. Hier stellen wir fest, dass alle zuvor geänderten Einstellungen wiederhergestellt wurden.

Wenn wir nun einige Einstellungen ändern und das Formular schließen und erneut öffnen, finden wir die Einstellungen unverändert vor. Das Gleiche geschieht, wenn wir die vollständige Datenbank schließen und erneut öffnen – alle Einstellungen werden wiederhergestellt.

Zusammenfassung und Ausblick

In .accde-Datenbanken werden die vom Benutzer vorgenommenen Einstellungen an den Spalten der Datenblattansicht nicht gespeichert. Eventuelle Änderungen, die der Benutzer für eine ergonomischere Arbeitsweise mit den jeweiligen Daten vorgenommen hat, muss er bei jedem Öffnen des Formulars manuell wiederherstellen.

Diese Arbeit wollen wir dem Benutzer ersparen und haben dazu in diesem Beitrag zwei Prozeduren erarbeitet, mit denen wir zunächst die aktuelle, vom Benutzer vorgenommene Konfiguration beim Schließen des Formulars mit der Datenblattansicht in zwei Tabellen speichern.

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.

Einbau in eigene Anwendungen

Wenn Sie diese Funktionen in eigenen Anwendungen nutzen wollen, sind nur wenige Schritte zu erledigen:

  • Fügen Sie die beiden Tabellen tblColumnsForms und tblColumnsProperties in die Zieldatenbank ein.
  • Fügen Sie außerdem das Modul mdlDatenblattkonfiguration in die Datenbank ein.
  • Stellen Sie für das Formular, das die Datenblattansicht anzeigt, die beiden Eigenschaften Beim Laden und Beim Entladen auf [Ereignisprozedur] ein und hinterlegen Sie dafür die folgenden Prozeduren:
Private Sub Form_Load()
     LoadColumnConfiguration Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
     SaveColumnConfiguration Me
End Sub

Downloads zu diesem Beitrag

Enthaltene Beispieldateien:

DatenblattInDerACCDE.accdb

DatenblattInDerACCDE.accde

Download

Schreibe einen Kommentar