Microsoft Access

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.

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 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.

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:

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.