Datenblattspalten in der Runtime

Wenn Sie die Daten einer Tabelle oder Abfrage in einem Formular in der Datenblattansicht anzeigen, können Sie über das Kontextmenü komfortabel damit arbeiten – beispielsweise, um Spalten ein- oder auszublenden. Dieses Kontextmenü fehlt leider komplett, wenn Sie die Runtime-Version von Access verwenden. Der Benutzer hat dann keine Möglichkeit, die Spalten nach seinen eigenen Wünschen ein- oder auszublenden. Dieser Beitrag reicht eine Lösung nach, mit der Sie auch dieses Feature in Runtime-Datenbanken anbieten können.

Wenn Sie in einem Datenblatt in einem Formular beispielsweise mit der rechten Maustaste auf einen der Spaltenköpfe klicken, erscheint das Kontextmenü aus Bild 1.

Dieses Kontextmenü lässt sich in der Runtime-Version von Access nicht blicken.

Bild 1: Dieses Kontextmenü lässt sich in der Runtime-Version von Access nicht blicken.

Wenn Sie die Datenbank dann mit der Runtime-Version von Access öffnen (oder zumindest im Runtime-Modus), fehlen sämtliche Kontextmenüs des Datenblatts.

Das ist unpraktisch, da sich ja damit eine Reihe von Aufgaben gleich an Ort und Stelle erledigen lässt – beispielsweise das Ein- und Ausblenden einzelner Spalten.

Bevor wir uns dies im Detail ansehen, noch der Hinweis, wie Sie die Datenbank im Runtime-Modus öffnen können:

  • Wenn Sie mit Access 2003 oder älter arbeiten, erstellen Sie eine Verknüpfung auf die Access-Datenbank und fügen den Parameter /runtime hinzu.
  • Oder Sie arbeiten mit einer neueren Version von Access – dann können Sie einfach den Dateinamen mit der Endung .accdr versehen und die Datenbank dann im Runtime-Modus öffnen.

Ob Sie die Datenbank im Runtime-Modus öffnen, erkennen Sie beispielsweise daran, dass weder eingebaute Menüs noch Ribbons sichtbar sind.

Spalten ein- und ausblenden

Der Kontextmenübefehl Felder ausblenden für das Kontextmenü einer oder mehrerer markierter Spalten blendet die markierten Spalten einfach aus. Wenn Sie den Menübefehl Felder wieder einblenden auswählen, erscheint der Dialog aus Bild 2, mit dem Sie alle Felder komfortabel ein- oder ausblenden können.

Komfortables Ein- und Ausblenden von Feldern

Bild 2: Komfortables Ein- und Ausblenden von Feldern

Kontextmenü ersetzen

Unsere erste Aufgabe ist es, das bestehende Kontextmenü zu ersetzen beziehungsweise in der Runtime-Version von Access überhaupt ein Kontextmenü anzuzeigen, wenn der Benutzer mit der rechten Maustaste auf die Spaltenköpfe der Datenblattansicht klickt.

Dazu benötigen wir zunächst einmal einen Verweis auf die Bibliothek Microsoft Office x.0 Object Library. Diesen fügen Sie über den Dialog aus Bild 3 hinzu, den Sie vom VBA-Editor aus mit dem Menü-befehl Extras|Verweise öffnen. Mit diesem fügen Sie dem VBA-Projekt die CommandBars-Auflistung und weitere gleich benötigte Elemente hinzu.

Hinzufügen eines Verweises auf die Office-Bibliothek

Bild 3: Hinzufügen eines Verweises auf die Office-Bibliothek

Benutzerdefinierte Kontextmenüs werden per VBA zusammengestellt und mit der Methode ShowPopup des entsprechenden CommandBar-Elements angezeigt.

In welcher Ereignisprozedur des Formulars aber lösen wir diese Aktionen aus Die Lösung ist das Ereignis Bei Maustaste ab des Formulars selbst. öffnen Sie das Formular in der Entwurfsansicht, wählen Sie im Eigenschaftsfenster den Eintrag Formular aus und selektieren dann den Wert [Ereignisprozedur] für die Eigenschaft Bei Maustaste ab. Klicken Sie dann auf die Schaltfläche mit den drei Punkten (…) rechts von der Eigenschaft, um die entsprechende Prozedur im VBA-Editor anzulegen (s. Bild 4).

Ereignis, das beim Drücken der Maustaste ausgelöst wird

Bild 4: Ereignis, das beim Drücken der Maustaste ausgelöst wird

Diese Prozedur füllen Sie wie in Listing 1. Die Prozedur deklariert je eine Objektvariable für ein CommandBar– und ein CommandBarButton-Objekt sowie eine Variable, welche den Namen des zu erzeugenden Kontextmenüs speichert (strKontextmenue).

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     Dim cbr As CommandBar
     Dim cbc As CommandBarButton
     Dim strKontextmenue As String
     Select Case Button
         Case 2
             strKontextmenue = "cbrDatenblatt"
             On Error Resume Next
             CommandBars(strKontextmenue).Delete
             On Error GoTo 0
             Set cbr = CommandBars.Add(strKontextmenue, msoBarPopup, False, True)
             Set cbc = cbr.Controls.Add(msoControlButton)
             With cbc
                 .Caption = "Spalten ausblenden"
                 .OnAction = "=SpaltenAusblenden()"
             End With
             Set cbc = cbr.Controls.Add(msoControlButton)
             With cbc
                 .Caption = "Spalten bearbeiten"
                 .OnAction = "=SpaltenDialog()"
             End With
             cbr.ShowPopup
     End Select
End Sub

Listing 1: Anzeigen eines Kontextmenüs für die Spaltenköpfe des Datenblatts

Die Prozedur prüft dann zunächst anhand des Parameters Button, welche Maustaste der Benutzer angeklickt. Wir wollen eine Aktion nur für die rechte Maustaste ausführen, also prüfen wir auf den Wert 2.

In diesem Fall legen wir zunächst den Namen des Kontextmenüs fest (cbrDatenblatt) und speichern diesen in der Variablen strKontextmenue. Dann deaktivieren wir die Fehlerbehandlung und löschen ein eventuell bereits vorhandenes CommandBar-Objekt gleichen Namens.

Die Fehlerbehandlung haben wir ausgeschaltet, damit das Fehlen dieses Kontextmenüs keinen Fehler beim Versuch auslöst, dieses zu löschen.

Nun erstellen wir mit der Add-Methode der CommandBars-Auflistung ein neues CommandBar-Objekt und legen für dieses fest, dass es den in strKontextmenue gespeicherten Namen erhalten, als Kontextmenü angezeigt werden (msoBarPopup) und temporär erstellt werden soll.

Danach folgen bereits die beiden ersten Befehle, mit denen wir das Ausblenden der aktuell markierten Spalten sowie die Anzeige eines Dialogs zum Ein- und Ausblenden aller Spalten realisieren wollen.

Der Erste wird durch ein CommandBarButton-Objekt ausgelöst, das die Beschriftung Spalten ausblenden trägt und beim Anklicken die über die OnAction-Eigenschaft festgelegte VBA-Funktion SpaltenAusblenden aufruft. Auf ähnliche Weise fügen wir die zweite Schaltfläche mit der Beschriftung Spalten bearbeiten und der VBA-Funktion SpaltenDialog hinzu.

Schließlich zeigt die ShopPopup-Methode des mit der Variablen cbr referenzierten CommandBar-Objekts das Kontextmenü an.

Dieses erscheint nun zunächst wie in Bild 5.

Anzeige des Kontextmenüs

Bild 5: Anzeige des Kontextmenüs

Achtung, Fehlerbehandlung außer Betrieb!

An dieser Stelle ist es sehr wichtig, auf die Besonderheit der Fehlerbehandlung nach dem Aufruf von Funktionen über Kontextmenü-Einträge hinzuweisen.

Wenn Sie dazu eine VBA-Funktion verwenden, die für die Eigenschaft OnAction angegeben wird, ist die Fehlerbehandlung in der VBA-Funktion außer Kraft gesetzt. Wenn ein Fehler auftritt, wird einfach der nachfolgende Befehl ausgeführt, und wenn ein Fehler in einer weiteren durch die Funktion aufgerufenen Routine entsteht, wird diese augenblicklich beendet und die aufrufende Funktion fortgesetzt. Sollte also einmal etwas nicht wie erwartet funktionieren, sollten Sie diese Möglichkeit nicht außer Acht lassen.

Spalten ausblenden

Die erste Funktion namens SpaltenAusblenden soll die aktuell markierten Spalten ausblenden. Dazu fügen Sie die Funktion aus Listing 2 zum Klassenmodul des Formulars hinzu.

Public Function SpaltenAusblenden()
     Dim ctl As Control
     Dim strControlsource As String
     Dim fld As DAO.Field
     For Each ctl In Me.Controls
         On Error Resume Next
         strControlsource = ""
         strControlsource = ctl.ControlSource
         On Error GoTo 0
         If Len(strControlsource) > 0 Then
             For Each fld In Me.Recordset.Fields
                 If strControlsource = fld.Name Then
                     If ctl.ColumnOrder >= Me.SelLeft - 1 And ctl.ColumnOrder < Me.SelLeft + Me.SelWidth - 1 Then
                         ctl.ColumnHidden = True
                     End If
                     Exit For
                 End If
             Next fld
         End If
     Next ctl
End Function

Listing 2: Ausblenden der aktuellen Spalten

Die Funktion durchläuft alle Steuerelemente des Formulars in einer For Each-Schleife und referenziert das jeweils aktuelle Steuerelement mit der Variablen ctl. Dann schalten wir die Fehlerbehandlung aus, denn wir wollen, wenn es sich bei dem Steuerelement um ein gebundenes Steuerelement handelt, den Namen des gebundenen Feldes in der Variablen strControlsource speichern. Ist das Steuerelement nicht an ein Feld der Datenherkunft gebunden, löst dies einen Fehler aus, der allerdings nicht angezeigt wird, und strControlsource behält die zuvor zugewiesene leere Zeichenkette (“”).

Ist die Länge der in strControlsource enthaltenen Zeichenkette größer als 0, schaut sich die Funktion das Steuerelement genauer an. Nun muss sie nämlich prüfen, ob es sich tatsächlich um ein Steuerelement handelt, das an eines der Felder der Datenherkunft gebunden ist – es kann ja auch sein, dass das Feld einen berechneten Ausdruck enthält.

Dazu durchläuft die Prozedur in einer For Each-Schleife alle Felder des Recordsets des Formulars und gleicht den Inhalt der Variablen strControlsource mit dem Namen des aktuellen Feldes ab.

Sind beide Werte gleich, erfolgt eine weitere Prüfung – nämlich ob die Spalte, auf die sich das Steuerelement bezieht, vom Benutzer markiert wurde. Dazu zieht die Funktion drei Informationen hinzu: Die in der Eigenschaft Column-Order des Steuerelements enthaltene Zahl, welche die Reihenfolge repräsentiert sowie die Eigenschaften SelLeft und SelWidth des Formulars. SelLeft liefert die Zahl der ersten markierten Spalte, SelWidth die Anzahl der markierten Spalten.

Dabei beginnt die Zählung von SelWidth mit dem Wert 2, die von ColumnOrder mit 1. Dementsprechend prüft das Kriterium der If…Then-Bedingung, ob die ColumnOrder des Steuerelements größer gleich dem Wert von SelLeft – 1 ist oder ob ColumnOrder kleiner oder gleich Me.SelLeft + Me.SelWidth – 1 ist. Ist das der Fall, stellt die Funktion den Wert der Eigenschaft ColumnHidden für das aktuelle Steuerelement und somit für die entsprechende Spalte des Datenblatts auf den Wert True ein.

Die innere For Each-Schleife wird in diesem Fall verlassen, sonst sucht die Funktion weiter nach einem Feldnamen, der mit dem Inhalt von strControlsource übereinstimmt.

Diese Schritte wiederholt die Funktion für alle Steuerelemente. Auf diese Weise können Sie eines oder mehrere Spalten des Datenblatts markieren und per Kontextmenü ausblenden.

Ein-/Ausblenden-Formular

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