Formulare sind das Herzstück einer Access-Anwendung. Mit VBA machst du sie lebendig: Du öffnest sie gefiltert, liest und schreibst Steuerelemente, blendest Felder ein und aus und navigierst durch die Datensätze. Diese Lektion zeigt die Techniken, die du dafür ständig brauchst.
Formulare öffnen mit DoCmd.OpenForm
DoCmd.OpenForm öffnet ein Formular. Die beiden interessantesten Parameter sind
WhereCondition (ein Filter, wie ein WHERE ohne das Wort WHERE) und
OpenArgs (ein beliebiger Startwert, den das Formular auslesen kann):
DoCmd.OpenForm "frmKunde", _
WhereCondition:="KundenID = " & Me!KundenID, _
OpenArgs:="AusUebersicht"
Im geöffneten Formular liest du OpenArgs typischerweise im Form_Load-Ereignis
aus:
Private Sub Form_Load()
If Me.OpenArgs = "AusUebersicht" Then
Me!cmdZurueck.Visible = True
End If
End Sub
Tipp:
WhereConditionfolgt den SQL-Regeln aus den vorigen Lektionen — Text in', Datum in#mm/dd/yyyy#. Der Filter zeigt nur passende Datensätze an, ohne die zugrunde liegende Datenquelle zu verändern.
Me vs. Forms!Formularname
Innerhalb des Codes eines Formulars verweist Me auf genau dieses Formular. Das
ist kurz und robust:
Me!txtName = "Neuer Wert"
Willst du von außen — z. B. aus einem anderen Formular oder einem Modul — auf ein
geöffnetes Formular zugreifen, nutzt du die Forms-Auflistung:
Forms!frmKunde!txtName = "Neuer Wert"
Me funktioniert nur im Code hinter dem Formular selbst. Forms!... setzt voraus,
dass das Formular tatsächlich geöffnet ist.
Steuerelemente lesen und setzen
Der Zugriff auf ein Steuerelement erfolgt über Me!Name (das ! steht für „ein
benanntes Element in dieser Auflistung"). Lesen und Schreiben sehen gleich aus:
Dim betrag As Currency
betrag = Me!txtBetrag ' lesen
Me!txtSumme = betrag * 1.19 ' setzen
Me!lblStatus.Caption = "Berechnet" ' Beschriftung setzen
Der Value ist die Standardeigenschaft, deshalb reicht Me!txtBetrag. Für alle
anderen Eigenschaften schreibst du sie explizit dahinter (.Caption, .Visible
usw.).
Eigenschaften: Visible, Enabled, Locked, BackColor
Steuerelemente haben viele Eigenschaften, die du zur Laufzeit ändern kannst. Die gebräuchlichsten:
| Eigenschaft | Wirkung |
|---|---|
Visible | Element ein-/ausblenden (True/False) |
Enabled | Element bedienbar oder ausgegraut |
Locked | Inhalt sichtbar, aber schreibgeschützt |
BackColor | Hintergrundfarbe (als RGB-Zahl) |
Private Sub cmdBearbeiten_Click()
Me!txtPreis.Locked = False
Me!txtPreis.BackColor = RGB(255, 255, 200) ' hellgelb
Me!txtPreis.Enabled = True
Me!txtPreis.SetFocus
End Sub
Locked = True bei gleichzeitig Enabled = True ist oft die beste Wahl für
„nur lesen": Der Anwender sieht den Wert normal, kann ihn aber nicht ändern.
Requery: Daten neu laden
Wenn sich die zugrunde liegenden Daten geändert haben — etwa durch eine
Aktionsabfrage —, spiegelt das Formular das nicht automatisch. Requery lädt neu:
Me.Requery ' ganzes Formular neu laden
Me!lstArtikel.Requery ' nur ein Listen-/Kombinationsfeld
Ein Requery auf das Formular springt zum ersten Datensatz zurück. Willst du nur
eine Kombinationsfeld-Liste aktualisieren, ohne die Datensatzposition zu verlieren,
requery gezielt das eine Steuerelement.
Das Recordset des Formulars
Jedes gebundene Formular hat ein Recordset. Darüber kommst du an alle Datensätze
heran, ohne dich durch die Anzeige zu klicken — nützlich etwa zum Zählen oder für
Berechnungen:
Private Sub cmdZaehlen_Click()
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone ' Kopie, verändert die Anzeige nicht
rs.MoveLast ' ans Ende, damit RecordCount stimmt
MsgBox rs.RecordCount & " Datensätze im Formular"
Set rs = Nothing
End Sub
Hinweis:
RecordsetCloneist eine eigene Kopie des Datensatzzeigers — du kannst darin navigieren, ohne die Anzeige des Formulars zu bewegen. ÜberMe.Bookmark = rs.Bookmarkspringst du die Anzeige dann gezielt auf einen im Clone gefundenen Datensatz.
Me.Dirty und Undo: ungespeicherte Änderungen
Me.Dirty ist True, sobald der Anwender den aktuellen Datensatz geändert, aber
noch nicht gespeichert hat. Zwei typische Einsätze:
' Änderungen erzwingen zu speichern:
If Me.Dirty Then Me.Dirty = False
' Änderungen verwerfen:
If Me.Dirty Then Me.Undo
Me.Dirty = False schreibt den Datensatz in die Tabelle (wie DoCmd.RunCommand acCmdSaveRecord). Me.Undo macht alle Änderungen am aktuellen Datensatz rückgängig
— praktisch für einen „Abbrechen"-Button.
Zwischen Datensätzen navigieren
DoCmd.GoToRecord bewegt den Datensatzzeiger des Formulars:
DoCmd.GoToRecord , , acNext ' nächster
DoCmd.GoToRecord , , acPrevious ' vorheriger
DoCmd.GoToRecord , , acFirst ' erster
DoCmd.GoToRecord , , acLast ' letzter
DoCmd.GoToRecord , , acNewRec ' neuer, leerer Datensatz
Am Rand (z. B. acNext auf dem letzten Datensatz) löst Access einen Fehler aus —
den fängst du mit On Error Resume Next oder einer eigenen Prüfung ab.
Fokus setzen mit SetFocus
Manche Aktionen setzen voraus, dass ein Steuerelement den Fokus hat — und oft willst
du den Cursor gezielt platzieren. Dafür gibt es SetFocus:
Me!txtSuche.SetFocus
Reihenfolge beachten: Ein Steuerelement muss
Visible = TrueundEnabled = Truesein, bevor du ihm den Fokus gibst — sonst gibt es einen Laufzeitfehler. Ebenso kannst du ein Steuerelement erst dann ausblenden (Visible = False), wenn es nicht mehr den Fokus hat.
Zusammengefasst
DoCmd.OpenFormöffnet Formulare;WhereConditionfiltert,OpenArgsübergibt einen Startwert (imForm_Loadauslesbar).Me!greift im eigenen Formularcode zu,Forms!Name!von außen auf ein geöffnetes Formular.- Eigenschaften wie
Visible,Enabled,LockedundBackColorsteuerst du zur Laufzeit;Requerylädt Daten neu. Me.RecordsetClonegibt Zugriff auf alle Datensätze,Me.Dirty/Me.Undoverwalten ungespeicherte Änderungen.DoCmd.GoToRecordnavigiert zwischen Datensätzen,SetFocussetzt den Cursor — Element muss dafür sichtbar und aktiviert sein.