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

ADODB.Connection

Forumthread: ADODB.Connection

ADODB.Connection
02.11.2021 17:47:31
Dom
Hallo Zusammen
in meinem Code führe ich zwei Subs hintereinander aus Sub: CS und Sub: CP.
Für die Connection.Open habe ich eine Public Const DB deklariert.
Meine Frage: Kann ich eine Public Konstante für die Query = "SELECT * FROM [HIER eine Konstante ?] deklarieren ?
und
Kann ich die beiden Subs zusammenfassen ?
''Varibale für den Pfad (hier Pfad ändern)
Public Const DB As String = "C:\Users\d01\OneDrive-T\Cfile\Datenbank.xlsm"

Sub CS()
'Zuerst unter Extras\Verweise\MS ActiveX Data Objects 6.1 Libary aktivieren
'Variablen deklarieren
Dim Connection As New ADODB.Connection
Dim Query As String
Dim rs As New ADODB.Recordset
Dim arr As Variant
'Connection herstellen
Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ= " & DB & " ;HDR=Yes';"
''Query definieren und ausführen SQL Anweisung
Query = "SELECT * FROM [Tabelle2$] WHERE Process = 'CS'"       Wichtig !!! From[Name des Worksheets der Datenbank Mappe]
rs.Open Query, Connection
'Daten ins Tabellenblatt laden
Worksheets("Auszug").Select
Range("A" & LetzteZeileAdvanced(1) + 1).CopyFromRecordset rs
Cells.EntireColumn.AutoFit
Connection.Close
End Sub

Sub CP()
'Variablen deklarieren
Dim Connection As New ADODB.Connection
Dim Query As String
Dim rs As New ADODB.Recordset
Dim arr As Variant
'Connection herstellen
Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DB & ";HDR=Yes';"
'Query definieren und ausführen
Query = "SELECT * FROM [Tabelle2$] WHERE Process = 'CP'"
rs.Open Query, Connection
'Daten ins Tabellenblatt laden
Worksheets("Auszug").Select
Range("A" & LetzteZeileAdvanced(1) + 1).value = ("Manage (CP)")
Range("A" & LetzteZeileAdvanced(1) + 1).CopyFromRecordset rs
Cells.EntireColumn.AutoFit
Connection.Close
End Sub
Vielen Dank !
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ADODB.Connection
02.11.2021 19:10:04
ChrisL
Hi
Ja, du kannst...

Query = "SELECT * FROM [Tabelle2$] WHERE Process = '" & Variable & "'"
Kann man als Konstante machen, muss man aber nicht. Ein öffentliche/public Konstante wie beim Dateipfad würde ich eher nicht machen, wenn man davon ausgeht, dass sich die Kürzel nie ändern werden.
Beim Pfad macht es Sinn, wenn man diesen bei Änderung zentral an nur einer Stelle anpassen will und der Pfad in verschiedenen Prozeduren verwendet wird. CS/CP wird wahrscheinlich nur in dieser einen Prozedur verwendet und ändert sich kaum (=Annahme).
Die zwei kleinen Schnipsel könnte man m.E. auch so stehen lassen. Wenn du aber deine VBA-Kenntnisse weiter ausbauen willst, dann würde ich dir im vorliegenden Fall eine Parameterübergabe empfehlen. Hier mal ein zufällig ausgewähltes Tutorial, aber bei Bedarf findest du sicherlich noch andere Beschreibungen:
https://www.youtube.com/watch?v=Ir7a65Lzjvg
Wenn du dich mit dem Prinzip vertraut gemacht hast, kannst du gerne mal dein Beispiel posten. Vielleicht lässt sich abschliessend noch ein wenig optimieren (Verbindung nur einmal aufbauen).
Und von wegen optimieren, bitte Select/Activate vermeiden:
https://www.herber.de/vbabasics/0009.html
cu
Chris
Anzeige
AW: ADODB.Connection
02.11.2021 23:34:12
Yal
Hallo Dom,
diese Query-Variable ist zuerst nichts anderes als einen String-Variable. String werden mit "&" zusammengefasst. Das verwendest Du schon u.a. in Connection.Open.

Const ZielTabelle = "Tabelle2"
Sub CS
Query = "SELECT * FROM [" & ZielTabelle & "] WHERE Process = 'CS'"
End Sub
Sub CP
Query = "SELECT * FROM [" & ZielTabelle & "] WHERE Process = 'CP'"
End Sub
VG
Yal
Anzeige
AW: ADODB.Connection
03.11.2021 08:13:17
Dom
Public Const ZT As String = "Auszug$"
Query = "SELECT * FROM [" & ZT & "] WHERE Process = 'CS'"
so klappt es :) Vielen Dank !
AW: ADODB.Connection
03.11.2021 08:16:36
Dom
Noch eine Frage:
Meine Tabelle hat die Spalten von A bis K. Über die Abfrage werden aber nur die Inhalte von A bis E übertragen.
Die anderen Spalten bleiben leer.
Habt ihr eine Idee woran das liegt ?
Danke !
Anzeige
AW: ADODB.Connection
03.11.2021 09:12:20
Yal
Hallo Dom,
Du machst einen "Select <Stern> ...", dass heisst es liefert alle Spalten, die in Quelle sind.
Genauer wäre die Benennung von diesen Spalten
"Select Datum, Person, Kunden, Produkt, ... From [Tabx] Where ..."
Auch den Filter könnte dazu führen, dass beim Fall CS oder CP die letzten 5 Spalten nicht befüllt sind.
Ich würde aber nicht relational auf Excel aufbauen. Schaue Dir schnellsten Access an. Mit ein paar Tutorial ist der Einstieg recht einfach.
VG
Yal
Anzeige
AW: ADODB.Connection
03.11.2021 09:31:14
Dom
Hallo Yal,
ich habe den Fehler gefunden: In Spalte F ist ein Text mit 312 Zeichen, wenn ich die Anzahl der Zeichen reduziere geht es, dass alle Spalten mit Inhalt übertragen werden. Gibt es ein Zeichenlimit bei der Abfrage ?
Danke
;
Anzeige

Infobox / Tutorial

ADODB.Connection in VBA: So gelingt die Verbindung zu Excel


Schritt-für-Schritt-Anleitung

  1. Verweis aktivieren: Stelle sicher, dass die "Microsoft ActiveX Data Objects x.x Library" in den Verweisen aktiviert ist.
  2. Konstante für den Datenbankpfad definieren:
    Public Const DB As String = "C:\Users\d01\OneDrive-T\Cfile\Datenbank.xlsm"
  3. ADODB.Connection erstellen:
    Dim Connection As New ADODB.Connection
  4. Verbindung öffnen:
    Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DB & ";HDR=Yes;"
  5. SQL-Query definieren:
    Dim Query As String
    Query = "SELECT * FROM [Tabelle2$] WHERE Process = 'CS'"
  6. Daten abrufen:
    Dim rs As New ADODB.Recordset
    rs.Open Query, Connection
  7. Daten ins Tabellenblatt übertragen:
    Worksheets("Auszug").Range("A1").CopyFromRecordset rs
  8. Verbindung schließen:
    Connection.Close

Häufige Fehler und Lösungen

  • Verbindung schlägt fehl: Überprüfe den provider und die DSN-Einstellungen. Stelle sicher, dass der Pfad zur Excel-Datei korrekt ist.
  • Leere Spalten nach der Abfrage: Stelle sicher, dass die Filterkriterien in der SQL-Query korrekt sind. Verwende spezifische Spaltennamen statt SELECT *.
  • Zeichenlimit bei der Abfrage: Achte darauf, dass Textinhalte in den Zellen nicht die maximal erlaubte Anzahl an Zeichen überschreiten. Excel hat ein Limit von 32.767 Zeichen pro Zelle.

Alternative Methoden

  • ADO.NET: Wenn Du .NET-Anwendungen entwickelst, kannst Du die ADO.NET-Bibliothek verwenden, um Datenbankverbindungen zu verwalten.
  • ODBC-Treiber: Verwende ODBC-Treiber für eine breitere Unterstützung von Datenquellen.
  • VBA-Parameterübergabe: Parameterübergaben in deinen Subs können die Wiederverwendbarkeit und Lesbarkeit deines Codes erhöhen.

Praktische Beispiele

Hier sind zwei einfache Beispiele zur Verwendung von adodb.connection in VBA:

Beispiel für CS-Prozess:

Sub CS()
    Dim Connection As New ADODB.Connection
    Dim Query As String
    Dim rs As New ADODB.Recordset
    Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DB & ";HDR=Yes;"
    Query = "SELECT * FROM [Tabelle2$] WHERE Process = 'CS'"
    rs.Open Query, Connection
    Worksheets("Auszug").Range("A1").CopyFromRecordset rs
    Connection.Close
End Sub

Beispiel für CP-Prozess:

Sub CP()
    Dim Connection As New ADODB.Connection
    Dim Query As String
    Dim rs As New ADODB.Recordset
    Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DB & ";HDR=Yes;"
    Query = "SELECT * FROM [Tabelle2$] WHERE Process = 'CP'"
    rs.Open Query, Connection
    Worksheets("Auszug").Range("A1").CopyFromRecordset rs
    Connection.Close
End Sub

Tipps für Profis

  • Vermeide Select/Activate: Verwende direkte Zellreferenzen, um die Leistung zu verbessern.
  • Nutze With-Anweisungen: Dies kann deinen Code lesbarer machen und die Ausführung beschleunigen.
  • Fehlerbehandlung: Implementiere On Error-Anweisungen, um potenzielle Laufzeitfehler abzufangen.

FAQ: Häufige Fragen

1. Kann ich eine Konstante für die SQL-Query verwenden? Ja, Du kannst eine Konstante deklarieren, aber es ist oft sinnvoller, die Query dynamisch zu gestalten, um Flexibilität zu gewährleisten.

2. Warum werden nicht alle Spalten übertragen? Wenn in einer der Spalten Inhalte sind, die das Zeichenlimit überschreiten, kann dies dazu führen, dass die Abfrage fehlschlägt. Überprüfe die Daten in diesen Zellen.

3. Wie kann ich eine ADODB.Connection in einer anderen Sub verwenden? Du kannst die Verbindung als Public deklarieren, sodass sie in mehreren Subs zugänglich ist. Achte jedoch darauf, sie ordnungsgemäß zu schließen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige