Datenblattmarkierungen

Wenn Sie Formular in der Datenblattansicht anzeigen, bietet die Benutzeroberfläche von Access bereits alles Nötige, um damit zu arbeiten. Alles Nötige Nein: Es gibt noch eine Reihe Dinge, die Sie mit dem Datenblatt anstellen können – zum Beispiel das Auslesen oder Einstellen von Markierungen. Dieser Beitrag zeigt, wie Sie die aktuell markierten Zellen im Datenblatt ermitteln und diese nach Ihren Wünschen einstellen. Außerdem packen wir die dazu notwendige Funktionalität in eine wiederverwendbare Klasse.

Datenblatt im Formular

Das Anlegen eines Formular, das seine Daten in der Datenblattansicht anzeigt, gelingt schnell: Sie brauchen lediglich ein neues Formular anzulegen, die gewünschte Tabelle oder Abfrage als Datenherkunft festzulegen, alle benötigten Felder aus der Feldliste in den Detailbereich des Formularentwurfs zu ziehen und als Standardansicht den Wert Datenblatt auszuwählen – schon liefert das Formular beim erneuten öffnen die ersehnte Ansicht.

In Bild 1 landen beispielsweise gerade die Felder der Tabelle tblArtikel im Detailbereich. Im Gegensatz zur Formular- oder Endlosansicht können Sie neben den Zeilen und Spalten keine weiteren Elemente wie eine OK-Schaltfläche im Formular unterbringen, weshalb ein Formular in der Datenblattansicht üblicherweise als Unterformular in einem weiteren Formular landet, welches die benötigten Steuerelemente enthält (s. Bild 2).

Hinzufügen der Felder für die Datenblattansicht

Bild 1: Hinzufügen der Felder für die Datenblattansicht

Datenblatt als Unterformular

Bild 2: Datenblatt als Unterformular

Markierungsarten

Die Datenblattansicht bietet gleich eine ganze Reihe von Möglichkeiten, um bestimmte Bereiche mit der Maus zu markieren:

  • Markieren eines einzelnen Feldes durch Anklicken des Feldes
  • Markieren einer kompletten Zeile durch Anklicken des Zeilenkopfes/Datensatzmarkierers
  • Markieren einer kompletten Spalte durch Anklicken des Spaltenkopfes
  • Markieren mehrerer zusammenhängender Zeilen durch Anklicken des ersten Zeilenkopfes und Ziehen der Maus bis zum Zeilenkopf der letzten zu markierenden Zeile oder durch Anklicken des ersten Zeilenkopfes und Anklicken des letzten Zeilenkopfes bei gedrückter Umschalttaste
  • Markieren mehrere zusammenhängender Spalten durch Anklicken des ersten Spaltenkopfes und Ziehen der Maus bis zum Spaltenkopf der letzten zu markierenden Spalte oder durch Anklicken des ersten Spaltenkopfes und Anklicken des letzten Spaltenkopfes bei gedrückter Umschalttaste
  • Markieren mehrere nebeneinanderliegender oder übereinanderliegender Zellen durch Anklicken der ersten Zelle und dann bei gedrückter Umschalttaste Anklicken der letzten Zelle
  • Markieren einer Matrix von Zellen, erfolgt ebenfalls durch das Markieren der ersten und der letzten Zelle bei gedrückter Umschalttaste

Aktuelle Markierung ermitteln

Nun möchten wir ermitteln, welche Zellen der Benutzer markiert hat. Dazu verwenden Sie vier Eigenschaften des Formulars:

  • SelLeft: Index der Spalte des ersten markierten Elements
  • SelWidth: Anzahl der markierten Spalten
  • SelTop: Index der Zeile des ersten markierten Elements
  • SelHeight: Anzahl der markierten Spalten

Für ein paar Experimente haben wir dem Hauptformular frmArtikel vier Textfelder namens txtSelLeft, txtSelWidth, txtSelTop und txtSelHeight hinzugefügt (s. Bild 3). Die Schaltfläche cmdAktualisieren liest per Mausklick die Koordinaten der aktuellen Markierung im Unterformular ein und schreibt diese in die entsprechenden Textfelder (s. Listing 1).

Ermitteln der Koordinaten der aktuellen Markierung

Bild 3: Ermitteln der Koordinaten der aktuellen Markierung

Aber was ist das Die beiden Felder txtSelWidth und txtSelHeight zeigen immer den Wert 0 an Dies liegt daran, dass die Markierung beim Anklicken der Schaltfläche cmdAktualisieren entfernt wird und nur noch die Einfügemarke in der oberen linken Zelle der Markierung verbleibt. Was tun Wir müssen die Markierung ermitteln, ohne dass diese gelöscht wird.

Markierung direkt ermitteln

Um die Markierung direkt beim Festlegen zu ermitteln, müssen wir einen geeigneten Zeitpunkt abpassen oder noch besser ein passendes Ereignis. Wir verwenden das Ereignis Bei Maustaste auf, das beim Loslassen der Maustaste ausgelöst wird. Aber für welches Objekt legen wir dieses Ereignis fest Probieren wir es doch zunächst mit dem Unterformular selbst aus. Legen Sie also für das Unterformular sfmArtikel den Wert [Ereignisprozedur] für die Eigenschaft Bei Maustaste auf an, klicken Sie auf die Schaltfläche mit den drei Punkten und legen Sie die Ereignisprozedur aus Listing 2 an.

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
     With Me
         .Parent.txtSelLeft = .SelLeft
         .Parent.txtSelWidth = .SelWidth
         .Parent.txtSelTop = .SelTop
         .Parent.txtSelHeight = .SelHeight
     End With
End Sub

Listing 2: Auslesen der Markierung beim Ereignis Bei Maustaste auf des Formulars in der Datenblattansicht

Dies funktioniert – zumindest schon einmal für das komplett markierte Datenblatt (s. Bild 4). Eine Frage bleibt allerdings noch: Warum liefert SelLeft immer den Wert 2 – und welche ist die erste Spalte im Datenblatt Wir konnten keine Antwort auf diese Frage finden – selbst die Onlinehilfe schweigt sich darüber aus und gibt stattdessen an, dass SelLeft einen Wert zwischen 1 und der Spaltenanzahl des Datenblattes liefert.

Die komplette Markierung wird gleich nach dem Loslassen der Maustaste angezeigt.

Bild 4: Die komplette Markierung wird gleich nach dem Loslassen der Maustaste angezeigt.

Und warum liefert die Eigenschaft SelHeight den Wert 78, obwohl das Datenblatt nur 77 Datensätze anzeigt Diese Antwort fällt leichter: Weil die zugrunde liegende Tabelle/Abfrage aktualisierbar ist und daher immer ein neuer, leerer Datensatz im Datenblatt angezeigt und auch als Datensatz mitgezählt wird.

Zellengenaue Markierung einlesen

Fehlt noch die Möglichkeit, auch die Markierung einzulesen, wenn der Benutzer beispielsweise zwei Zellen mitten in der Tabelle markiert oder eine Matrix von vier mal vier Zellen.

Wir können den Lösungsansatz von oben übernehmen: Es gelingt ganz einfach mit einer Prozedur, die durch das Ereignis Bei Maustaste auf ausgelöst wird. Allerdings müssten wir dieses nun für alle Steuerelemente anlegen.

Probieren wir es doch zunächst einmal für das erste Textfeld ArtikelID. Legen Sie das Ereignisprozedur über das Eigenschaftsfenster an (s. Bild 5).

Anlegen des Bei Maustaste auf-Ereignisses für ein Textfeld des Datenblatts

Bild 5: Anlegen des Bei Maustaste auf-Ereignisses für ein Textfeld des Datenblatts

Dann füllen Sie die entstandene Prozedur wie in Listing 3. Dies funktioniert – allerdings müssten wir nun für zehn verschiedene Steuerelemente (in diesem Beispiel – gegebenenfalls sogar noch mehr) die gleiche Ereignisprozedur anlegen. Das können Sie nun tun – aber wenn Sie die Funktionalität auch noch in weiteren Formularen nutzen möchten, müssen Sie diesen Vorgang jedes Mal wiederholen.

Private Sub ArtikelID_MouseUp(Button As Integer, Shift As Integer, X As Single, _
         Y As Single)
     With Me
         .Parent.txtSelLeft = .SelLeft
         .Parent.txtSelWidth = .SelWidth
         .Parent.txtSelTop = .SelTop
         .Parent.txtSelHeight = .SelHeight
     End With
End Sub

Listing 3: Auslesen der Datenblattmarkierung nach dem Anklicken eines der Elemente der Spalte ArtikelID.

Markierung mit Klasse

Also bauen wir uns zwei Klassenmodule, in die wir die Funktionalität kapseln. Wir wollen dann vom Hauptformular aus nur noch wenige Zeilen Code schreiben, um ständig an die Markierung im Datenblatt zu kommen – und außerdem ganz einfach auf die Koordinaten der Markierungen zugreifen können.

Das Beispiel zum Einbau dieser Klasse finden Sie in den beiden Formularen frmArtikel_Klasse und sfmArtikel_Klasse. Für das Hauptformular müssen Sie ohnehin ein Klassenmodul anlegen, für das Unterformular auch – anderenfalls kann die Klasse nicht die Ereignisse des Unterformulars und der enthaltenen Steuerelemente nutzen.

Einbau in Haupt- und Unterformular

Um die beiden Klassen zu integrieren, benötigen Sie zunächst eine Objektvariable, welche den Verweis auf das Objekt auf Basis der Klasse clsDatasheetSelectionForm speichert.

Die Klasse stellt ein Ereignis bereit, das beim ändern der Markierung ausgelöst wird – also müssen wir die Objektvariable mit dem Schlüsselwort WithEvents deklarieren:

Dim WithEvents objDatasheetSelection  As clsDatasheetSelectionForm

Als nächstes sorgen Sie dafür, dass die Klasse instanziert wird und erfährt, für welches Formular es die änderungen der Datenblattmarkierung überprüfen und gegebenenfalls Ereignisse auslösen soll.

Dies erledigen Sie in der durch das Ereignis Beim Laden des Hauptformulars ausgelösten Prozedur aus Listing 4.

Private Sub Form_Load()
     Set objDatasheetSelection = New clsDatasheetSelectionForm
     With objDatasheetSelection
         Set .Form = Me!sfmArtikel_Klasse.Form
     End With
End Sub

Listing 4: Instanzieren und füllen der Klasse zum überwachen der Markierung des Datenblatts

Nun haben wir von einem Ereignis gesprochen, dass die Klasse clsDatasheetSelectionForm bereitstellt. Dieses fügen Sie zum Klassenmodul des Formulars hinzu, indem Sie im linken Kombinationsfeld des Codefensters des Klassenmoduls den Eintrag objDatasheetSelection auswählen und rechts den Namen der zu implementierenden Ereignisprozedur, hier SelectionChanged (s. Bild 6).

Anlegen des einzigen Ereignisses des Objekts objDatasheetSelection

Bild 6: Anlegen des einzigen Ereignisses des Objekts objDatasheetSelection

Die dadurch angelegte Ereignisprozedur, die mit den Parametern intSelLeft, intSelWidth, intSelTop und intSelHeight die Position und die Höhe und Breite der Markierung zurückliefert, füllen Sie für dieses Beispiel mit den vier Anweisungen aus Listing 5. Die Anweisungen füllen die Textfelder des Formulars mit den Markierungskoordinaten.

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

Schreibe einen Kommentar