Das Navigationssteuerelement ermöglicht ein einfaches Handling von Unterformularen. Sie können damit etwa immer das gleiche Formular als Unterformular anzeigen und die Daten je nach gedrückter Navigationsschaltfläche filtern – beispielsweise um Artikel nach Kategorien zu sortieren oder nach dem Alphabet zu filtern. Dieser Beitrag zeigt, wie Sie eine solche Lösung erstellen – aber auch, wie Sie sich die Arbeit beim Erstellen des Formulars per VBA vereinfachen können.
Wenn Sie beispielsweise ein Navigationssteuerelement erstellen, mit dem Sie die Artikel oder Kunden in einer Datenbank nach dem Alphabet filtern möchten, ist erstmal umfangreiche Handarbeit gefragt: Immerhin wollen zumindest 26 Schaltflächen für den Aufruf eines Formulars mit den entsprechenden Filterkriterien erstellt werden.
Da diese Aufgabe eines Access-Entwicklers unwürdig ist, werden wir diese natürlich per VBA automatisieren. Um dies zu erledigen, sind ein paar Grundlagen erforderlich, die wir in einem einfachen Beispiel betrachten.
Ziel ist es, ein einfaches Navigationssteuerelement mit zwei Einträgen in der ersten Ebene und jeweils zwei Einträgen in der zweiten Ebene zu erstellen. Dieses sieht nach der Fertigstellung wie in Bild 1 aus.
Bild 1: Navigationssteuerelement mit verschachtelten Elementen
Die zur Erstellung dieses Formulars verwendete Prozedur nutzt eine Hilfsfunktion, die sich nur um das reine Formular kümmert. Diese heißt NeuesFormular, erwartet den Namen des zu erstellenden Formulars und sieht wie folgt aus:
Public Function NeuesFormular(strForm As String) Dim strFormTemp As String Dim frm As Form On Error Resume Next DoCmd.Close acForm, strForm DoCmd.DeleteObject acForm, strForm On Error GoTo 0 Set frm = Application.CreateForm strFormTemp = frm.Name DoCmd.Close acForm, frm.Name, acSaveYes DoCmd.Rename strForm, acForm, strFormTemp End Function
Die Funktion schließt zunächst ein eventuell vorhandenes Formular gleichen Namens und löscht dieses aus der Datenbank. Danach erstellt sie mit der CreateForm-Methode ein Formular-Objekt und speichert den Namen dieses neuen Formulars in der Variablen strFormTemp zwischen. Dies ist nötig, da das Formular im geöffneten Zustand nicht umbenannt werden kann. Also schließt die Funktion das Formular und benennt es dann mit der Rename-Funktion um. Anschließend startet die eigentliche Erstellung des verschachtelten Navigationssteuerelements. Die dazu verwendete Prozedur finden Sie in Listing 1.
Listing 1: Erstellen eines Formulars mit verschachtelter Navigation
Public Sub FormularErstellen() Dim frm As Form Dim strForm As String Dim ctlNavigation As NavigationControl Dim ctlSubnavigation As NavigationControl Dim ctlButton As NavigationButton strForm = "frmNaviPerVBA" NeuesFormular strForm DoCmd.OpenForm strForm, acDesign Set frm = Forms(strForm) Set ctlNavigation = Application.CreateControl(strForm, acNavigationControl, acDetail) ctlNavigation.Name = "nav" Set ctlSubnavigation = Application.CreateControl(strForm, acNavigationControl, acDetail) ctlSubnavigation.Name = "navSub" Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlNavigation.Name) With ctlButton .Name = "nab1" .Caption = "Button 1" End With Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name) With ctlButton .Name = "nab11" .Caption = "Button 1-1" End With Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name) With ctlButton .Name = "nab12" .Caption = "Button 1-2" End With Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlNavigation.Name) With ctlButton .Name = "nab2" .Caption = "Button 2" End With Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name) With ctlButton .Name = "nab21" .Caption = "Button 2-1" End With Set ctlButton = Application.CreateControl(strForm, acNavigationButton, acDetail, ctlSubnavigation.Name) With ctlButton .Name = "nab22" .Caption = "Button 2-2" End With DoCmd.Close acForm, strForm, acSaveYes End Sub
Die Prozedur ruft zunächst die bereits beschriebene Funktion zum Erstellen des eigentlichen Formulars auf. Dann öffnet sie dieses Formular in der Entwurfsansicht und referenziert es mit der Objektvariablen frm.
Die CreateControl-Methode des Application-Objekts erstellt ein Steuerelement des Typs acNavigationControl, und zwar in dem mit dem dritten Parameter angegebenen Formularbereich – hier dem Detailbereich (acDetail).
Dieses Steuerelement referenziert die Prozedur dann mit der als NavigationControl deklarierten Objektvariablen ctlNavigation. Über die Name-Eigenschaft dieser Variablen legt die Funktion die Bezeichnung nav für das Steuerelement fest.
Wir möchten dem Navigationssteuerelement ein weiteres Navigationssteuerelement unterordnen, was weniger Aufwand als erwartet bedeutet: Sie brauchen dazu nämlich einfach nur ein weiteres Navigationssteuerelement zum Formular hinzuzufügen. Es ist keine Angabe des übergeordneten Navigationssteuerelements nötig, diese Eigenschaft wird automatisch auf das bereits vorhandene Navigationssteuerelement eingestellt.