Eine Prozedur, die Daten einer Tabelle verarbeiten soll, muss diese Daten zuerst lesen können. Danach soll sie vielleicht einzelne Datensätze ändern, neue anlegen oder vorhandene löschen, ohne dass dafür ein Formular geöffnet ist. Dafür verwenden wir in VBA ein Recordset. Das ist die Menge der Datensätze einer Tabelle, einer Abfrage oder einer SQL-Anweisung, die wir über ein Objekt ansprechen. Wie Du ein Recordset öffnest, seine Datensätze durchläufst, einen Datensatz suchst und Datensätze anlegst, änderst und löschst, liest Du in diesem Artikel.
Beispieldatenbank
Die Beispiele dieses Artikels findest Du in der Datenbank VBABasics_DatenzugriffMitRecordsets.accdb. Sie enthält die Tabelle tblPersonen mit den Feldern PersonID (Autowert), Vorname, Nachname, Ort, Geburtsdatum und Aktiv sowie zehn Datensätze (siehe Bild 4). Das Modul mdlRecordsetBeispiele enthält alle Prozeduren dieses Artikels.
Bild 1: Die Beispieltabelle tblPersonen
Datenbank und Recordset
Wenn eine VBA-Prozedur auf die Daten einer Tabelle zugreift, benötigen wir zwei Objekte. Das erste ist ein Database-Objekt, das die Datenbank darstellt. Das zweite ist ein Recordset-Objekt. Es hält die Datensätze bereit, und über seine Eigenschaften und Methoden lesen und bearbeiten wir sie.
Beide Objekte gehören zur Bibliothek DAO (Data Access Objects). Der Verweis auf diese Bibliothek ist in einer neu angelegten Access-Datenbank bereits gesetzt. Aktuelle Access-Versionen verwenden dafür standardmäßig die Bibliothek Microsoft Office 16.0 Access database engine Object Library. Wie Du die Verweise Deines VBA-Projekts ansehen kannst, liest Du im Artikel VBA [basics]: Mit Verweisen arbeiten (www.access-basics.de/686).
Daneben gibt es die Bibliothek ADO (ActiveX Data Objects), die ebenfalls ein Recordset-Objekt enthält. Auf diese Bibliothek gehen wir in diesem Artikel nicht ein. Sind beide Bibliotheken eingebunden, entscheidet die Reihenfolge der Verweise, welcher Typ gemeint ist. Mit dem Präfix DAO. in der Deklaration ist der Typ eindeutig, etwa bei Dim rst As DAO.Recordset.
Die Funktion CurrentDb liefert das Objekt der aktuell geöffneten Datenbank. Wir speichern es in einer Variablen vom Typ DAO.Database.
Ein Recordset öffnen und durchlaufen
Die Prozedur PersonenAusgeben öffnet die Tabelle tblPersonen als Recordset und gibt von jedem Datensatz die PersonID und den Namen im Direktbereich aus (siehe Listing 10).
Public Sub PersonenAusgeben() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("tblPersonen") Do While Not rst.EOF Debug.Print rst!PersonID & ": " & rst!Vorname & " " & rst!Nachname rst.MoveNext Loop rst.Close Set rst = Nothing Set db = Nothing End Sub
Listing 1: Alle Personen im Direktbereich ausgeben
Die Variable db nimmt mit Set db = CurrentDb den Verweis auf die Datenbank auf. Die Methode OpenRecordset öffnet die Tabelle tblPersonen und liefert das Recordset. Der Datensatzzeiger markiert den aktuellen Datensatz. Er steht nach dem Öffnen auf dem ersten Datensatz, sofern das Recordset Datensätze enthält.
Die Schleife kennen wir aus dem Artikel VBA [basics]: Schleifen mit For, Do und While (www.access-basics.de/709). Die Eigenschaft EOF (End Of File) hat den Wert True, sobald der Datensatzzeiger hinter dem letzten Datensatz steht. Die Methode MoveNext bewegt den Zeiger auf den nächsten Datensatz. Ohne diesen Aufruf bliebe die Schleife auf dem ersten Datensatz stehen.
Achte unbedingt darauf, diesen Befehl innerhalb von Schleifen immer zu setzen, da die Schleife sonst zu einer Endlos-Schleife wird.
Auf die Felder des aktuellen Datensatzes greifen wir mit dem Ausrufezeichen (!) und dem Feldnamen zu, etwa mit rst!Nachname. Gleichwertig ist rst.Fields(„Nachname“).Value. Diese Schreibweise nutzen wir, wenn der Feldname in einer Variablen steht.
Zum Schluss schließen wir das Recordset mit rst.Close. Mit Set rst = Nothing und Set db = Nothing geben wir die Objektvariablen frei.
Beim Verlassen der Prozedur gibt VBA lokale Objektvariablen ebenfalls frei. Wir schließen das Recordset trotzdem selbst, denn so steht im Code, wann die Datensätze nicht mehr benötigt werden.
Unser exklusives Angebot für Dich!
(Das Abo ist jederzeit monatlich kündbar)
Hier geht’s weiter →Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →![Access [basics]](https://access-basics.de/wp-content/uploads/2021/02/logo400.png)
