Lektionen/Formulare & Berichte

Formulare per VBA steuern

Fortgeschritten11 Min. Lesezeit

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: WhereCondition folgt 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:

EigenschaftWirkung
VisibleElement ein-/ausblenden (True/False)
EnabledElement bedienbar oder ausgegraut
LockedInhalt sichtbar, aber schreibgeschützt
BackColorHintergrundfarbe (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: RecordsetClone ist eine eigene Kopie des Datensatzzeigers — du kannst darin navigieren, ohne die Anzeige des Formulars zu bewegen. Über Me.Bookmark = rs.Bookmark springst 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 = True und Enabled = True sein, 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; WhereCondition filtert, OpenArgs übergibt einen Startwert (im Form_Load auslesbar).
  • Me! greift im eigenen Formularcode zu, Forms!Name! von außen auf ein geöffnetes Formular.
  • Eigenschaften wie Visible, Enabled, Locked und BackColor steuerst du zur Laufzeit; Requery lädt Daten neu.
  • Me.RecordsetClone gibt Zugriff auf alle Datensätze, Me.Dirty/Me.Undo verwalten ungespeicherte Änderungen.
  • DoCmd.GoToRecord navigiert zwischen Datensätzen, SetFocus setzt den Cursor — Element muss dafür sichtbar und aktiviert sein.
Nächste Lektion
Ereignisse verstehen