Skript für den Import von csv Daten in jeweils neue Spalte einer xlsm bzw xlsx Datei
Hallo zusammen,
bin neu hier und hoffe mal, dass ich nicht die Antwort auf meine Frage hier in dem Forum vielleicht übersehen habe.
Falls doch bin ich natürlich über einen Hinweis dankbar!
Zur Frage:
Eine Software gibt mir je Versuch eine .csv Datei mit jeweils einer Spalte und unterschiedlicher Zeilenanzahl in einem Ordner gesammelt aus.
Ich möchte nun, die .csv Daten so importieren, dass diese (geordnet nach aufsteigendem numerischen Namen der .csv Dateien) jeweils eine neue Spalte in einer "normalen" .xlsx/xlsm Excel-Arbeitsmappe (benutze 2013) darstellen.
Ein relativ ähnliches Problem wurde hier:
Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen
bzw hier:
Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen Teil 2
gelöst, jedoch kann ich den Code nicht erfolgreich ablaufen lassen. (Ja habe den Dateipfad geändert :D)
Falls mir jemand weiterhelfen könnte wäre ich sehr dankbar!
Beste Grüße!
bin neu hier und hoffe mal, dass ich nicht die Antwort auf meine Frage hier in dem Forum vielleicht übersehen habe.
Falls doch bin ich natürlich über einen Hinweis dankbar!
Zur Frage:
Eine Software gibt mir je Versuch eine .csv Datei mit jeweils einer Spalte und unterschiedlicher Zeilenanzahl in einem Ordner gesammelt aus.
Ich möchte nun, die .csv Daten so importieren, dass diese (geordnet nach aufsteigendem numerischen Namen der .csv Dateien) jeweils eine neue Spalte in einer "normalen" .xlsx/xlsm Excel-Arbeitsmappe (benutze 2013) darstellen.
Ein relativ ähnliches Problem wurde hier:
Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen
bzw hier:
Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen Teil 2
gelöst, jedoch kann ich den Code nicht erfolgreich ablaufen lassen. (Ja habe den Dateipfad geändert :D)
Falls mir jemand weiterhelfen könnte wäre ich sehr dankbar!
Beste Grüße!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 239910
Url: https://administrator.de/forum/skript-fuer-den-import-von-csv-daten-in-jeweils-neue-spalte-einer-xlsm-bzw-xlsx-datei-239910.html
Ausgedruckt am: 03.05.2025 um 04:05 Uhr
12 Kommentare
Neuester Kommentar

Hallo ZippoeX!
Mit aufsteigend numerischen Namen in etwa so (Macro in *.xlsm):
Grüße Dieter
Mit aufsteigend numerischen Namen in etwa so (Macro in *.xlsm):
Option Explicit
Option Compare Text
Const CsvFolder = "E:\Test\Csv"
Sub CsvImport()
Dim oFso As Object, oFile As Object, aText As Variant
Dim ColCount As Long, i As Long
Set oFso = CreateObject("Scripting.FileSystemObject")
ActiveSheet.UsedRange.ClearContents
ColCount = 1
For Each oFile In oFso.GetFolder(CsvFolder).Files
If oFso.GetExtensionName(oFile.Name) Like "csv" Then
aText = Split(oFso.OpenTextFile(oFile.Path).ReadAll, vbNewLine)
Cells(1, ColCount).Value = oFso.GetBaseName(oFile.Name)
For i = 0 To UBound(aText)
If aText(i) <> "" Then
Cells(i + 2, ColCount).Value = Trim(aText(i))
End If
Next
ColCount = ColCount + 1
End If
Next
End Sub
Grüße Dieter

Hallo ZippoeX!
Wenn es so aufgebaut ist:
Dann sind das mehrere Spalten?
Grüße Dieter
Eine Software gibt mir je Versuch eine .csv Datei mit jeweils einer Spalte und unterschiedlicher Zeilenanzahl in einem Ordner gesammelt aus.
Darunter verstehe ich etwas in dieser Art:Wert_Zeile1
Wert_Zeile2
...
Wert1;Wert2;Wert...
Grüße Dieter

Hallo ZippoeX!
Und in den Zeilen in der Art
gibt es keine String-Quoten (") oder sonstiges konstantes Muster z.B ein Komma mit immer gleicher Stellenanzahl o.ä.?
Grüße Dieter
Und in den Zeilen in der Art
Wert_Zeile1WertZeile2WertZeile3
Grüße Dieter

Hallo Zippoe!
Deine Kommentare kann ich nach Tests mit Deinen Csv-Dateien nicht nachvollziehen, denn alle Csv-Dateien enthalten tatsächlich nur eine Spalte (siehe Text-Editor mit Zeilenumbruch). Allerdings sind die Dateinamen sehr lang und die Spaltenbreiten müssten dementsprechend angepasst werden. Brauchst Du in der 1. Zeile den ganzen Dateinamen oder reicht ein Teil zwischen den (_)-Zeichen?
Die 1. Zeile der Csv-Dateien mit "YG-585-A" kann man, sofern sie nicht benötigt wird, einfach überspringen?
Da die Csv.Dateien allerdings außer Zahlen im Format '1234.12' auch Werte wie z.B. '25. Mai' oder 'Apr 15' beinhalten, stellt sich mir die Frage, ob diese Csv-Dateien per Excel erstellt wurden und die Zellen nicht als Zahlen formatiert waren/sind, was dann zu Fehlinterpretationen mit Datumswerten führt?
Außerdem sind die Zahlenwerte in den Csv-Dateien unterschiedlich d. h. mal mit Punkt und mal mit Komma (siehe Datei 4), was ja auch nicht so optimal ist?
Grüße Dieter
Deine Kommentare kann ich nach Tests mit Deinen Csv-Dateien nicht nachvollziehen, denn alle Csv-Dateien enthalten tatsächlich nur eine Spalte (siehe Text-Editor mit Zeilenumbruch). Allerdings sind die Dateinamen sehr lang und die Spaltenbreiten müssten dementsprechend angepasst werden. Brauchst Du in der 1. Zeile den ganzen Dateinamen oder reicht ein Teil zwischen den (_)-Zeichen?
Die 1. Zeile der Csv-Dateien mit "YG-585-A" kann man, sofern sie nicht benötigt wird, einfach überspringen?
Da die Csv.Dateien allerdings außer Zahlen im Format '1234.12' auch Werte wie z.B. '25. Mai' oder 'Apr 15' beinhalten, stellt sich mir die Frage, ob diese Csv-Dateien per Excel erstellt wurden und die Zellen nicht als Zahlen formatiert waren/sind, was dann zu Fehlinterpretationen mit Datumswerten führt?
Außerdem sind die Zahlenwerte in den Csv-Dateien unterschiedlich d. h. mal mit Punkt und mal mit Komma (siehe Datei 4), was ja auch nicht so optimal ist?
Grüße Dieter

Hallo ZippoeX!
Wenn also in einer deutschen Excel-Version die Zellen vor dem Einfügen ein Standardformat haben, dann werden z.B. Werte wie 4.15 als 'Apr 15' oder 31.5 als '31. Mai' übernommen, was wiederum bedeutet, dass der interne Zellwert (cell.Value) einen ganz anderen Wert enthält und zwar '42095' (=01.04.2015) anstatt '4.15' und '41790' (=31.05.2014) anstatt 31.5...
Grüße Dieter
Also muss ich vermutlich meinem Excel nur beibringen dass ich das englische Format mit Kommata/Punkten nehme und dann sollte dein Skript funktionieren!
Die Punkte durch Komma zu ersetzen wäre beim importieren nicht das Problem, sondern eher die Zeilen, in denen beim Export in die Csv-Dateien verschiedene Zahlenwerte mit Punkt als Datum ('Apr 15' oder '31. Mai') interpretiert worden sind.Wenn also in einer deutschen Excel-Version die Zellen vor dem Einfügen ein Standardformat haben, dann werden z.B. Werte wie 4.15 als 'Apr 15' oder 31.5 als '31. Mai' übernommen, was wiederum bedeutet, dass der interne Zellwert (cell.Value) einen ganz anderen Wert enthält und zwar '42095' (=01.04.2015) anstatt '4.15' und '41790' (=31.05.2014) anstatt 31.5...
Grüße Dieter

Hallo ZippoeX!
OK, ich hatte angenommen das die Csv-Dateien eventuell per Excel erstellt worden sind und dann hätte man an dieser Stelle etwas ändern müssen...
Hier mal ein Code, der zum einen die Punkte durch Komma und die Datumswerte durch Zahlenwerte ersetzt. Die erste Zeile mit den Dateinamen lasse ich jetzt mal in gekürzter Form ala 'Csv-001' drinn und die erste Zeile der Csv-Datei mit "YG-585-A" wird übersprungen:
Grüße Dieter
[edit]
Code insoweit geändert, das der Import der Csv-Dateien in Abhängigkeit davon, ob sich in der 1. Zeile ein Zahlenwert oder ein Text befindet, entweder ab der 1. Zeile oder ab der 2.Zeile beginnt.
[/edit]
[edit2]
Code insoweit geändert, dass sowohl vbCrLf als auch (nur) vbLf als Zeilenumbrüche erkannt werden
[/edit2]
OK, ich hatte angenommen das die Csv-Dateien eventuell per Excel erstellt worden sind und dann hätte man an dieser Stelle etwas ändern müssen...
Hier mal ein Code, der zum einen die Punkte durch Komma und die Datumswerte durch Zahlenwerte ersetzt. Die erste Zeile mit den Dateinamen lasse ich jetzt mal in gekürzter Form ala 'Csv-001' drinn und die erste Zeile der Csv-Datei mit "YG-585-A" wird übersprungen:
Option Explicit
Option Compare Text
Const CsvFolder = "E:\Test\Csv"
Public Sub CsvImport()
Dim oFso As Object, oFile As Object
Dim aTemp As Variant, aText As Variant
Dim sText As String, sValue As String
Dim dValue As Double, iColCount As Long, iRowStart As Long, i As Long
Set oFso = CreateObject("Scripting.FileSystemObject")
ActiveSheet.UsedRange.ClearContents
Application.ScreenUpdating = False
iColCount = 1
For Each oFile In oFso.GetFolder(CsvFolder).Files
If oFso.GetExtensionName(oFile.Name) Like "csv" Then
sText = oFso.OpenTextFile(oFile.Path).ReadAll
aText = Split(Replace(sText, vbCr, ""), vbLf)
aTemp = Split(Split(oFso.GetBaseName(oFile.Name), ".")(0), "_")
Cells(1, iColCount).Value = "Csv-" & aTemp(UBound(aTemp))
iRowStart = IIf(IsNumeric(aText(0)), 2, 1)
For i = 2 - iRowStart To UBound(aText)
sValue = aText(i)
If sValue <> "" Then
If IsNumeric(sValue) Then
dValue = CDbl(Replace(sValue, ".", ","))
Else
dValue = GetDoubleValue(sValue)
End If
Cells(iRowStart + i, iColCount).Value = dValue
End If
Next
iColCount = iColCount + 1
End If
Next
ActiveSheet.UsedRange.NumberFormat = "#,##0.00"
Application.ScreenUpdating = True
End Sub
'Konvertiert Formate wie '15. Mai' oder 'Apr 15' in Zahlenwerte
Private Function GetDoubleValue(ByVal sValue As String) As Double
Dim aTemp As Variant, aMonths As Variant
aTemp = Split(sValue)
If UBound(aTemp) = 0 Then
aTemp = Split(sValue, ".")
End If
If UBound(aTemp) = 1 Then
aMonths = Array("jan", "feb", "mrz", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "dez")
With WorksheetFunction
If Not IsNumeric(aTemp(0)) Then
GetDoubleValue = CDbl(.Match(Trim(aTemp(0)), aMonths, 0) & "," & aTemp(1))
ElseIf Not IsNumeric(aTemp(1)) Then
GetDoubleValue = CDbl(aTemp(0) & "," & .Match(Trim(aTemp(1)), aMonths, 0))
End If
End With
End If
End Function
EDIT: ALSO habe mir die csvs ohne den YG header ausgeben lassen und das Format der Zahlenerkennung umgestellt. Habe jetzt keine Datumsangaben mehr in den csvs. Import klappt auch reibungslos. ABER: Das VBA-Skript schreibt weiterhin leider nur alles in Zeile 2
Kann ich irgendwie nicht nachvollziehen, mein Ergebnis anhand Deiner Csv-Dateien sieht bei mir in etwa so aus:Grüße Dieter
[edit]
Code insoweit geändert, das der Import der Csv-Dateien in Abhängigkeit davon, ob sich in der 1. Zeile ein Zahlenwert oder ein Text befindet, entweder ab der 1. Zeile oder ab der 2.Zeile beginnt.
[/edit]
[edit2]
Code insoweit geändert, dass sowohl vbCrLf als auch (nur) vbLf als Zeilenumbrüche erkannt werden
[/edit2]

Hallo ZippoeX!
Also, die Csv-Dateien die Du mir zuletzt zugeschickt hast, werden bei mir genauso einwandfrei importiert, wie die vorhergehenden. Einziger Unterschied ist, dass die neueren Dateien im Gegensatz zu den anderen Dateien in der 1. Zeile keinen Text in der Form 'YG-585-A' haben, also bereits mit einem Zahlenwert beginnen.
Von daher habe ich den letzten Code insoweit geändert,dass je nach Inhalt der 1. Zeile (Zahl oder Text), die Csv-Dateien entweder ab der 1. Zeile oder ab der 2. Zeile importiert werden
Ob die Csv-Dateien nun Punkt, Komma oder Datumswerte enthalten oder nicht ist im Prinzip egal. D.h in beiden Fällen sollten die Daten richtig verarbeitet werden...
Grüße Dieter
Also, die Csv-Dateien die Du mir zuletzt zugeschickt hast, werden bei mir genauso einwandfrei importiert, wie die vorhergehenden. Einziger Unterschied ist, dass die neueren Dateien im Gegensatz zu den anderen Dateien in der 1. Zeile keinen Text in der Form 'YG-585-A' haben, also bereits mit einem Zahlenwert beginnen.
Von daher habe ich den letzten Code insoweit geändert,dass je nach Inhalt der 1. Zeile (Zahl oder Text), die Csv-Dateien entweder ab der 1. Zeile oder ab der 2. Zeile importiert werden
Ob die Csv-Dateien nun Punkt, Komma oder Datumswerte enthalten oder nicht ist im Prinzip egal. D.h in beiden Fällen sollten die Daten richtig verarbeitet werden...
Grüße Dieter