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

Mehrere csv Dateien importieren

Forumthread: Mehrere csv Dateien importieren

Mehrere csv Dateien importieren
05.03.2025 18:03:23
Anja_089
Hallo,

ich habe folgenden code, den ich schon viele Jahre verwende.

Jetzt möchte ich ihn gerne erweitern, aber alles was ich probiert habe funktioniert nicht. Kann mir jemand helfen? Vielen Dank in voraus.
Leider verwenden meine Arbeitgeber noch Excel 19. Daher bitte keinen Code benutzen, der nur auf höhere Versionen funktioniert.

Ich möchte gerne:

-Mehrere cvs-Dateien mit gleichem Aufbau in Excel exportieren.
-Es soll kein fester Ordner sein, sondern vom Benutzer frei gewählt werden
-Die einzelnen Dateien sollen vom Benutzer ausgewählt werden können. (Also nicht automatisch alle Dateien aus dem Ordner importieren)
-Die Daten sollen untereinander in der Tabelle importiert werden
-Ich möchte selber bestimmen wo die Daten eingefügt werden sollen: Beispiel Daten sollen ab Zelle B 14 eingefügt werden
-Ich möchte das Tabellenblatt der Quelldatei und der Zieldatei selber benennen können.
Beispiel:
Set Ziel = ThisWorkbook.Worksheets("Test") oder Worksheets(2)
Set Quelle = wbQuelle.Worksheets(1)





Code





Private Sub cmdImport_Click()


Application.ScreenUpdating = False


Dim Datei As String
ChDrive Left(ThisWorkbook.Path, 1)
ChDir ThisWorkbook.Path
Datei = Application.GetOpenFilename("Text-Dateien(*.csv),*txt")
'Datei = Application.GetOpenFilename("Textdateien (*.csv; *.txt),*.csv; *.txt")


Application.ScreenUpdating = False

Rows("6:6").Select
Selection.Copy
Rows("8:2011").Select
ActiveSheet.Paste
Range("D8").Select
Application.CutCopyMode = False
Selection.ClearContents


If Not LCase(Datei) Like "fal*" Then

With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & Datei, Destination:=Range("$D$8"))
' .Name = "Insplan"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
.Delete
End With

End If

Application.ScreenUpdating = True



End Sub


Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrere csv Dateien importieren
05.03.2025 20:33:51
Yal
Hallo Anja,

bis ein paar Beschränkung würde ich den Vorhaben mit Power Query lösen anstatt VBA.
Im Grund genommen verwendest Du sogar Power Query. Ohne es zu wissen: ActiveSheet.QueryTables.Add und alles was danach kommt, ist der Rumpf eine PQ-Abfrage mit Ausgabe in Zelle D8. Liest aber nur ein einzige Datei.

Die Vorgehensweise, die ich in dem Fall verwende hat folgende Elemente:
- eine Zelle, die den Pfad enthält, wo die Datei zu lesen sind (kein PQ Element, sondern nur eine benannte Zelle. Das Abholen des Pfads kann mit VBA unterstützt werden)
- daraus wird der Inhalt des Verzeichnisses mit PQ (Abfrage 1) gelesen und in einer Excel-Tabelle ausgegeben
- in der letzte leere Spalte legt der User ein Marker: "x", oder irgendwas, hauptsache nicht leer
- diese Tabelle wird mit PQ gelesen (Abf 2) und die ausgewählte Dateien herausgefiltert
- die Inhalte der Dateien werden anhand einer 3te Abfrage gelesen und alle zusammen in einer Ausgabetabelle ausgegeben (Position nach Wahl, aber dann fest). Filterung, Aggregation oder sonstige Transformation könnte auch davor vorgenommen werden.

Es ist schlank, sehr stabil und bedarf keine grosse Anweisung, falls ich das Werkzeug jemanden in die Hand lege. Kein VBA, lauft daher ohne Sicherheitsrisiko.

Wenn Du an eine solche Lösung Interesse hast, einfach winken.
Wenn Du vorab Power Query anschauen möchtest: https://excelhero.de/power-query/power-query-ganz-einfach-erklaert

VG
Yal
Anzeige
AW: Mehrere csv Dateien importieren
05.03.2025 21:43:47
Uduuh
Hallo,
-Ich m&oumlchte selber bestimmen wo die Daten eingef&uumlgt werden sollen: Beispiel Daten sollen ab Zelle B 14 eingef&uumlgt werden
-Ich m&oumlchte das Tabellenblatt der Quelldatei und der Zieldatei selber benennen k&oumlnnen.

wie stellst du dir das vor?

Gru&szlig aus'm Pott
Udo
Anzeige
AW: Mehrere csv Dateien importieren
09.03.2025 00:58:52
Anja_089
Hallo Udo, Hallo Oberschlumpf,

ich benötige eine code den ich selber anpassen kann, damit ich ihn auf die jeweiligen Gegebenheiten anpassen kann.

Quelldatei
Bei csv.Dateien gibt es oft eine Überschrift, die ich nicht importieren will. Sprich der Import der Daten soll z.B. erst ab Zeile 2 oder 3 stattfinden.
Ich will mehrere Dateien gleichzeitig importieren, die ich selber in einem Ordner auswählen kann.
Die Dateien sind gleich aufgebaut, haben jedoch unterschiedliche Zeilenlängen. Also mal mehr oder weniger Daten. Daher muss in jeder importierenden Datei die ermittelt werden, wo die jetzt beschriebenen Zeile vorhanden ist.
Ich will bestimmen können welche Spalten ich importieren kann, weil ich einen Teil der Daten nicht benötige. Spalten A-K.
Sie sollen bei Import untereinander eingefügt werden. Die Daten sind immer im ersten Tabellenblatt vorhanden, haben aber unterschiedlichen Namen in dem Register. Somit muss das Tabellenblatt mit zb. Tabelle 1 (Worksheet (1))und nicht mit dem Namen angesprochen werden.


Zieldatei
Ich habe 12 Tabellenblätter in dem sich jeweils ein Button befindet. Wenn man dauf klickt, sollen die Daten an einer Stelle eingefügt werden, die ich selber bestimmen kann. In den Tabellenblättern sind Überschriften vorhanden, also muss der Import erst ab Zeile A8 erfolgen. Neben den importierten Daten stehen Formeln, die nicht überschrieben werden sollen. Also Daten nur von Spalte A-K einfügen. Ich möchte selber entscheiden in welches Tabellenblatt die Daten importiert werden sollen.

Es ist wahrscheinlich einfacher, die Daten in ein neutrales Tabellenblatt zu importieren und von dort aus in das jeweilige Tabellenblatt zu übertragen. So kann ich es per Werte einfügen übertragen, womit dann auch die Formatierungen nicht überschrieben werden. Egal von welchem Tabellenblatt ich den Button aufrufe.


Codes
Anbei ein Codes für den Import von Dateien aus einem Excelsheet. So etwas in der Art brauche ich nur für csv Dateien. Da funktioniert er nämlich nicht, weil die Daten nicht getrennt werden. Mit diesem Code arbeite ich schon viele Jahre. Ich importiere auch hier die Daten erst einmal in ein neutrales Tabellenblatt und übertrage von dort aus die Daten in die gewünschten Tabellenblätter.




Private Sub cmdImportB_Click()

On Error Resume Next

ActiveWindow.ScrollColumn = 1

ActiveSheet.ShowAllData
ActiveSheet.Range("A16:AN30000").EntireRow.Hidden = False
'ActiveSheet.Range("A16:S30000").FormatConditions.Delete


On Error GoTo errExit

Dim wbQuelle As Workbook, Quelle As Worksheet, Ziel As Worksheet
Dim Datei As Variant, varDateien
Dim Zeile_Z As Long, Zeile_S1 As Long, Zeile_S2 As Long
Dim rngZelle As Range

' ++++++++++++++++++++
Dim lngAnzahl As Long
Dim lngLastQ As Long

'Worksheets("Einträge").Visible = True
Sheets("Einträge").Activate

On Error GoTo Fehler

'Dialog "Datei öffnen" anzeigen
varDateien = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlsx; *.xlsm)," & _
"*.xls; *.xlsx; *.xlsm", _
Title:="Bitte zu importieren Datei(en) auswählen", MultiSelect:=True)

' ++++++++++++++++++++
' For lngAnzahl = LBound(varDateien) To UBound(varDateien)


'Abbrechen falls keine Datei ausgewählt
If Not IsArray(varDateien) Then
MsgBox "keine Datei ausgewählt", , "Abbruch"
Exit Sub
End If

With Application

.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual

Application.DisplayAlerts = False


End With

' Zieldatei

Set Ziel = ThisWorkbook.Worksheets("Test")
With Ziel
'Startzeile setzen
Set rngZelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
If rngZelle Is Nothing Then
Zeile_Z = 14
Else
Zeile_Z = rngZelle.Row
End If
If Zeile_Z 14 Then
Zeile_Z = 14
Else
Zeile_Z = Zeile_Z + 1
End If
End With

'Ausgewählte Datei abarbeiten
For Each Datei In varDateien
' MsgBox "Ausgewählte Datei: " & Datei, , ""
Set wbQuelle = Workbooks.Open(Filename:=Datei, ReadOnly:=True)


' Quelldatei

Set Quelle = wbQuelle.Worksheets("Einträge")

With Quelle
Zeile_S1 = 14
'Letzte Zeile in Quelle
Set rngZelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
If rngZelle Is Nothing Then
'keine Daten
GoTo NextDatei
Else
Zeile_S2 = rngZelle.Row
End If
If Zeile_S2 >= Zeile_S1 Then
'kopieren und einfügen
' ' .Range(.Rows(Zeile_S1), .Rows(Zeile_S2)).Copy Ziel.Cells(Zeile_Z, 1)

' ############# Bisher verwendeter Code

' .Range(.Cells(Zeile_S1, 1), .Cells(Zeile_S2, 40)).Copy Ziel.Cells(Zeile_Z, 1)

' ############# Mein neuer Code, mit der Fehlermeldung

.Range(.Cells(Zeile_S1, 1), .Cells(Zeile_S2, 40)).Copy
Ziel.Cells(Zeile_Z, 1).PasteSpecial xlPasteValues


'nächste Einfügezeile
Zeile_Z = Zeile_Z + Zeile_S2 - Zeile_S1 + 1
End If
End With


NextDatei:
wbQuelle.Close savechanges:=False

'Speicher freigeben
Set Quelle = Nothing
Set wbQuelle = Nothing
Next Datei

With Application

.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic

End With

Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case Else
If Not wbQuelle Is Nothing Then wbQuelle.Close savechanges:=False
MsgBox "FehlerNr.: " & .Number & vbNewLine & vbNewLine _
& "Beschreibung: " & .Description, _
vbCritical, "Fehler"
End Select
End With

errExit:

With Application

.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True

End With


'Speicher freigeben
Set Quelle = Nothing
Set wbQuelle = Nothing
Set Ziel = Nothing


With Application

.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual

Application.DisplayAlerts = True

End With


'Zeilen löschen


'Letzten Stand Aktualisierung eintragen
'Range("L5").Select
' ActiveCell.FormulaR1C1 = "=NOW()"
' Range("L5").Select
' Selection.Copy
' Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
' :=False, Transpose:=False


' ++++++++++++++++++++
MsgBox "Es werden " & UBound(varDateien) & " Dateien eingefügt.", 64

With Application

.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic

End With

End Sub

Private Sub cmdImportB_Click() On Error Resume Next ActiveWindow.ScrollColumn = 1 ActiveSheet.ShowAllData ActiveSheet.Range("A16:AN30000").EntireRow.Hidden = False 'ActiveSheet.Range("A16:S30000").FormatConditions.Delete On Error GoTo errExit Dim wbQuelle As Workbook, Quelle As Worksheet, Ziel As Worksheet Dim Datei As Variant, varDateien Dim Zeile_Z As Long, Zeile_S1 As Long, Zeile_S2 As Long Dim rngZelle As Range ' ++++++++++++++++++++ Dim lngAnzahl As Long Dim lngLastQ As Long 'Worksheets("Einträge").Visible = True Sheets("Einträge").Activate On Error GoTo Fehler 'Dialog "Datei öffnen" anzeigen varDateien = Application.GetOpenFilename("Excel Dateien (*.xls; *.xlsx; *.xlsm)," & _ "*.xls; *.xlsx; *.xlsm", _ Title:="Bitte zu importieren Datei(en) auswählen", MultiSelect:=True) ' ++++++++++++++++++++ ' For lngAnzahl = LBound(varDateien) To UBound(varDateien) 'Abbrechen falls keine Datei ausgewählt If Not IsArray(varDateien) Then MsgBox "keine Datei ausgewählt", , "Abbruch" Exit Sub End If With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual Application.DisplayAlerts = False End With ' Zieldatei Set Ziel = ThisWorkbook.Worksheets("Test") With Ziel 'Startzeile setzen Set rngZelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlValues, _ lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious) If rngZelle Is Nothing Then Zeile_Z = 14 Else Zeile_Z = rngZelle.Row End If If Zeile_Z 14 Then Zeile_Z = 14 Else Zeile_Z = Zeile_Z + 1 End If End With 'Ausgewählte Datei abarbeiten For Each Datei In varDateien ' MsgBox "Ausgewählte Datei: " & Datei, , "" Set wbQuelle = Workbooks.Open(Filename:=Datei, ReadOnly:=True) ' Quelldatei Set Quelle = wbQuelle.Worksheets("Einträge") With Quelle Zeile_S1 = 14 'Letzte Zeile in Quelle Set rngZelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlValues, _ lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious) If rngZelle Is Nothing Then 'keine Daten GoTo NextDatei Else Zeile_S2 = rngZelle.Row End If If Zeile_S2 >= Zeile_S1 Then 'kopieren und einfügen ' ' .Range(.Rows(Zeile_S1), .Rows(Zeile_S2)).Copy Ziel.Cells(Zeile_Z, 1) ' ############# Bisher verwendeter Code ' .Range(.Cells(Zeile_S1, 1), .Cells(Zeile_S2, 40)).Copy Ziel.Cells(Zeile_Z, 1) ' ############# Mein neuer Code, mit der Fehlermeldung .Range(.Cells(Zeile_S1, 1), .Cells(Zeile_S2, 40)).Copy Ziel.Cells(Zeile_Z, 1).PasteSpecial xlPasteValues 'nächste Einfügezeile Zeile_Z = Zeile_Z + Zeile_S2 - Zeile_S1 + 1 End If End With NextDatei: wbQuelle.Close savechanges:=False 'Speicher freigeben Set Quelle = Nothing Set wbQuelle = Nothing Next Datei With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic End With Fehler: With Err Select Case .Number Case 0 'alles OK Case Else If Not wbQuelle Is Nothing Then wbQuelle.Close savechanges:=False MsgBox "FehlerNr.: " & .Number & vbNewLine & vbNewLine _ & "Beschreibung: " & .Description, _ vbCritical, "Fehler" End Select End With errExit: With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic .DisplayAlerts = True End With 'Speicher freigeben Set Quelle = Nothing Set wbQuelle = Nothing Set Ziel = Nothing With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual Application.DisplayAlerts = True End With 'Zeilen löschen 'Letzten Stand Aktualisierung eintragen 'Range("L5").Select ' ActiveCell.FormulaR1C1 = "=NOW()" ' Range("L5").Select ' Selection.Copy ' Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ ' :=False, Transpose:=False ' ++++++++++++++++++++ MsgBox "Es werden " & UBound(varDateien) & " Dateien eingefügt.", 64 With Application .ScreenUpdating = True .EnableEvents = True .Calculation = xlCalculationAutomatic End With End Sub

Anzeige
AW: Mehrere csv Dateien importieren
05.03.2025 21:14:23
Anja_089
Hallo Yal,

danke für Deine Antwort, aber das ist nicht das was ich suche. Ich kenne mich Power Ouery aus, aber die Leute, die mit der Datei arbeiten müssen nicht. Daher will ich einen Button haben, der sozusagen alles alleine erledigt.

In der Datei sind 12 Tabellenblätter, die bereits formatiert sind und sich auch Formeln befinden. Hier sollen die Daten aus der csv Datei rein, ohne irgend etwas zu überschreiben oder andere Formatierungen einzufügen. Ich muss bestimmen können ab welcher Zeile die Quelldatei (Range A2:D800) Daten importiert und wo sie in der Zieldatei (Range A14:D814) eingefügt werden.

Ich arbeite mit einen tollen Macro, wenn ich Daten aus Excel-Dateien importiere. Das funktioniert allerdings nicht bei csv. Dateien. Mit diesem Makro kann ich alles selber bestimmen und es je nach Situation auch anpassen. Wie beschrieben, will ich entscheiden in welches Tabellenblatt, an welche Stelle die Daten einfügt werden und kein vorgegeben Ordner haben. Die zu importierenden Dateien sollen vom Benutzer einzeln ausgewählt werden und zwar von dem Ordner in dem sie liegen. Das heißt, wenn in dem Ordner sechs Dateien liegen, aber nur drei gebraucht werden, sollte sie per Multiklick ausgewählt werden können.

Ich habe selber bereits einiges versucht, bekomme aber immer nur Fehlermeldungen. Ich bin gut in der Lage Code anzupassen, kann aber aus dem Stegreif keinen Code schreiben.
Anzeige
AW: Mehrere csv Dateien importieren
05.03.2025 21:53:41
Yal
Hallo Anja,

Du kennst dich mit Power Query aus, hast aber meine Antwort zu schnell gelesen und/oder unterschätzt, was alles mit Power Query möglich ist.

Deine Vorgehensweise mit Formeln setzt voraus, dass Du nie mehr 799 Datenzeilen in deinen Quelldateien hast. Ausserdem müssen die Formel "auf Vorrat" für nicht vorhandenen Zeilen vorliegen, was zu eine Ausgabedatei mit vielen leeren Zeilen am Ende führt.

Ich würde noch folgende Zeile korrigieren:
- in der letzten leeren Spalte trägt der User ein Marker zur Auswahl ein: "x", oder irgendwas, Hauptsache nicht leer.


Aber wenn Du mit VBA arbeiten möchtest, stelle ich die Frage auf "noch offen".

VG
Yal
Anzeige
AW: Mehrere csv Dateien importieren
06.03.2025 11:19:10
Oberschlumpf
Hi Anja,

da du davon schreibst, 12 Blätter, viele Formatierungen + Formeln sind enthalten...dann...würd zumindest ich mich freuen, wenn du per Upload eine Bsp-Datei mit genügend Blättern, Formatierungen + Formeln zeigst, so dass wir sehen können, um was genau es geht. Die Originaldaten musst du natürlich gegen Bsp-Daten austauschen.
Ach ja, du willst ja auch bei jedem CSV-Import entscheiden können, ab genau welcher Zelle der Import eingefügt werden soll - auch hier wären noch n paar Detailinfos noch hilfreich, so, dass eben auch wir verstehen können, wo genau was eingesetzt werden soll.
Und noch eine Frage :-)
Du willst ja mehrere Dateien importieren.
Bedeutet das,...
...dass du immer wieder Button-Klick, Dateiauswahl, import. oder...
...soll 1x Buttonklick, dann gleich mehrere CSVs auswählen, und erst jetzt import

??

Bitte alle Fragen beantworten.

Ciao
Thorsten
Anzeige
AW: Mehrere csv Dateien importieren
09.03.2025 01:01:54
Anja_089
Hallo Thorsten,

ich habe eine Antwort geschrieben, bzw auf alle Beiträge einmal geantwortet und hoffe es wird klarer war ich benötige.

Liebe Grüße

Anja

AW: Mehrere csv Dateien importieren
10.03.2025 19:30:01
Oberschlumpf
Hi Anja,

du hast gaaaanz viel Text für deine Antwort (an alle) verwendet - aber die von mir gewünschte Bsp-Datei mit allem´, was notwendig ist, um auch sehen zu können, was du meinst, hast du leider nicht gezeigt.

Das ist für mich aber nicht schlimm. Ich war die letzten Tage leider im Krankenhaus, kann im Mom eh nicht viel helfen.
Weiter viel Glück + Erfolg, dass dir vllt von anderen geholfen werden kann, ohne eine Datei von dir.

Ciao
Thorsten
Anzeige

Forumthreads zu verwandten Themen

Anzeige