window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-TCJTE9L38H');

Tabellen bearbeiten mit dem TableDef-Objekt

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie über VBA auf die Objekte Ihrer Datenbank zugreifen, dann hat sicher der Datenzugriff über das Recordset-Objekt die größte Bedeutung. Seltener werden Sie die Definitionen der Tabellen auslesen, bearbeiten oder gar anlegen müssen. Wenn doch, so ist das TableDef-Objekt von DAO die zentrale Anlaufstelle. Sehen Sie selbst, wie der Umgang damit aussieht und was möglich ist.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1409_Tabledefs.mdb.

Die richtige Bibliothek

Die VBA-Zugriffsmethoden für die Datenbank sind nicht Teil von Access selbst, sondern in eine zusätzliche Daten-Engine ausgelagert. Das führt dazu, dass Sie in Ihrem VBA-Projekt einen zusätzlichen Verweis auf diese Engine benötigen. Wenn Sie eine neue Datenbank anlegen, so setzt Access diesen Verweis automatisch, doch leider war man sich bei Microsoft nicht einig, welche Bibliothek hierfür die geeignete ist.

So war man einige Zeit der Meinung, dass ADODB die bessere Zugriffsbibliothek darstellt, und folglich wurde beim Anlegen einer Datenbank darauf ein Verweis gesetzt. Erst ab Access 2007 schwenkte man wieder um und manifestierte DAO als Standard.

Sie können daher nicht sicher sein, dass in Ihrer oder einer fremden Datenbank bereits ein Verweis auf die Bibliothek DAO gesetzt ist, welche die Klasse TableDef enthält, von der hier die Rede sein soll.

Im Zweifel schauen Sie im VBA-Objektkatalog nach, ob dort der Eintrag DAO vorhanden ist, oder rufen alternativ den Verweise-Dialog über das Menü Extras|Verweise… auf. DAO hieß zwar früher schon DAO, der Beschreibungstext des Verweises änderte sich allerdings. So ist bis Access 2003 ein Verweis auf die Microsoft DAO 3.6 Objekt Library zu setzen und für die Folgeversionen einer auf die Microsoft Office 12.0 Access database engine Object Library.

Machen Sie für Access 2010 aus der 12 eine 14 und für Access 2013 eine 15. In allen Fällen aber finden Sie anschließend im Objektkatalog den Eintrag DAO in der linken oberen Combobox. Wird er ausgewählt, so erscheinen die Datenzugriffsklassen der Bibliothek auf der linken Seite, wie in Bild 1, wo auch schon die TableDef-Klasse markiert wurde und rechts ihre Methoden wiedergibt.

Die Klasse DAO.TableDef im VBA-Objektkatalog

Bild 1: Die Klasse DAO.TableDef im VBA-Objektkatalog

TableDefs-Auflistung

Alle Tabellen Ihrer Datenbank sind in einer Art Katalog über die TableDefs-Klasse zu erhalten. Wie in allen Auflistungsklassen können deren TableDef-Elemente in einer For..Each-Schleife durchlaufen werden, die Zahl der Elemente über die Eigenschaft Count ermittelt oder Elemente gezielt mit der (versteckten) Item-Eigenschaft abgefragt werden. Woher jedoch weiß DAO, wenn es gar nicht Teil des Access-Objektmodells ist, welche Tabellen ihn der Access-Datenbank stecken Dazu muss über ein Database-Objekt, welches selbst die TableDefs-Methode ausweist, eine Verbindung zu ihr geschaffen werden.

Dieses Bindeglied gibt es in Access entweder über die Eigenschaft Application.CurrentDb oder über die Eigenschaft Application.DBEngine. Sobald eine Datenbank in Access geöffnet wird, tritt die Datenbank-Engine in Aktion und lädt in ihr Workspace ein neues Database-Objekt. Eine Kopie davon lässt sich dann über CurrentDb erhalten. Im Prinzip sollte man über beide Ansätze zum gleichen Ergebnis kommen:

1.
Dim dbs As DAO.Database
Set dbs = Application.CurrentDb
2.
Dim dbs As DAO.Database
Dim wrk As DAO.Workspace
Set wrk = Application. _
   DBEngine.Workspaces(0)
Set dbs = wrk.Databases(0)
Abgekürzt:
Set dbs = DBEngine(0)(0)

Dass es leider nicht egal ist, für welche der beiden Methoden man sich entscheidet, werden wir noch sehen.

Versuchen wir zunächst alle Tabellen der aktuellen Datenbank namentlich im VBA-Direktfenster auszugeben. Rufen Sie dazu die erste der drei Routinen in Listing 1 auf. ListTableDefs definiert erst eine TableDef-Variable tdf und füllt diese in der folgenden For..Each-Schleife jeweils mit dem nächsten Element der TableDefs-Auflistung von CurrentDb. Die Eigenschaft Name des TableDef-Objekt wird ins Direktfenster geschrieben.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar