| DAO |
|
|
| DAO (Data Access Objects) ermöglicht das direkte Steuern von Datenbanken. Bevor Sie diese Prozeduren für Ihre eigenen Anwendungen durchführen, müssen Sie Verweise auf die Microsoft DAO Objekt-Bibliothek (Menü 'Extras', 'Verweise') in VBE herstellen. Weiterhin müssen Sie die entsprechenden ISAM- oder ODBC-Treiber installiert haben. Bedienen Sie sich der Hilfe für weitere Informationen zum Thema ODBC-Treiber sowie für die Installation zwecks Zugriff auf externe Daten. Sie finden in der Hilfe ebenfalls Anweisungen für die Installation von DAO oder ISAMs. Der Pfad in dem nachfolgenden Beispiel weist auf das während der Installation erstellte Standarddateiverzeichnis hin. Sofern Microsoft Office in ein anderes Verzeichnis installiert wurde, berichtigen Sie den entsprechenden Pfad in VBE vor der Programmausführung. |
| Nachfolgendes Beispiel ruft Daten von einer dBase-Datei über RDO ab und plaziert den Datenbereich in eine Abfragetabelle in ein neues Tabellenblatt. Verwenden Sie diese Methode für die Verbindung zu SQL-Datenbanken. RDO umgeht DAO, wodurch der verfügbare Arbeitsspeicher besser genutzt wird. |
| Sub RDOExample() |
| Dim ws As Workspace |
| Dim rs As Recordset |
| Dim qt As QueryTable |
| Dim c As Connection |
| Dim ConnectStr As String |
| Dim NewSheet As Object |
| 'Falls Microsoft Office während der Installation nicht im vorgegebenen Standarddateiverzeichnis installiert |
| 'wurde, müssen Sie den berichtigten Pfad vor Programmablauf eingeben: |
| ConnectStr = "odbc;Driver={Microsoft dBase-Treiber (*.dbf)};DBQ=c:\Programme\Microsoft Office\Office;" |
| 'Stellt einen Arbeitsbereich her, der DAO umgeht |
| Set ws = CreateWorkspace("w1", "admin", "", dbUseODBC) |
| 'Aktiviert die Verbindung zu der DBF-Datenbank |
| Set c = ws.OpenConnection("", 1, 0, ConnectStr) |
| 'Greift auf alle Datensätze zu und gestattet nur Vorwärtsdurchlauf der Datenbank |
| Set rs = c.OpenRecordset("select * from Auftrag", dbOpenForwardOnly) |
| 'Fügt eine neues Arbeitsblatt in die aktivierte Arbeitsmappe ein |
| Set NewSheet = Worksheets.Add |
| 'Fügt eine neue Abfragetabelle basierend auf der Datenbank in das neue Arbeitsblatt ein |
| Set qt = NewSheet.QueryTables.Add(rs, Range("a1")) |
| 'Führt eine synchronisierte Aktualisierung an der Abfragetabelle aus |
| qt.Refresh False |
| 'Schließt die Datei |
| rs.Close |
| 'Bricht die Verbindung ab |
| c.Close |
| End Sub |
|
| EINE DAO-DATEI ZURÜCKSETZEN |
| Dieses Beispiel verwendet das Microsoft Access Datenbankbeispiel Nordwind.mdb, um eine Abfragetabelle in einem neuen Arbeitsblatt zu erstellen, und liefert dann die Datei an eine andere Tabelle innerhalb der Datenbank. |
| Sub ResettingDAORecordset() |
| Dim db As Database |
| Dim rs As Recordset |
| Dim qt As QueryTable |
| Dim NewSheet As Object |
| Dim nwind As String |
| 'Standardpfad für den Zugriff auf Datenbankbeispiel 'Nordwind.mdb' |
| nwind = "C:\Programme\Microsoft Office\Office\Beispiel\Nordwind.mdb" |
| 'Öffnet die Datenbank 'Nordwind.mdb' |
| Set db = DBEngine.Workspaces(0).OpenDatabase(nwind) |
| 'Öffnet Datenbank mit Kundendaten-Datensatzgruppe |
| Set rs = db.OpenRecordset("Kunden") |
| 'Fügt ein neues Arbeitsblatt in die aktive Arbeitsmappe ein |
| Set NewSheet = Worksheets.Add |
| 'Fügt eine Abfragetabelle mit den Dateiinformationen in das neue Arbeitsblatt ein |
| Set qt = NewSheet.QueryTables.Add(rs, Range("a1")) |
| 'Führt eine synchronisierte Aktualisierung an der Abfragetabelle aus |
| qt.Refresh False |
| 'Datensatzgruppe schließen |
| rs.Close |
| 'Öffnet die Datensatzgruppe der Verkaufsdatentabelle |
| Set rs = db.OpenRecordset("Bestellungen") |
| 'Tauscht die Datensatzgruppe gegen die bestehende Abfragetabelle aus |
| Set qt.Recordset = rs |
| 'Führt eine synchronisierte Aktualisierung an der Abfragetabelle aus, um die Daten anzuzeigen |
| qt.Refresh False |
| 'Datensatzgruppe schließen |
| rs.Close |
| 'Datenbank schließen |
| db.Close |
| End Sub |
|
| DATEN VON MICROSOFT ACCESS ABRUFEN |
| Dieses Beispiel verwendet DAO, um eine Abfrage basierend auf zwei Tabellen der Nordwind.mdb-Beispieldatei zu erstellen. Sofern die Abfrage bereits existiert, wird diese durch die Problembehandlungsroutine gelöscht. |
| Sub RetrieveAccessData() |
| Dim Nsql As String, Ncriteria As String, Njoin As String |
| Dim nwind As String |
| Dim h As Integer |
| Dim db As Database, qry As Object |
| Dim rec As Recordset, NewSheet As Object |
| 'Standardspeicherort des Nordwind.mdb-Datenbankbeispiels |
| nwind = "C:\Programme\Microsoft Office\Office\Beispiel\Nordwind.mdb" |
| 'Sollte ein Fehler auftreten, Fehlerbehandlungsroutine ausführen: |
| On Error GoTo errorhandler |
| 'Datenbank öffnen |
| Set db = DBEngine.Workspaces(0).OpenDatabase(nwind) |
| 'SQL-Anweisung für Abfrage (kopiert von MS SQL-Abfrage) |
| Nsql = "SELECT DISTINCTROW Kategorien.Kategoriename, Artikel.Artikelname, Artikel.Liefereinheit, Artikel.Einzelpreis " |
| Njoin = "FROM Kategorien INNER JOIN Artikel ON Kategorien.[Kategorie-Nr] = Artikel.[Artikel-Nr] " |
| Ncriteria = "WHERE ((([Artikel].Auslaufartikel)=No) AND (([Artikel].Lagerbestand)>20));" |
| 'Abfrage unter dem Namen TempQuery erstellen |
| Set qry = db.CreateQueryDef("TempQuery") |
| 'SQL-Anweisung on TempQuery senden |
| qry.sql = Nsql & Njoin & Ncriteria |
| 'Öffne resultierende Datensatzgruppe, erstellt durch TempQuery |
| Set rec = qry.OpenRecordset() |
| 'Neues Tabellenblatt mit dem folgenden Code hinzufügen |
| Set NewSheet = ThisWorkbook.Sheets.Add(after:=Worksheets("Zugriff auf Daten"), Type:=xlWorksheet) |
| 'Feldnamen in Zeile 1 des neuen Tabellenblatts einfügen |
| For h = 0 To rec.Fields.Count - 1 |
| NewSheet.[a1].Offset(0, h).Value = rec.Fields(h).Name |
| Next h |
| 'Dynaset in Excel einfügen |
| NewSheet.[a2].CopyFromRecordset rec |
| 'Temporäre Abfrage löschen |
| db.QueryDefs.Delete "TempQuery" |
| 'Datenbank schließen |
| db.Close |
| 'Falls keine Fehler aufgetreten sind, Code-Ausführung abbrechen |
| Exit Sub |
| 'Fehlerbehandlungsroutine löscht Abfrage, falls diese bereits existiert: |
| errorhandler: |
| If DBEngine.Errors(0).Number = 3012 Then |
| db.QueryDefs.Delete "TempQuery" |
| 'Beginnt Code-Ausführung in der Zeile, die den Fehler verursachte |
| Resume |
| Else |
| MsgBox Error(Err) |
| End If |
| End Sub |
|
| DATEN ÜBER ISAM-TREIBER ABRUFEN |
| Dieses Beispiel ruft Daten von einer dBase-Datei ab und fügt diese in ein neues Tabellenblatt ein. Die notwendigen ISAM-Treiber müssen hierzu installiert sein. |
| Sub RetrieveISAMdata() |
| Dim db As Database, rec As Recordset |
| Dim dPath As String |
| Dim h As Integer, NewSheet As Worksheet |
| 'Standardinstallationspfad für dbf-Dateien |
| dPath = "C:\Programme\Microsoft Office\Office" |
| 'Datenbank öffnen |
| Set db = DBEngine.Workspaces(0).OpenDatabase(dPath, 0, 0, "dBase III") |
| 'Öffnet eine Datensatzgruppe mit allen Datensätzen in Auftrag.dbf |
| Set rec = db.OpenRecordset("select * from Auftrag") |
| 'Neues Tabellenblatt der Arbeitsmappe hinzufügen die diesen Code enthält |
| Set NewSheet = ThisWorkbook.Worksheets.Add(after:=Worksheets("Zugriff auf Daten")) |
| 'Alle Felder mit Schleife durchsuchen und Feldnamen an Tabellenblatt zurückgeben |
| For h = 0 To rec.Fields.Count - 1 |
| NewSheet.[a1].Offset(0, h).Value = rec.Fields(h).Name |
| Next h |
| 'Dynaset nach Excel kopieren |
| NewSheet.[a2].CopyFromRecordset rec |
| 'Datenbank schließen |
| db.Close |
| End Sub |
|
| TABELLEN IN DATENBANK AUFLISTEN |
Dieses Beispiel führt die Tabellennamen des Microsoft Access-Datenbankbeispiels Nordwind.mdb auf. HINWEIS: Microsoft Access muß für die Ausführung dieses Codes installiert sein. |
| Sub ListTables() |
| Dim db As Database, TableCount As Long, i As Long |
| Dim dPath As String |
| 'Standardspeicherort für Nordwind.mdb |
| dPath = "C:\Programme\Microsoft Office\Office\Beispiel\Nordwind.mdb" |
| 'nwind.mdb öffnen |
| Set db = DBEngine.Workspaces(0).OpenDatabase(dPath) |
| 'Variable für die Anzahl der Tabellen festlegen |
| TableCount = db.TableDefs.Count |
| 'Alle Tabellen mit Schleife durchsuchen |
| For i = 0 To TableCount - 1 |
| 'Tabellenname anzeigen |
| MsgBox db.TableDefs(i).Name |
| Next |
| 'Datenbank schließen |
| db.Close |
| End Sub |
|
| DATENFELDER DER DATENBANK AUFLISTEN |
| In diesem Beispiel werden die Feldnamen der Kundentabelle aufgelistet. Falls Sie die Datei 'Kunden.dbf' nicht installiert haben, wenden Sie sich an das Hilfethema 'Laden oder Entfernen einzelner Komponenten in Microsoft Office oder Microsoft Excel'. |
| Sub List_Fields() |
| Dim db As Database, rec As Recordset |
| Dim fieldcount As Long, i As Long, dPath As String |
| 'Standardspeicherort für dbf-Beispieldateien |
| dPath = "C:\Programme\Microsoft Office\Office" |
| 'Datenbank öffnen |
| Set db = OpenDatabase(dPath, 0, 0, "dBase III") |
| 'Alle Datensätze von Kunden.dbf öffnen |
| Set rec = db.OpenRecordset("SELECT * FROM Kunden") |
| 'Datenfelder zählen |
| fieldcount = rec.Fields.Count |
| 'Schleife entsprechend der Anzahl der Felder wiederholen |
| For i = 0 To fieldcount - 1 |
| 'Feldnamen anzeigen |
| MsgBox rec.Fields(i).Name |
| Next |
| 'Datenbank schließen |
| db.Close |
| End Sub |
|
| VERBINDUNG ZUR SQL-DATENBANK HERSTELLEN |
| Dieses Beispiel liefert die Tabellennamen einer SQL-Datenbank. Sie müssen eine Verbindung zu der SQL-Datenbank hergestellt und eine gültige DSN (Data Source Name) erstellt haben. Klicken Sie das 32-Bit-ODBC-Symbol in der Windows-Systemsteuerung, um weitere Informationen über DSNs zu erhalten. |
| Sub ODBC_Connection() |
| Dim db As Database, i As Long |
| 'DSN-Dialogfeld anzeigen um die DSN auszuwählen |
| 'Eingabeaufforderungen für weitere Informationen folgen falls notwendig |
| Set db = DBEngine.Workspaces(0).OpenDatabase("", , , "ODBC;") |
| 'Anzahl der Tabellen zählen |
| TableCount = db.TableDefs.Count |
| 'Schleife durchlaufen um alle Tabellennamen anzuzeigen |
| For i = 0 To TableCount - 1 |
| MsgBox db.TableDefs(i).Name |
| Next |
| 'Datenbank schließen |
| db.Close |
| End Sub |
|
| DAO-FEHLERBEHANDLUNG |
| Das folgende Beispiel veranschaulicht das Auffangen von DAO-Fehlern. Das Anzeigen der Fehlermeldung bietet oftmals hilfreiche Informationen für den Benutzer. Hinweise auf die Fehlernummer bieten dem Programmierer die Möglichkeit, spezielle Fehler aufzufangen und zu behandeln. |
| Sub Trap_DAO_Error() |
| Dim d As Database, r As Recordset |
| 'Tritt ein besonderer Fehler auf, greife auf 'errorhandler' zu: |
| On Error GoTo errorhandler |
| 'Keine integrierten Fehlermeldungen anzeigen |
| Application.DisplayAlerts = False |
| 'Versuch eine nicht vorhandene Datenbank zu öffnen |
| Set d = DBEngine.Workspaces(0).OpenDatabase("c:\xl95\db4.mdb") |
| Exit Sub 'Routine beenden falls keine Fehler aufgetreten sind: |
| errorhandler: |
| MsgBox DBEngine.Errors(0).Description 'Text der Fehlermeldung |
| MsgBox DBEngine.Errors(0).Number 'Fehlernummer |
| MsgBox DBEngine.Errors(0).Source 'Wo Fehler aufgetreten ist |
| MsgBox DBEngine.Errors(0).HelpContext |
| End Sub |
|
| TABELLE ERSTELLEN |
| Dieses Beispiel veranschaulicht das Erstellen einer neuen Tabelle innerhalb einer bestehenden Datenbank. |
| Sub Create_Table() |
| Dim t As Object, f As Object, d As Database |
| Dim dPath As String |
| 'Tritt ein Fehler auf, greife auf 'errorhandler' zu: |
| On Error GoTo errorhandler |
| 'Standarddateipfad der Nordwind.mdb-Beispieldatenbank |
| dPath = "C:\Programme\Microsoft Office\Office\Beispiel\Nordwind.mdb" |
| 'Datenbank 'Nordwind' öffnen |
| Set d = DBEngine.Workspaces(0).OpenDatabase(dPath) |
| 'Neue TableDef erstellen |
| Set t = d.CreateTableDef("NeueTabelle") |
| ' Datenfelder zu NeueTabelle hinzufügen |
| Set f = t.CreateField("Feld1", dbDate) |
| t.Fields.Append f 'Feld der Datenfeldauflistung hinzufügen |
| Set f = t.CreateField("Feld2", dbText) |
| t.Fields.Append f |
| Set f = t.CreateField("Feld3", dbLong) |
| t.Fields.Append f |
| ' TableDef-Definition durch Hinzufügen bei TableDefs-Auflistung speichern |
| d.TableDefs.Append t |
| 'Datenbank schließen |
| d.Close |
| Exit Sub |
| errorhandler: |
| MsgBox DBEngine.Errors(0) |
| End Sub |
|