Live-Forum - Die aktuellen Beiträge
Datum
Titel
03.05.2024 10:49:02
03.05.2024 10:43:56
03.05.2024 07:38:32
Anzeige
Archiv - Navigation
1928to1932
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ADO Daten importieren

ADO Daten importieren
22.05.2023 08:55:00
Thomas

Hallo zusammen

leider bin ich nicht so fit in VBA Programmierung, ich habe folgendes Problem- ich möchte aus mehreren Dateien (für jedes Monat eine) Daten in eine Auswertung importieren ohne diese zu öffnen.

Hierzu habe ich ein Programm (Modul) das auch einwandfrei funktioniert - allerdings brauch ich für jede Monatsdatei ein eingenes Modul weil sich der Namen der Datei aus der ich importiere und der Platz wohin die Daten sollen jedes Monat ändert. Deshalb habe ich das versucht über Variabe zu lösen.

Das mit dem Dateinamen funktioniert schon mal allerdings sobald ich statt der Zeile Tabelle1.Range("A14").CopyFromRecordset rs die Zeile mit der Variablen sziel.CopyFromRecordset rs aktiviere bekomme ich eine Fehlermeldung. Wenn die sziel-Zeile aber deaktiviert ist bekomme ich im Direktfenster folgendes ausgegeben Tabelle1.Range("A14").

Kann mir jemand helfen wo hier mein Fehler liegt - Vielen Dank schon mal

Sub ADOK01a()
'Variablen deklarieren
Dim Connection As New ADODB.Connection
Dim Query As String
Dim rs As New ADODB.Recordset
Dim arr As Variant
Dim spfad As String, sziel As String
spfad = Tabelle5.Range("C19").Value
sziel = Tabelle5.Range("C22").Value
'Connection herstellen
'Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=ielpfadZ;HDR=Yes';"
Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & spfad
'Query definieren und ausführen
Query = "SELECT * FROM [Auswertung Summe$]"
rs.Open Query, Connection
'Daten ins Tabellenblatt laden
Debug.Print sziel
'Tabelle1.Range("A14").CopyFromRecordset rs
sziel.CopyFromRecordset rs
rs.Close
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ADO Daten importieren
22.05.2023 09:39:03
Yal
Hallo Thomas,

Ein "String" ist kein "Integer", und so auch ist ein String keine Zelle.
Wenn Du sagst:
sziel = Tabelle5.Range("C22").Value
machst Du aus sziel eine String- oder Number-Variable, je nach dem, was in der Zelle vorliegt.
dann versuchst Du auf diese String-Variable ein Objekt-Inhalt reinzupasten (über eine Methode, die nur auf Zelle existiert).
("Option Explicit" sollte Pflicht sein!)

richtig wäre:
Dim rngZiel As Range
Set rngZiel = Tabelle5.Range("C22")
rngZiel.CopyFromRecordset rs
VG
Yal


Anzeige
AW: ADO Daten importieren
22.05.2023 09:58:31
Pappawinni
Moin Yal,

wenn ich es recht verstehe, hat Thomas in Tabelle5.Range("C22") den Wert "Tabelle1.Range("A14")" stehen und das soll eben das Ziel sein.
D.h. er müsste sich aus diesem Wert eine Range basteln, oder?


AW: ADO Daten importieren
22.05.2023 10:49:21
Yal
Ach so. Besser wäre, die Zieladresse in Form "Tabelle1!A14" zu hinterlegen, dann könnte man besser abgreifen:

Sub test()
Dim A
Dim Z As Range

    A = Split(Worksheets("Tabelle5").Range("C22"), "!")
    Set Z = Worksheets(A(0)).Range(A(1))
    
'Prüfung:
    MsgBox "Teil1: " & A(0) & vbCr _
        & "Teil2: " & A(1) & vbCr _
        & "ZielWs: " & Z.Worksheet.Name & vbCr _
        & "ZielAdresse: " & Z.Address
End Sub
VG
Yal


Anzeige
AW: ADO Daten importieren
22.05.2023 11:36:08
Pappawinni
D.h. unter der Voraussetzung, dass das Ziel in der Zelle C5 der Tabelle5 in der Form
Tabelle1!A14
angegeben wird, und damit sziel den entsprechenden Wert erhält, könnte man das einfach so lösen:


Sub ADOK01a()
'Variablen deklarieren
Dim Connection As New ADODB.Connection
Dim Query As String
Dim rs As New ADODB.Recordset
Dim arr As Variant
Dim spfad As String, sziel As String
spfad = Tabelle5.Range("C19").Value
sziel = Tabelle5.Range("C22").Value
'Connection herstellen
'Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=ielpfadZ;HDR=Yes';"
Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & spfad
'Query definieren und ausführen
Query = "SELECT * FROM [Auswertung Summe$]"
rs.Open Query, Connection
'Daten ins Tabellenblatt laden
Debug.Print sziel
Dim A 
Dim rngZiel as Range
A = Split(sziel, "!")
set rngZiel = Worksheets(A(0)).Range(A(1))
rngZiel.CopyFromRecordset rs
rs.Close
End Sub



Anzeige
AW: ADO Daten importieren
22.05.2023 11:51:14
Pappawinni
oh Mann, es muss natürlich heißen...
D.h. unter der Voraussetzung, dass das Ziel in der Zelle C22 der Tabelle5 in der Form
Tabelle1!A14
angegeben wird, und damit sziel den entsprechenden Wert erhält.


AW: ADO Daten importieren
24.05.2023 14:20:50
Thomas
Hallo Pappawinni
vielen Dank für die Infos ihr seit die ersten die mein Problem erkannt haben
bei deer lösung kommt bei der Zeie
set rngZiel = Worksheets(A(0)).Range(A(1))
Laufzeitfehler 9 - index außerhalb des gültigen Bereichs
für mich zum Verständnis was bedeuten die Lila zahlen 0 und 1 muss ich da was eintragen oder so übernehmen
Grüße Thomas


Anzeige
AW: ADO Daten importieren
24.05.2023 18:39:25
Yal
Hallo Thomas,

platziere in dem Code den Cursor auf "Split(" und drücke Strg+F1. So gelangst Du auf die Onlinehilfe der Function Split. So kommst Du immer weiter.

Split teilt eine String nach dem gegebenen Trenner (in dem Fall "!") und erzeugt damit einen Array. Wir hatten mehrfach darauf hingewiesen, dass die Definition deiner Zielzelle in C22 nach dem Muster Tabelle1!A1 eingetragen werden sollte. So erzeugt der Split eine Trennung in einer 2-zelligen Array: was vor und was nach der Ausrufenzeichen steht.
Da die Index immer mit 0 anfangen, sind diese Array-Element mit den Index 0 und 1 erreichbar: A(0) = "Tabelle1", A(1)="A1".
Hast Du aber keine Blattname aber nur die Zelleadresse eingetragen, so fehlt einen "!". Der Split erzeugt dann nur einen einzelligen Array und nur A(0) steht zur Verfügung. Der Versuch A(1) zu lesen wird mit einem "index außerhalb des gültigen Bereichs" quitiert.

Es könnte auch sein, dass Du dich vertippt hast und (z.b.) "Tabele1" eingetragen. Dann sucht den Code ein Blatt mit dem Namen "Tabele1". Wenn diese nicht gibt, auch ausserhalb der liste der verfügbaren Blätter.

VG
Yal


Anzeige
AW: ADO Daten importieren
24.05.2023 19:36:23
Pappawinni
Es macht natürlich Sinn, Benutzereingaben, wie den Wert der Zelle C22 in Tabelle 5 zu validieren, also zu prüfen, ob das auch eine gültige Eingabe ist.
du kannst ja mal vor
set rngZiel = Worksheets(A(0)).Range(A(1))
ein
debug.print UBound(A)
setzen. UBound(A) liefert dann die obere (Upper) Grenze (Bound) des Index für das Array A. Da sollte dann eine 1 raus kommen.
Wenn das i.O. ist, dann kannst du dir auch die Werte ausgeben lassen.
debug.print A(0), A(1)
Vielleicht dann auch so:
if ubound(A) =1 then
debug.print A(0), A(1)
else
Msgbox "Ziel enthält kein oder zu viele Ausrufezeichen"
end if
Wenn dann keine Messagebox kommt und danach trotzdem ein Fehler auftritt, dann existiert wahrscheinlich die Tabelle (A(0)) nicht, oder die Zelladresse (A(1)) ist ungültig...


Anzeige
AW: ADO Daten importieren
25.05.2023 08:54:21
Thomas
Hallo zusammen
ich bin einen Schritt weitervielen Dank für die unterstüzung
allerdings kommt die Fehlermeldung immer noch
hier mein Code und die Ausgabe im Direktfenster nach meiner Meinungmüsste das alles passen.

Sub ADOK01c()
'Variablen deklarieren
Dim Connection As New ADODB.Connection
Dim Query As String
Dim rs As New ADODB.Recordset
Dim arr As Variant
Dim spfad As String, sziel As String
spfad = Tabelle5.Range("C19").Value
sziel = Tabelle5.Range("C22").Value
'sziel = Tabelle1.Range("A1").Value
'Connection herstellen
'Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=ielpfadZ;HDR=Yes';"
Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & spfad
'Query definieren und ausführen
Query = "SELECT * FROM [Auswertung Summe$]"
rs.Open Query, Connection
'Daten ins Tabellenblatt laden
Debug.Print sziel
Dim A
Dim rngZiel As Range
A = Split(sziel, "!")
Debug.Print A(0), A(1)
Set rngZiel = Worksheets(A(0)).Range(A(1))
Debug.Print rngZiel
rngZiel.CopyFromRecordset rs
rs.Close
End Sub
Direktfenster
Tabelle1!A14
Tabelle1 A14


Anzeige
AW: ADO Daten importieren
25.05.2023 14:55:23
Pappawinni
debug.print rngZiel
bringt sicher nichts. rngZiel sollte Range-Objekt sein. Da kannst du vielleicht mit
Debug.Print rngZiel.Worksheet.Name, rngZiel.Address
etwas erreichen.
Wenn aber vorher ein Fehler eintritt, bringt das ja auch nichts.
Es sieht jedenfalls so aus, als würden A(0) und A(1) die passenden Werte enthalten, aber vielleicht hast du da ein Leerzeichen rein geschummelt.
Probier mal.

Set rngZiel = Worksheets(trim(A(0))).Range(A(1))
Ich hoffe mal, dass das Worksheet Tabelle1 existiert.


Anzeige
AW: ADO Daten importieren
25.05.2023 15:14:31
Pappawinni
Oder...
Deine Tabelle1 hat einen anderen Namen..
was kommt denn raus, wenn du mal vor dem Fehler
Debug.Print Tabelle1.CodeName, Tabelle1.Name
rein setzt...


AW: ADO Daten importieren
25.05.2023 20:02:57
Yal
Moin,

für eine fehlertolerante Handlung+Prüfung empfiehlt sich manche Behandlung in einer separaten Function auszulagern.

Sub ADOK01c()
Dim Connection As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rngZiel As Range

Const cQuery = "SELECT * FROM [Auswertung Summe$]"

    With Worksheets("Tabelle5")
    'Gültigkeit prüfen
        Set rngZiel = Range_ermitteln(.Range("C22").Value)
        If rngZiel Is Nothing Then
            MsgBox "Adresse """ & .Range("C22").Value & """ lässt sich nicht in einer gültigen Adresse umwandeln."
            Exit Sub
        End If
    'Daten abfragen und zurückgeben
        'Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=ielpfadZ;HDR=Yes';"
        Connection.Open "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & .Range("C19").Value
        rs.Open cQuery, Connection
    
        rngZiel.CopyFromRecordset rs 'Daten ins Tabellenblatt laden
        rs.Close
    End With
End Sub

Private Function Range_ermitteln(ByVal ZelleAdresse As String) As Range
Dim A, W
    On Error Resume Next
    A = Split(ZelleAdresse, "!")
    Set W = Worksheets(Trim(A(0)))
    If W Is Nothing Then Exit Function
    Set Range_ermitteln = W.Range(Trim(A(1)))
End Function
VG
Yal


Anzeige
AW: ADO Daten importieren
25.05.2023 22:18:03
Pappawinni
Hallo Yal,
ich gehe davon aus, dass Tabelle1 nicht den Namen Tabelle1 hat.
Da hat uns unser TO ganz schön auf den Holzweg geführt.
Ich hätte früher drauf kommen können, wenn einer schon zwischen Objekt und Stringvariable nicht unterscheiden kann...wie kann er zwischen Sheet Objekt und Sheet Name unterscheiden??....


AW: ADO Daten importieren
26.05.2023 10:02:22
Yal
Du meinst die Unterschied zwischen

Worksheets("Tabelle5").Range("C22").Value 'über den Blattname
und
Tabelle5.Range("C22").Value 'über den internen Namen des Objekts
Eigentlich trägt er in der Zelle C22 den sichtbaren Namen des Blattes und somit sollte der Umwandlung von "Tabelle1!A1" in Worksheets("Tabelle1").Range("A1") kein Problem sein.
Ob Tabelle5.Range(..) tatsächlich Worksheets("Tabelle5").Ra.. entspricht, hätte schon viel früher Problem verursachen müssen, daher gehe ich nicht davon aus, dass das Problem ist. Ausserdem sind Tabelle1, 2, ... die Standardnamen. Wenn man sie nicht anfasst, sollte nicht zu einem "Tabelle5 ist eigentlich Tabelle3" führen.

Nur Spekulation.

VG
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige