Im Gegensatz zu anderen Officeapplikationen erschließt sich die Nutzung einer Datenbank wie eben Microsoft Access nicht, indem man einfach loslegt, sondern man sollte schon vor dem Starten eines Datenprogramms wissen, was man vorhat. Der Autor des VBA-Tutorials hat auch das Access-Tutorial erstellt. Aber natürlich gibt es auch zahlreiche Bücher zu Microsoft Access.
Eine Access-Datenbank besteht aus verschiedenen Objekten, die wie folgt in der Navigationsleiste gegliedert werden:
Gehen wir sie nun in umgekehrter Reichenfolge durch.
In der Navigationsleiste sehen wir unter Module unsere eigenen VBA-Module. Sie
sind also zu sehen, selbst wenn der VBA-Editor gar nicht gestartet wurde - ganz
im Gegensatz zu anderen Applikationen. Alle Makroaktionen finden sich als Methoden
des DoCmd
-Objekts. Für die meisten DoCmd-Methoden gibt es allerdings
in VBA bessere Umsetzungsmöglichkeiten.
Auf Formulare und Berichte kann man über die Forms- bzw.
Reports-Auflistungen zugreifen. Die darin
enthaltenen Steuerelemente sind wiederum in deren Controls
−Auflistung
zu finden. Access bietet neben der in VBA „üblichen“ Schreibweise auch eine
Kurzschreibweise an, mit der nicht immer die Auflistung angegeben werden muss. Für
die Kurzschreibweise sollte man nicht den sonst üblichen Punkt als Trennzeichen
verwenden, sondern ein Ausrufezeichen (In der Regel würde zwar ein Punkt genau so
akzeptiert, es kommt dabei aber gelegentlich zu technischen Problemen). Die beiden
folgenden Befehle sind identisch; einmal in der vollen und einmal in der
Kurzschreibweise:
Debug.Print Forms("frmPerson").Controls("txtNachname").ControlSource Debug.Print Forms!frmPerson!txtNachname.ControlSource
Natürlich kann man auch auf Steuerelemente in Unterformularen zugreifen. Nehmen
wir an, das Unterformular heißt UFO
und enthält ein Textfeld namens
txtName
, dann sieht der Code wie folgt aus:
Forms!Formularname!UFO.Form!txtName
Formulare und Steuerelemente können auf zahlreiche Ereignisse reagieren. Im
Entwurfsmodus des Formulars können wir im Eigenschaftenfenster die Ereignisse des
gerade ausgewählten Objekt sehen. Wählen wir dort [Ereignisprozedur]
aus und klicken auf den Button mit den drei Punkten, landen wir im VBA-Editor in
einer dafür vorgesehenen Prozedur.
Stellen wir uns als Beispiel ein Formular mit einem Textfeld namens
txtNachname
vor, das einen weißen Hintergrund hat.
Option Compare Database Option Explicit
Private Sub Form_Current() Application.Forms(0).txtNachname.BackColor = RGB(255, 128, 128) End Sub
Private Sub txtNachname_AfterUpdate() Me.txtNachname.BackColor = RGB(128, 128, 255) End Sub
Beim Aufruf eines Datensatzes wird die Hintergrundfarbe des Textfelds auf
RGB(255, 128, 128)
gesetzt. Ändert sich der Wert des Textfelds, ändert sich die Hintergrundfarbe zu
RGB(128, 128, 255)
. (Me
ist uns aus dem Tutorial heraus
schon bekannt). Der User wird nie bemerken, dass
der Hintergrund eigentlich weiß ist.
Einen tieferen Einstieg in die Ereignisprogrammierung von Formularen bietet ein kleines Tutorial von Philipp Stiefel.
Daten müssen nicht zwingend in der gleichen Datei wie der VBA-Code abgelegt sein, und nicht einmal unbedingt im Access-Dateiformat. Deswegen bietet die Access-Objektbibliothek auch gar nicht erst die Möglichkeit, auf Daten zuzugreifen. Dafür muss man erst auf eine Objektbibliothek verweisen, die das kann. Und damit es nicht zu einfach wird, gibt es dafür auch noch verschiedene: DAO („Microsoft DAO Object Libary“, ab Access 2007 „Microsoft Office Access database engine Object Libary“) und ADO (Microsoft ActiveX Data Objects Libary). DAO ist speziell für den Zugriff auf Access-Datenbanken gedacht, kann aber auch für andere ODBC-fähige Datenbanken genutzt werden. ADO ist für alle möglichen Dateiformate verwendbar, wodurch die Fähigkeiten eingeschränkt sind. In aller Regel ist also DAO vorzuziehen. Daher gehen wir hier nur auf DAO ein.
tblBundesländer | |||
---|---|---|---|
ID | txtLand | txtHauptstadt | |
1 | Bayern | München | |
2 | Hessen | Wiesbaden | |
3 | Rheinland-Pfalz | Mainz | |
4 | Saarland | Saarbrücken | |
* | (Neu) |
Wir suchen nun - ganz ohne SQL - aus der nebenstehenden Tabelle die Landeshauptstadt eines Bundeslandes, wobei es egal ist, ob die Tabelle in der gleichen Datei steckt wie der Code oder nur mit dieser verknüpft ist:
Public Sub HauptstadtVon(txtLand As String) Dim db As DAO.Database, rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("tblBundesländer", dbOpenDynaset) rs.FindFirst "txtLand = '" & txtLand & "'" Debug.Print rs("txtHauptstadt") rs.Close End Sub
HauptstadtVon "Hessen" Wiesbaden
DAO.Database
verweist auf eine Datenbank. Dabei ist es egal, ob
die Tabellen verknüpft sind oder nicht. Mit Set db = OpenDatabase()
kann man sogar auf eine geschlossene, nicht verknüpfte Datenbank zugreifen.
Die gesamte Tabelle wird anschließend in ein sogenanntes „Recordset“ geladen.
Bei Feldern vom Typ „Anlage“ oder „Nachschlagefeld“ kann man auch mit
DAO.Recordset2
deklarieren, womit zusätzliche Eigenschaften und
Methoden zur Verfügung stehen, und ansonsten identisch funktioniert. In
OpenRecordset
kann der Name einer Tabelle oder Abfrage angegeben
werden, oder SQL-Code. Die Option
dbOpenDynaset
ist die flexibelste Möglichkeit, in den Daten zu navigieren. Bei Performanceproblemen
sollte man andere Werte testen.
Bestimmte Datensätze eines Recordsets findet man mit FindFirst
,
FindNext
, FindPrevious
oder FindLast
.
Man kann auch innerhalb der Datensätze mit den Methoden MoveFirst
,
MoveNext
, MovePrevious
, MoveLast
und
Move
navigieren. Neue Datensätze fügt man mit AddNew
ein. Ändert man einen Datensatz oder fügt einen neuen hinzu, ist anschließend
noch die Update
-Methode nötig, weil sonst die Änderungen wieder
verloren gingen.
Aktionsabfragen können nicht mit OpenRecordset
ausgeführt werden.
Das würde die Abfrage einfach als normale Abfrage öffnen. Zum Ausführen einer
Aktionsabfrage benötigt man die Execute
-Methode, wobei auch dann
entweder der Name einer gespeicherten Abfrage oder eine SQL-Anweisung
erlaubt ist:
CurrentDb.Execute("DELETE FROM tblBundesländer")
Ein vollständiger Überblick über das Objektmodell findet sich auf den Seiten von Microsoft.