Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Änderung von Access-Abfragen mittels SQL und VBA

Änderung von Access-Abfragen mittels SQL und VBA
13.09.2016 16:05:19
Access-Abfragen
Hallo zusammen,
ich konnte in den vergangenen Jahren schon sehr viel Wissen aus diesem Forum ziehen und bin immer sehr dankbar für diesen riesigen Pool an Informationen. Jetzt stehe ich aber leider vor einem Problem, zu welchem ich trotz intensiver Recherche noch nichts brauchbares finden konnte... Vielleicht steh ich auch einfach nur auf dem Schlauch (wie man so schön sagt).
Mein Problem:
Ich habe ein Tool programmiert, welches auf eine Access-Datenbank zugreifen soll, um dort eine bereits bestehende Abfrage (nennen wir sie "Abfrage 1") mittels SQL zu verändern. Anschließend greift das Tool auf eine andere Abfrage (nennen wir sie "Abfrage 2") derselben Datenbank zu, liest die "Ergebnisse" aus und überträgt sie ins Excel. Es ist anzumerken, dass "Abfrage 2" hierbei natürlich auf "Abfrage 1" beruht. Es stellt sich heraus, dass die Veränderung der "Abfrage 1" nicht funktioniert.
Nebenbei: Ich hab Office 2016.
Im Anschluss könnt ihr (ich bleib gleich beim "du") in vereinfachter Form meinen Code sehen:
------
Private Sub DatenLadenB2C()
Dim Datenbank As Object
Dim strPfad As String
Dim SQLAnweisung As String
Dim rs As Object
Dim Z, x As Integer
Dim anzahl As Integer
Dim Zielstring As String
strPfad = Sheets("Access-Daten").Cells(262, 3)      'Pfad auslesen aus Zelle
If strPfad = "" Or strPfad = "Falsch" Then          'Fehlerabfang
MsgBox "Fehler beim Öffnen"
Exit Sub
End If
Set Datenbank = CreateObject("ADODB.Connection")    'Datenbank öffnen
DBProvi = "Microsoft.ACE.OLEDB.12.0"
DBParameter = "Data Source=" & strPfad & ";Jet OLEDB:Engine Type=5;" & _
"Persist Security Info = False;"
Datenbank.Provider = DBProvi
Datenbank.ConnectionString = DBParameter
Datenbank.Open
Set rs = CreateObject("ADODB.recordset")
Zielstring = "abc"
SQLAnweisung = "SELECT blablabla, " & Zielstring & " AS Dingsda _
FROM [Abfrage 1] GROUP BY blablabla HAVING DiesUndDas;"
Debug.Print SQLAnweisung           'SQL sieht genau so aus wie es sein soll
Datenbank.Cursorlocation = 3       'hier soll die Abfrage verändert werden
rs.Open SQLAnweisung, Datenbank
rs.Close                           'der Code läuft problemlos durch, aber mit der Abfrage  _
passiert nichts... Kann mir hier jemand helfen?
SQLAnweisung = "SELECT * FROM [Abfrage 2]"  'Überschreiben der SQL-Anweisung
Datenbank.Cursorlocation = 3
rs.Open SQLAnweisung, Datenbank
rs.MoveLast
anzahl = rs.RecordCount
rs.MoveFirst
For x = 1 To anzahl
For Z = 169 To 170
Sheets("Access-Daten").Cells(Z, 54).Value = rs(0)
Sheets("Access-Daten").Cells(Z, 55).Value = rs(1)
rs.MoveNext
Next Z
Next x
rs.Close                           'Dieser Abschnitt klappt ganz hervorragend
Datenbank.Close
End Sub
Ich bin der festen Überzeugung, dass ich das noch nicht richtig geblickt habe... Ist auch das erste Mal, dass ich Access und Excel verbindend nutze.
Ich habe auch schon folgendes versucht:
CurrentDb.QueryDefs("Abfrage 1").Sql = "SELECT ..."
Da kommt bisher immer nur der mir unverständliche Laufzeitfehler 3001...
Vielen Dank schonmal im Voraus!
Liebe Grüße,
Lenny
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Änderung von Access-Abfragen mittels SQL und VBA
13.09.2016 17:15:11
Access-Abfragen
Inzwischen ist es "Laufzeitfehler 91: Objektvariable oder With-Blockvariable nicht festgelegt", _ wenn ich

CurrentDb.QueryDefs("Abfrage 1").Sql = "..."
verwende...
AW: Änderung von Access-Abfragen mittels SQL und VBA
13.09.2016 18:22:31
Access-Abfragen
Hallo Lenny,
das, was in Access klappt:
- aus einer Abfrage eine 2. Abfrage
- mit einschränkenden Bedingungen
zu Erstellen, funktioniert so bei Recordset nicht. Deshalb habe ich in der Access-DB eine
dummy-Abfrage, bei der ich per Vba
- ADODB/ADOX oder
- DAO / DAO.36 / DAO.120
die Syntax ändere/speichere und dann von dieser dummy-Abfrage das Recordset aufbaue.
Dein Lösungsversuch:
CurrentDb.QueryDefs("Abfrage 1").Sql = "..."
gehört zum DAO-Datenbank-Zugriff und hat mit ADODB nix zu tun.
Zuvor mußt man aber ein DAO-Objekt erstellen:
Dim daoObj As Object
Set daoObj = CreateObject("dao.dbengine.120") usw.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Änderung von Access-Abfragen mittels SQL und VBA
14.09.2016 09:53:15
Access-Abfragen
Hallo Luschi aus klein-Paris (wo auch immer das liegt :) ),
tausend Dank für den Hinweis! Jetzt funktioniert alles! Ich hab zwar nicht zu 100% verstanden, was ich gemacht habe bzw. was der Code jetzt im Detail bedeutet (ich muss mich mit dem Datenbankzugriff noch deutlich mehr beschäftigen), aber ich bin erstmal happy, dass es klappt.
Ich hab jetzt folgendes gemacht (Auszug):

Dim daoObj as Object
Dim db as Object
Dim strPfad as String
strPfad = Sheets("Access-Daten").Cells(261,3)     'Dateipfad aus Zelle entnehmen
SQLAnweisung = blabliblub                         'siehe ursprünglicher Code
Set daoObj = CreateObject(dao.dbengine.120)
Set db = daoObj.OpenDatabase(strPfad)
db.QueryDefs("Abfrage 1").Sql = SQLAnweisung
db.close
Set db = Nothing
Set daoObj = Nothing

Also nochmals: Tausend Dank!
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige

Infobox / Tutorial

Zugriff auf Access-Abfragen mit SQL und VBA optimieren


Schritt-für-Schritt-Anleitung

  1. Datenbankverbindung herstellen: Um eine Verbindung zu deiner Access-Datenbank herzustellen, kannst du den folgenden VBA-Code verwenden:

    Dim Datenbank As Object
    Dim strPfad As String
    strPfad = Sheets("Access-Daten").Cells(262, 3) 'Pfad auslesen
    Set Datenbank = CreateObject("ADODB.Connection")
    Datenbank.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPfad & ";"
    Datenbank.Open
  2. SQL-Abfrage anpassen: Du kannst eine SQL-Abfrage anpassen, indem du die SQL-Eigenschaft einer Abfrage in Access änderst. Hier ein Beispiel:

    Datenbank.Execute "UPDATE [Abfrage 1] SET Feld1 = 'NeuerWert' WHERE Bedingung"
  3. Daten abrufen: Um die Ergebnisse aus einer Abfrage in Excel zu übertragen, verwende den folgenden Code:

    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM [Abfrage 2]", Datenbank
  4. Daten in Excel einfügen: Übertrage die Daten in dein Excel-Blatt:

    Dim Z As Integer
    Z = 1
    Do While Not rs.EOF
       Sheets("Access-Daten").Cells(Z, 1).Value = rs.Fields(0).Value
       Z = Z + 1
       rs.MoveNext
    Loop
    rs.Close
  5. Datenbankverbindung schließen: Vergiss nicht, die Verbindung zu schließen:

    Datenbank.Close
    Set Datenbank = Nothing

Häufige Fehler und Lösungen

  • Laufzeitfehler 3001: Dieser Fehler tritt auf, wenn die SQL-Abfrage nicht korrekt ist. Überprüfe deine Abfrage auf Syntaxfehler oder ungültige Feldnamen.

  • Laufzeitfehler 91: Dies deutet darauf hin, dass ein Objekt nicht korrekt gesetzt wurde. Stelle sicher, dass dein DAO-Objekt richtig initialisiert wurde, bevor du darauf zugreifst:

    Dim daoObj As Object
    Set daoObj = CreateObject("DAO.DBEngine.120")
  • Abfrage nicht aktualisiert: Wenn die Abfrage nicht verändert wird, überprüfe, ob du die richtige Abfrage-ID verwendest und ob die SQL-Anweisung korrekt formuliert ist.


Alternative Methoden

  1. DAO anstelle von ADO: Wenn du mit Access-Abfragen arbeitest, könnte die Verwendung von DAO (Data Access Objects) für die Verwaltung von Abfragen sinnvoll sein. Hier ein Beispiel:

    Dim db As Object
    Set db = daoObj.OpenDatabase(strPfad)
    db.QueryDefs("Abfrage 1").SQL = "SELECT * FROM Tabelle WHERE Bedingung"
  2. Formeln in Abfragen: Du kannst auch Access-Formeln in deinen SQL-Abfragen nutzen, um komplexere Berechnungen durchzuführen.


Praktische Beispiele

  • SQL-Abfrage in VBA: Eine einfache SQL-Abfrage könnte so aussehen:

    Dim SQLAnweisung As String
    SQLAnweisung = "SELECT * FROM [Abfrage 1] WHERE Feld1 = 'Wert'"
    rs.Open SQLAnweisung, Datenbank
  • Datenbank abfragen: Um Daten zu filtern, kannst du Bedingungen in deiner SQL-Anweisung verwenden:

    SQLAnweisung = "SELECT * FROM [Abfrage 2] WHERE Bedingung"

Tipps für Profis

  • Verwende Parameter in SQL-Abfragen: Um deine Abfragen flexibler zu gestalten, kannst du Parameter verwenden:

    Dim cmd As Object
    Set cmd = CreateObject("ADODB.Command")
    cmd.ActiveConnection = Datenbank
    cmd.CommandText = "SELECT * FROM [Abfrage 1] WHERE Feld1 = ?"
    cmd.Parameters.Append cmd.CreateParameter(, , , , "Wert")
  • Fehlerbehandlung implementieren: Implementiere eine Fehlerbehandlung, um Laufzeitfehler zu vermeiden und eine bessere Fehlermeldung zu erhalten:

    On Error GoTo Fehlerbehandlung
    ' Code hier
    Exit Sub
    Fehlerbehandlung:
    MsgBox "Fehler: " & Err.Description

FAQ: Häufige Fragen

1. Wie kann ich eine Access-Abfrage über VBA erstellen? Du kannst eine Abfrage mit dem VBA-Befehl CreateQueryDef erstellen und die SQL-Anweisung definieren.

2. Welche Unterschiede gibt es zwischen ADO und DAO? ADO wird oft für die Kommunikation mit verschiedenen Datenquellen verwendet, während DAO speziell für die Arbeit mit Access-Datenbanken optimiert ist.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige