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 des Designs 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).
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.
- Wiedereinblenden von Spalten durch Betätigen des Kontextmenübefehls Felder wieder einblenden und Auswahl der einzublendenden Felder im Dialog Spalten einblenden (siehe Bild 3).
- 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
Bild 2: Ausblenden einer Spalte
Bild 3: Erneutes Einblenden von Spalten
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 öffnenn 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).
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).
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 sind, 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 selbstverständlich 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, wieviele 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, wie wir beispielsweise im Objektkatalog sehen (siehe Bild 6).
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.
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. Diese ist aber eine Information, die wir für das Formular speichern, in dem sich die Spalten befinden.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo