VBA: Verbindung mit Access-DB aufbauen?
Hallo, ich habe in Excel eine XLSM-Datei und eine accdb-Datei für Access. Jetzt versuche ich in der Excel Datei mittels VBA auf Knopfdruck eine Verbindung zu der Datenbank aufzubauen und probehalber alle Datensätze zu löschen, das funktioniert jedoch nicht, es wird also vermutlich schon die Verbindung nicht klappen... Code ist folgender (aus dem Internet zusammenkopiert, da ich noch nie mit Access-Datenbanken gearbeitet habe):
Public Sub test_db()
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = W:\CU-AL\..."
Sql = "DELETE * FROM Test"
conn.Close
End Sub
Was mache ich falsch? Vorallem: welchen Provider brauche ich???
Und ich muss doch auch in Excel unter "Extras" --> "Verweise" bestimmte Häckchen setzen. Wisst ihr, welche das sind?
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)
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)
Tatsache, meine Kollegin (die mir die Testdatenbank zur Verfügung stellen wollte) hat sie einfach nur umbenannt. Jetzt läuft alles, Danke!!!
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"?
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.
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.
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?