Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Datenbankabfrage in Excel Userform mit VBA

Datenbankabfrage in Excel Userform mit VBA
Uli
Hallo zusammen,
Ich habe das Problem, dass ich Daten aus verschiedenen Tabellen in einer Oracle Datenbank nach Excel exportieren muss. Diese sollen dann in Form einer Tabelle vorhanden sein um dann damit Diagramme erstellen zu können. Ich würde dies gerne mit VBA-Code in einer Userform realisieren. Nach Eingabe von zwei Werten in der Userform soll nach Drücken eines Buttons eine Datenbankabfrage gestartet werden die mir die benötigten Werte zu den Eingabeparametern liefert und alles in einer Tabelle ablegt. Ich würde gerne wissen welcher Code dazu nötig ist. Also vom Aufbau der DB-Verbindung bis zum SQL-Statement mit den eingegebenen Werten und der Ergebnistabelle. Ich bin um jeden Rat dankbar aber was VBA angeht leider noch ein Anfänger. Vielen Dank schon mal im Voraus.
Anzeige

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

Betreff
Benutzer
Anzeige
AW: Datenbankabfrage in Excel Userform mit VBA
08.09.2010 23:21:03
fcs
Hallo Uli,
da wirst du ohne fachlichen Beistand wohl nur schwer zurechtkommen.
1. Vorraussetzung ist, dass die entsprechenden ODBC-Treiber für die Oracle-Datenbank installiert sind.
2. Versuche dann dem Excel-Makrorekorder unter Einbeziehung von MS Querry die Daten aus der Oracle-Datenbank nach Excel zu Importieren. Definiere dabei auch Selektionskriterien soweit erforderlich.
3. Jetzt hast du das Grundgerüst zusammen, aber der Code in Excel sieht recht wild aus und die Flexibilität bzgl. Datenabfrage fehlt noch.
Nachfolgend sind Beispiele unter Excel 2007 für den Zugriff auf eine ACCESS Datenbank - Oracle ist für den Hausgebrauch dann doch etwas teuer.
DIe Beispiele zeigen den aufgezeichneten und durch die Forumssoftware noch ewas zerstückelten Code und die von mir gemachten Anpassungen für bessere Übesicht und Flexibilität bei den Kriterien.
Mein Beispiel erzeugt in Excel 2007 ein ListenObjekt mit Abfrage. Das kann in älteren Versionen noch etwas anders aussehen.
Gruß
Franz
Public sKrit1$, sKrit2$, sKrit3$
Sub Daten_Import_von_ACCESS()
' Makro per Rekorder aufgezeichnet und editiert
' MS Querry-Abfrage in eine MA Access-Datenbank
' Erstellt unter Excel 2007
Dim sSource$, sDatei$, sCom$, sDefaultDir$, wks As Worksheet
sDefaultDir = "C:\Users\Franz\Documents\Acc_db"
sDatei = "C:\Users\Franz\Documents\Acc_db\ADRESSEN.MDB"
sSource = "ODBC;DSN=MS Access Database;"
sSource = sSource & "DBQ=" & sDatei & ";" & sDefaultDir & ";"
sSource = sSource & "DriverId=281;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
'Datenfelder aus Quelltabelle
sCom = "SELECT `Abitur 1974`.Abitur, `Abitur 1974`.Familienname,`Abitur 1974`.Vorname, "
sCom = sCom & "`Abitur 1974`.PLZ, `Abitur 1974`.Ort, `Abitur 1974`.Ortsteil, "
sCom = sCom & "`Abitur 1974`.Strasse, `Abitur 1974`.Land, `Abitur 1974`.Staat "
'Quelltabelle in Datei
sCom = sCom & "FROM `" & sDatei & "`.`Abitur 1974` "
'Abfragekriterien - Die Variablen könnte man dann per Userform füllen
sKrit1 = "[A-K]%" 'Nachnamen beginnend mit A bis K
sKrit2 = "S%" 'Nachnamen beginnend mit A bis K
sKrit3 = "2%" 'PLZ beginned mit 2
sCom = sCom & "`Abitur 1974` WHERE ((`Abitur 1974`.Familienname Like '" & sKrit1 & "') "
sCom = sCom & "OR (`Abitur 1974`.Familienname Like '" & sKrit2 & "')) "
sCom = sCom & "AND (`Abitur 1974`.PLZ Like '" & sKrit3 & "') "
'Sortierung der Ausgabeliste
sCom = sCom & "ORDER BY `Abitur 1974`.Familienname, `Abitur 1974`.Vorname"
Set wks = ActiveSheet 'Zieltabelle für importierte Daten
If wks.ListObjects.Count = 1 Then wks.ListObjects(1).Delete 'Testzeile
With wks.ListObjects.Add(SourceType:=0, Source:=sSource, _
Destination:=wks.Range("$A$1")).QueryTable
.CommandText = sCom
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Daten_Test3"
.Refresh BackgroundQuery:=False
End With
End Sub
Sub Daten_Abfrage_Aktualisieren()
' Makro per Rekorder aufgezeichnet und editiert
' MS Querry-Abfrage in eine MA Access-Datenbank aktualisieren
' Erstellt unter Excel 2007
Dim sDatei$, sCom$, wks As Worksheet
sDatei = "C:\Users\Franz\Documents\Acc_db\ADRESSEN.MDB"
'Datenfelder aus Quelltabelle
sCom = "SELECT `Abitur 1974`.Abitur, `Abitur 1974`.Familienname,`Abitur 1974`.Vorname, "
sCom = sCom & "`Abitur 1974`.PLZ, `Abitur 1974`.Ort, `Abitur 1974`.Ortsteil, "
sCom = sCom & "`Abitur 1974`.Strasse, `Abitur 1974`.Land, `Abitur 1974`.Staat "
'Quelltabelle in Datei
sCom = sCom & "FROM `" & sDatei & "`.`Abitur 1974` "
'Abfragekriterien - Die Variablen könnte man dann per Userform füllen
sKrit1 = "[A-K]%" 'Nachnamen beginnend mit A bis K
sKrit2 = "T%" 'Nachnamen beginnend mit A bis K
sKrit3 = "3%" 'PLZ beginned mit 2
sCom = sCom & "`Abitur 1974` WHERE ((`Abitur 1974`.Familienname Like '" & sKrit1 & "') "
sCom = sCom & "OR (`Abitur 1974`.Familienname Like '" & sKrit2 & "')) "
sCom = sCom & "AND (`Abitur 1974`.PLZ Like '" & sKrit3 & "') "
'Sortierung der Ausgabeliste
sCom = sCom & "ORDER BY `Abitur 1974`.Familienname, `Abitur 1974`.Vorname"
Set wks = ActiveSheet 'Zieltabelle für importierte Daten
With wks.ListObjects(1).QueryTable
.CommandText = sCom
.Refresh BackgroundQuery:=False
End With
End Sub
Sub aaTest()
' aaTest Makro
' MS Querry-Datenimport aus MS ACCESS - Import-Abfrage erstellen
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=C:\USERS\Franz\Documents\Acc_db\ADRESSEN.MDB; _
DefaultDir=C:\USERS\Franz\Documents\Acc_db;DriverId=281" _
), Array(";FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;")), Destination:= _
Range("$A$1")).QueryTable
.CommandText = Array( _
"SELECT `Abitur 1974`.Abitur, `Abitur 1974`.Familienname, `Abitur 1974`.Vorname, ` _
Abitur 1974`.PLZ, `Abitur 1974`.Ort, `Abitur 1974`.Ortsteil, `Abitur 1974`.Strasse, `Abitur 1974`.Land, `Abitur 1974`.S" _
, _
"taat" & Chr(13) & "" & Chr(10) & "FROM `C:\USERS\Franz\Documents\Acc_db\ADRESSEN.MDB`.` _
Abitur 1974` `Abitur 1974`" & Chr(13) & "" & Chr(10) & "WHERE (`Abitur 1974`.Familienname Like '[A-K]%') AND (`Abitur 1974`.PLZ Like '2%') OR (`Abitur 1974`.Familienname" _
, _
" Like 'T%') AND (`Abitur 1974`.PLZ Like '2%')" & Chr(13) & "" & Chr(10) & "ORDER BY ` _
Abitur 1974`.Familienname, `Abitur 1974`.Vorname" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Tabelle_Abfrage_von_MS_Access_Database15"
.Refresh BackgroundQuery:=False
End With
End Sub
Sub Makro6()
' Makro6 Makro - Abfrage aktualisieren/neue Kriterien
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
With Selection.ListObject.QueryTable
.Connection = Array(Array( _
"ODBC;DSN=MS Access Database;DBQ=C:\Users\Franz\Documents\Acc_db\ADRESSEN.MDB;DriverId= _
281;FIL=MS Access;MaxBufferSize=2048;PageTimeo" _
), Array("ut=5;"))
.CommandText = Array( _
"SELECT `Abitur 1974`.Abitur, `Abitur 1974`.Familienname, `Abitur 1974`.Vorname, ` _
Abitur 1974`.PLZ, `Abitur 1974`.Ort, `Abitur 1974`.Ortsteil, `Abitur 1974`.Strasse, `Abitur 1974`.Land, `Abitur 1974`.S" _
, _
"taat" & Chr(13) & "" & Chr(10) & "FROM `C:\Users\Franz\Documents\Acc_db\ADRESSEN.MDB`.` _
Abitur 1974` `Abitur 1974`" & Chr(13) & "" & Chr(10) & "WHERE (`Abitur 1974`.Familienname Like '[A-K]%') AND (`Abitur 1974`.PLZ Like '2%') OR (`Abitur 1974`.Familienname" _
, _
" Like 'T%') AND (`Abitur 1974`.PLZ Like '3%')" & Chr(13) & "" & Chr(10) & "ORDER BY ` _
Abitur 1974`.Familienname, `Abitur 1974`.Vorname" _
)
.Refresh BackgroundQuery:=False
End With
End Sub

Anzeige
AW: Datenbankabfrage in Excel Userform mit VBA
09.09.2010 08:55:18
Uli
Hallo Franz,
Vielen Dank für deine schnelle Hilfe. Sinde denn alle Subs() für mein Anliegen notwendig. Eigentlich bräuchte ich doch bloß am Anfang eine Verbindung zur DB aufbauen und dann eine Abfrage mit den Parametern aus der Userform? Würde dafür "Sub Daten_Import_von_ACCESS()" nicht schon ausreichen?
Gruß Uli
Anzeige
AW: Datenbankabfrage in Excel Userform mit VBA
09.09.2010 22:04:18
fcs
Hallo Uli,
was du benötigst hängt davon ab, ob du
A) die Daten der Abfrage jedesmal in ein komplett leeres Tabellenblatt laden willst oder
B) ob du die Daten einer vorhandene Abfrage mit anderen Abfrageparametern aktualisieren willst.
Für Fall A) benötigst du Makro "Daten_Import_von_ACCESS"
Für Fall B) benötigst du Makro "Daten_Abfrage_Aktualisieren"
Makros aaTest und Makro6 hatt ich nur mit hochgeladen, um zu demonstrieren, in welche Richtung du einen mit dem Recorder aufgezeichenten Code umbauen muss.
Gruß
Franz
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Datenbankabfrage in Excel Userform mit VBA


Schritt-für-Schritt-Anleitung

  1. ODBC-Treiber installieren: Stelle sicher, dass die entsprechenden ODBC-Treiber für deine Oracle-Datenbank installiert sind. Dies ist eine grundlegende Voraussetzung für die Verbindung.

  2. Excel Userform erstellen: Öffne Excel und erstelle eine neue Userform, in der du die Eingabefelder für die Datenbankabfrage anlegst.

  3. VBA-Code einfügen: Öffne den VBA-Editor (ALT + F11) und füge den folgenden Code in das Modul ein:

    Public sKrit1 As String, sKrit2 As String
    Sub Daten_Import_von_ACCESS()
        Dim sSource As String, sDatei As String, sCom As String
        sDatei = "C:\Users\DeinBenutzername\Documents\DeineDatenbank.MDB"
        sSource = "ODBC;DSN=MS Access Database;DBQ=" & sDatei & ";"
    
        ' SQL-Abfrage definieren
        sCom = "SELECT * FROM DeineTabelle WHERE Bedingung = '" & sKrit1 & "';"
    
        ' Daten in Excel importieren
        With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=sSource, Destination:=ActiveSheet.Range("$A$1")).QueryTable
            .CommandText = sCom
            .Refresh BackgroundQuery:=False
        End With
    End Sub
  4. Eingaben aus der Userform einlesen: Füge Logik hinzu, um die Eingaben von der Userform zu lesen und die Variablen sKrit1 und sKrit2 zu setzen.

  5. Makro ausführen: Erstelle einen Button auf der Userform, der das Makro Daten_Import_von_ACCESS ausführt, sobald der Benutzer die Eingaben abgeschlossen hat.


Häufige Fehler und Lösungen

  • Fehler: "ODBC-Verbindung kann nicht hergestellt werden"
    Lösung: Prüfe, ob der ODBC-Treiber korrekt installiert ist und ob die DSN-Einstellungen stimmen.

  • Fehler: "SQL-Syntaxfehler"
    Lösung: Überprüfe deine SQL-Abfrage auf korrekte Syntax und stelle sicher, dass die Tabellennamen und Spaltenbezeichner korrekt sind.

  • Fehler: "Leeres Tabellenblatt"
    Lösung: Stelle sicher, dass die Abfrage tatsächlich Ergebnisse liefert. Überprüfe die Abfragebedingungen.


Alternative Methoden

  • MS Query verwenden: Du kannst auch MS Query nutzen, um Daten aus einer Datenbank zu importieren. Diese Option bietet eine benutzerfreundliche Oberfläche für Datenabfragen.

  • Power Query: In neueren Excel-Versionen gibt es die Möglichkeit, Power Query zu verwenden, um Daten aus verschiedenen Quellen abzurufen und zu transformieren.


Praktische Beispiele

  1. Datenbankabfrage mit Access:

    sCom = "SELECT Name, Vorname FROM Kunden WHERE Stadt = 'Berlin';"
  2. Datenbankabfrage mit Oracle:

    sCom = "SELECT * FROM Bestellungen WHERE Bestelldatum > '2023-01-01';"

Diese Beispiele zeigen, wie du spezifische Daten aus deiner Datenbank abfragen kannst. Achte darauf, dass die SQL-Syntax je nach Datenbank variieren kann.


Tipps für Profis

  • Code modularisieren: Teile deinen Code in verschiedene Subs auf, um die Wartbarkeit zu erhöhen. Du kannst z.B. eine separate Sub für die Datenbankverbindung und eine für die Abfragen verwenden.

  • Fehlerbehandlung einfügen: Nutze On Error Resume Next und On Error GoTo zur Fehlerbehandlung, um die Stabilität deiner VBA-Anwendung zu verbessern.

  • Dokumentation: Kommentiere deinen Code ausreichend, sodass du und andere ihn später leichter verstehen können.


FAQ: Häufige Fragen

1. Welche Excel-Version benötige ich für VBA-Datenbankabfragen?
Für die Nutzung von VBA zur Durchführung von Datenbankabfragen benötigst du mindestens Excel 2007 oder eine neuere Version.

2. Wie kann ich eine Verbindung zu einer SQL-Datenbank herstellen?
Verwende die ODBC-Verbindung, um eine Verbindung zu einer SQL-Datenbank herzustellen. Stelle sicher, dass der richtige Treiber installiert ist.

3. Kann ich mehrere Abfragen in einem Makro kombinieren?
Ja, du kannst mehrere Abfragen in einem Makro kombinieren, indem du die entsprechenden SQL-Statements in verschiedenen Variablen speicherst und diese nacheinander ausführst.

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