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.

Makros, Module

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.

Formulare, Berichte

Auf Formulare und Berichte kann die Access-Application über die Forms- bzw. Reports-Auflistungen zugreifen. Die Steuerelemente eines Formulars/Berichts sind wiederum deren Unterobjekte. Im Entwurfsmodus des Formulars können wir im Eigenschaftenfenster im Reiter Ereignis sehen, auf welche Ereignisse das gerade ausgewählte Objekt reagieren kann. Wählen wir dort [Ereignisprozedur] und den Button mit den drei Punkten aus, landen wir im VBA-Editor direkt in einer dafür vorgesehenen Prozedur.

Stellen wir uns ein Formular mit einem Textfeld namens txtNachname vor, das in der Entwurfsansicht 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.

Tabellen, Abfragen

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  txtLandtxtHauptstadt
1BayernMünchen
2HessenWiesbaden
3Rheinland-PfalzMainz
4SaarlandSaarbrü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:

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() könnte man sogar auf eine geschlossene, nicht verknüpfte Datenbank zugreifen.

Die gesamte Tabelle wird anschließend in ein sogenanntes „Recordset“ geladen. Falls Sie Felder vom Typ Anlage oder Nachschlagefeld verwenden, empfiehlt sich die Deklaration von DAO.Recordset2, der zusätzliche Eigenschaften und Methoden dafür mitbringt und ansonsten identisch funktioniert. In OpenRecordset kann der Name einer existierenden Tabelle oder Abfrage angegeben werden, oder SQL-Code. Die obige Angabe dbOpenDynaset ist die flexibelste Möglichkeit, in den Daten zu navigieren. Bei Performanceproblemen sollte man andere Werte testen.

Bestimmte Datensätze in einem Recordset 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.