VBA: Verbindung mit Access-DB aufbauen?

...komplette Frage anzeigen

1 Antwort

Bei deinem Beispiel gibts einmal das Problem, dass du zwar einen SQL-Befehl in einer Variable speicherst, aber ihn nirgendwo ausführst.

Ich arbeite hauptsächlich in Access, aber folgendes funktioniert auch in Excel: Du musst unter Extras > Verweise... die "Microsoft DAO 3.6 Object Library" einbinden.

Sub test()

Dim db As Database
Dim rs As Recordset

Set db = DBEngine.OpenDatabase("C:\\\\blub\\\\test.accdb")
Set rs = db.OpenRecordset("SELECT * FROM temp", dbOpenDynaset) ' Hiermit öffnest du eine beliebige Auswahlabfrage
db.Execute "DELETE * FROM temp" ' Hiermit kannst du eine beliebige Aktionsabfrage ausführen End Sub

Bei Tabellen, die per ODBC in die die Datenbank eingebunden wurden, musst du evtl. noch die Option "dbSeeChanges" bei OpenRecordset und bei db.Execute ranschreiben (da wird dir Excel aber Bescheid sagen)

Antwort bewerten Vielen Dank für Deine Bewertung
daCypher 10.06.2016, 09:33

PS: Ganz vergessen: Wenn du in der rs-Variable eine Abfrage geladen hast, kannst du mit folgenden Befehlen zwischen den Datensätzen umherspringen:

rs.MoveFirst
rs.MoveNext
rs.MovePrevious
rs.MoveLast

Mit rs.EOF kannst du testen, ob du hinter dem letzten Datensatz bist.

Wenn du die Spaltennamen der Abfrage weißt, kannst du mit rs!Spaltenname jeweils auslesen, was im aktuellen Datensatz in der Spalte "Spaltenname" steht. Du kannst aber auch mit rs.Fields(0) die einzelnen Spalten durchgehen (Zählung fängt bei 0 an).

Achtung: Die Methode rs.RecordCount funktioniert nicht richtig. Wenn du das Recordset frisch geladen hast, kriegst du damit nur 0 oder 1 zurück, je nachdem ob Datensätze drin sind oder nicht. Wenn du wissen willst, wieviele Datensätze drin sind, musst du vorher mit rs.MoveLast auf den letzten Datensatz springen.

PS: Schreib mal am Anfang des Moduls "Option Explicit" rein, dann kann dir das mit deinem SQL-Befehl gar nicht passieren, weil VBA dann rummeckert, dass es die Variable nicht gibt.

0
Herzbube27 10.06.2016, 09:39

Danke schonmal, jetzt kommt aber der Fehler 

"Laufzeitfehler '3343':

Nicht erkennbares Datenbankformat "C:\bla\irgendwas.accdb"

und markiert mir die "Set db = ..." - Zeile

kannst du damit was anfangen?

0
daCypher 10.06.2016, 09:57
@Herzbube27

Das passiert eigentlich nur, wenn die accdb keine accdb ist (also wenn du irgendeine andere Datei einfach umbenannt hast) oder wenn die Datenbank beschädigt ist.

Probiere mal folgendes: Öffne die accdb mit Access und geh dort oben links auf den "Office-Kringel", bzw. auf Start und dann auf Verwalten>Datenbank komprimieren und reparieren.

Danach sollte es gehen. Mit meiner Testdatenbank ging es jedenfalls wunderbar.

Vielleicht kannst du auch gucken, ob es statt "Microsoft DAO 3.6 Object Library" noch was neueres gibt. Oder die Datenbankvariable mit DAO.Database dimensionieren (vielleicht erzeugt er bei dir eine ADODB.Database)

1
Herzbube27 10.06.2016, 10:29
@daCypher

Tatsache, meine Kollegin (die mir die Testdatenbank zur Verfügung stellen wollte) hat sie einfach nur umbenannt. Jetzt läuft alles, Danke!!!

1
Herzbube27 10.06.2016, 11:05
@daCypher

Noch kurz eine Verständnisfrage: Wieso brauche ich bei deinem Code jetzt keinen Provider und was ist der Unterschied zwischen deiner Version mit der "DAO Object..." und meinem "ADODB"?

0
daCypher 10.06.2016, 11:31
@Herzbube27

DAO und ADODB sind einfach zwei verschiedene Klassen für Datenbankverbindungen. 

Ich weiß es nicht 100%ig, aber ich denke mal, dass ADODB für allgemeine Datenverbindungen da ist (also damit könntest du auch andere Datenbanken öffnen) und DAO scheint nur für Access zu funktionieren (wobei man da auch einen Parameter "Connect" übergeben kann, wo dann ein ODBC Verbindungsstring drinsteht). 

Ehrlichgesagt hab ich mich mit dem "Warum" nie näher beschäftigt. Ich hab nur irgendwann gesehen "oh, mit DAO ist es einfacher" und seitdem benutze ich es. Wie gesagt, ich brauch das nur in Access. Da kann man einfach sagen "Set db = CurrentDb" und schon hat man die Verbindung zu der Datenbank.

1

Was möchtest Du wissen?