Spalten zweier Datenblätter synchronisieren

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Im Beitrag “Neue Datensätze oben anfügen” haben wir uns angesehen, wie Sie ein Unterformular in der Datenblattansicht, das nur einen leeren, neuen Datensatz anzeigt, über einem normalen Datenblatt mit den Daten der gleichen Tabelle platzieren. Damit erhält der Benutzer die Möglichkeit, einen Datensatz oben einzufügen und nicht, wie sonst üblich, unten. Das Problem hierbei ist, dass der Benutzer immer noch die Spalten des oberen Formulars anders anordnen oder ihre Breite ändern kann. Das wirkt sich nicht automatisch auf die Spalten des darunter positionierten Formulars aus. Also müssen wir noch ein wenig Arbeit investieren, um dieses Verhalten zu dieser Lösung hinzuzufügen.

Wir rufen uns zuerst noch einmal die Konstellation der Lösung aus dem Beitrag Neue Datensätze oben anfügen (www.access-im-unternehmen/1160) ins Gedächtnis. Hier haben wir ganz oben im Formular frmArtikel ein Unterformular mit geringer Höhe platziert, welches nur die Spaltenköpfe sowie eine einzige Zeile anzeigen soll, die den neuen, leeren Datensatz anzeigt, der sonst unten im Datenblatt angezeigt wird (siehe Bild 1).

Entwurf der beiden übereinander angeordneten Unterformulare in der Datenblattansicht

Bild 1: Entwurf der beiden übereinander angeordneten Unterformulare in der Datenblattansicht

Wenn wir in die Formularansicht wechseln, sehen wir, dass das obere Unterformular genau so platziert ist, dass die Spaltenüberschriften des unteren Unterformulars nicht zu sehen sind. Dadurch erscheint die Ansicht so, als ob es sich tatsächlich nur um ein Formular in der Datenblattansicht handelt, bei dem die Zeile zum Einfügen eines neuen Datensatzes ganz oben angezeigt wird (siehe Bild 2).

Formularansicht der beiden Unterformulare in der Datenblattansicht

Bild 2: Formularansicht der beiden Unterformulare in der Datenblattansicht

Wenn wir nun allerdings die Breiten der Spaltenüberschriften ändern oder deren Anordnung ändern, wirkt sich dies nur auf die Spaltenköpfe selbst und die Zeile mit dem neuen Datensatz im oberen Unterformular aus (siehe Bild 3). Das Verhalten ist ganz normal, denn das untere Unterformular weiß ja nichts vom oberen Unterformular.

Das Anpassen der Spaltenköpfe wirkt sich nicht auf das untere Formular aus.

Bild 3: Das Anpassen der Spaltenköpfe wirkt sich nicht auf das untere Formular aus.

Spalten synchron halten

Wenn wir wollen, dass die Spalten des unteren Unterformulars synchron mit den Spalten des oberen Unterformulars geändert werden, müssen wir die Ereignisse identifizieren, die beim ändern der Spaltenbreiten und beim ändern der Reihenfolge der Spalten ausgelöst werden. Wie finden wir diese heraus

Falls uns kein Ereignis aufgrund seines Namens auffällt, legen wir für die möglichen Ereignisse jeweils eine Ereignisprozedur an und fügen darin entweder eine Debug.Print-Anweisung ein, die den Namen der Ereignisprozedur ausgibt, oder fügen Haltepunkte zu den jeweiligen Prozedurköpfen hinzu.

Hier kommen die folgenden Ereigniseigenschaften in Frage:

  • Beim Klicken
  • Bei Maustaste ab
  • Bei Maustaste auf
  • Bei Mausbewegung

Also hinterlegen wir testweise die folgenden Ereignisprozeduren für die Ereigniseigenschaften:

Private Sub Form_Click()
     Debug.Print "Beim Klicken"
End Sub
Private Sub Form_MouseDown(Button As Integer, _
         Shift As Integer, X As Single, Y As Single)
     Debug.Print "Bei Maustaste ab"
End Sub
Private Sub Form_MouseMove(Button As Integer, _
         Shift As Integer, X As Single, Y As Single)
     If Not Button = 0 Then
         Debug.Print "Bei Mausbewegung"
     End If
End Sub
Private Sub Form_MouseUp(Button As Integer, _
         Shift As Integer, X As Single, Y As Single)
     Debug.Print "Bei Maustaste auf"
End Sub

Hier erkennen wir dann, dass diese Ereignisse immer ausgelöst werden, wenn der Benutzer auf einen der Bereiche mit Ausnahme der Felder zur Eingabe der Daten eine Aktion mit der Maus ausführt – also in den Spaltenköpfen, im Datensatzmarkierer und in dem grauen Bereich links von den Spaltenköpfen und oberhalb des Datensatzmarkierers.

Wann synchronisieren

Bevor nun losprogrammieren, müssen wir noch festlegen, wann die Spalten des unteren Unterformulars an die des oberen Unterformulars angepasst werden sollen. Erledigen wir dies nur, wenn der Benutzer eine Aktion zum Vergrößern oder Verkleinern der Breite oder zum Verschieben einer Spalte durchgeführt hat (also beim Ereignis Bei Maustaste auf) oder immer, wenn der Benutzer die Maus bewegt Wir entscheiden uns zunächst für die erstere Methode. Wenn wir dann tatsächlich die Synchronisierung zu jedem Zeitpunkt ausprobieren wollen, brauchen wir die entsprechenden Anweisungen ja nur noch in das Ereignis Bei Mausbewegung einzufügen.

Der Ereignisprozedur Bei Maustaste auf fügen wir nun den Aufruf der noch zu programmierenden Prozedur SpaltenSynchronisieren hinzu:

Private Sub Form_MouseUp(Button As Integer, _
         Shift As Integer, X As Single, Y As Single)
     SpaltenSynchronisieren
End Sub

Prozedur zum Synchronisieren der Spalten

Die Prozedur zum Synchronisieren der Spalten könnten wir im oberen Unterformular sfmArtikelNeu implementieren. Allerdings müssten wir dann von dort aus das Unterformular, dessen Spalten wir manipulieren wollen, über das übergeordnete Formular referenzieren. Das ist schlechter Programmierstil.

Also programmieren wir diesmal gleich eine Klasse, mit der wir die beiden betroffenen Formulare referenzieren und die wir wiederum im Hauptformular deklarieren und instanzieren. Auf diese Weise haben wir erstens eine sauber programmierte Lösung und zweitens eine Lösung, die wir mit wenigen Zeilen Code in anderen Formularen wiederverwenden können.

Also fügen wir ein Klassenmodul namens clsSpaltenSynchronisieren zum VBA-Projekt hinzu. Dieses erhält zwei private deklarierte Variablen, welche die Verweise auf die beiden betroffenen Unterformulare aufnehmen sollen. Beide Variablen versehen wir mit dem Schlüsselwort With-Events, damit wir für diese auch Ereignisse in der aktuellen Klasse implementieren können:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar