Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen Teil 2
Hallo zusammen,
ich bin wie so mancher auch neu hier und habe zu einem Problem von mir hier die fast die perfekte Antwort gefunden:
unter "Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen" hier im Forum vom 27.08.2013 habe ich ein Spitzen VBA-Macro von Uwe alias colinardo gefunden.
Allerdings habe ich da noch ein Problem und ein Anliegen, bei dem mir vielleicht einer helfen kann:
Der Import der CSV-Dateien aus einem Ordner in eine Excel Datei klappt sehr gut. Allerdings habe ich noch ein kleines Problem:
aus ursprünglich:
wird folgendes importiert:
Zeilen sind dabei >10000
Bei dem Import über das VBA-Macro wird die wichtige Nachkommastelle des Messwertes abgeschnitten (190,xxx). Durch Umformatierung kann die Nachkommastelle nicht zurückgeholt werden. Wo und wie kann ich das Macro anpassen???
Ich hätte da noch ein zweites Anliegen, bei dem ich ohne Hilfe nicht weiter komme:
Ich habe im Grunde ca. 50 solcher Einzel-Dateien in eine Datei zu importieren. Im Idealfall sollten alle Daten allerdings auf ein Tabellenblatt gelangen und nicht jede Datei ein eigenes Tabellenblatt erhalten. Jede von mir zu importierende Datei hat zwei Spalten (1.Spalte mit Datum und Uhrzeit; 2. Spalte mit Messwert) die immer vollständig zu importieren sind. Der zu importierenden Inhalt der Dateien sollte jeweils in die nächsten freien Spalten gepackt werden:
Weiß da jemand von Euch wie ich das anstellen kann???
Ich bin für jeden Tipp/jede Hilfe dankbar!!!
Grüße Markus
ich bin wie so mancher auch neu hier und habe zu einem Problem von mir hier die fast die perfekte Antwort gefunden:
unter "Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen" hier im Forum vom 27.08.2013 habe ich ein Spitzen VBA-Macro von Uwe alias colinardo gefunden.
Sub ImportiereCSVDateien()
Const CSVPFAD = "E:\csv-dateien"
Dim wbTarget As Workbook, wbSource As Workbook, ws As Worksheet, ts As Worksheet
Set fso = CreateObject("Scripting.Filesystemobject")
Set wbTarget = ActiveWorkbook
Application.DisplayAlerts = False
'Lösche alle Worksheets bevor wir alle neu anlegen
While wbTarget.Worksheets.Count > 1
wbTarget.Worksheets(1).Delete
Wend
wbTarget.Worksheets(1).Name = "Zusammenfassung"
wbTarget.Worksheets(1).Range("A:ZZ").Clear
For Each f In fso.GetFolder(CSVPFAD).Files
If LCase(Right(f.Name, 3)) = "csv" Then
Workbooks.OpenText Filename:=f.Path
Set wbSource = ActiveWorkbook
On Error Resume Next
Set ws = wbTarget.Worksheets(f.Name)
If Err <> 0 Then
Set ws = wbTarget.Worksheets.Add
ws.Name = f.Name
ws.Range("A:ZZ").Clear
End If
wbSource.Worksheets(1).Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Semicolon:=True, TrailingMinusNumbers:=True
wbSource.Worksheets(1).Range("A:ZZ").Copy Destination:=ws.Range("A1")
wbSource.Close False
End If
Next
Set ts = wbTarget.Worksheets("Zusammenfassung")
Dim curCell As Range
Set curCell = ts.Range("A1")
For i = 1 To wbTarget.Worksheets.Count - 1
maxRow = wbTarget.Worksheets(i).Range("A1").End(xlDown).Row
maxCol = wbTarget.Worksheets(i).Range("A1").End(xlToRight).Column
wbTarget.Worksheets(i).Range(wbTarget.Worksheets(i).Cells(1, 1), wbTarget.Worksheets(i).Cells(maxRow, maxCol)).Copy Destination:=curCell
Set curCell = curCell.End(xlDown).Offset(2, 0)
Next
Application.DisplayAlerts = True
Set fso = Nothing
End Sub
Allerdings habe ich da noch ein Problem und ein Anliegen, bei dem mir vielleicht einer helfen kann:
Der Import der CSV-Dateien aus einem Ordner in eine Excel Datei klappt sehr gut. Allerdings habe ich noch ein kleines Problem:
aus ursprünglich:
Trendlogs |
Timestamp | Trend__Archive1 |
30.01.2014 00:07 | 190,387 |
30.01.2014 00:22 | 190,387 |
30.01.2014 00:37 | 190,388 |
30.01.2014 00:52 | 190,389 |
30.01.2014 01:07 | 190,390 |
. | . |
. | . |
. | . |
wird folgendes importiert:
Trendlogs |
Timestamp | Trend__Archive1 |
30.01.2014 00:07:36 | 190 |
30.01.2014 00:22:35 | 190 |
30.01.2014 00:37:34 | 190 |
30.01.2014 00:52:34 | 190 |
30.01.2014 01:07:33 | 190 |
. | . |
. | . |
. | . |
Zeilen sind dabei >10000
Bei dem Import über das VBA-Macro wird die wichtige Nachkommastelle des Messwertes abgeschnitten (190,xxx). Durch Umformatierung kann die Nachkommastelle nicht zurückgeholt werden. Wo und wie kann ich das Macro anpassen???
Ich hätte da noch ein zweites Anliegen, bei dem ich ohne Hilfe nicht weiter komme:
Ich habe im Grunde ca. 50 solcher Einzel-Dateien in eine Datei zu importieren. Im Idealfall sollten alle Daten allerdings auf ein Tabellenblatt gelangen und nicht jede Datei ein eigenes Tabellenblatt erhalten. Jede von mir zu importierende Datei hat zwei Spalten (1.Spalte mit Datum und Uhrzeit; 2. Spalte mit Messwert) die immer vollständig zu importieren sind. Der zu importierenden Inhalt der Dateien sollte jeweils in die nächsten freien Spalten gepackt werden:
Dateiname1Spalte A DatumUhrzeit | Dateiname1Spalte B Messwert | Dateiname2Spalte C DatumUhrzeit | Dateiname2Spalte D Messwert | Dateiname 3Spalte E DatumUhrzeit | Dateiname 3Spalte F Messwert | ... |
Weiß da jemand von Euch wie ich das anstellen kann???
Ich bin für jeden Tipp/jede Hilfe dankbar!!!
Grüße Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 232282
Url: https://administrator.de/contentid/232282
Ausgedruckt am: 16.11.2024 um 15:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo,
@colinardo hat dir bei Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen schon geantwortet
Grüße
Exze
@colinardo hat dir bei Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen schon geantwortet
Grüße
Exze
Zitat von @106543:
@colinardo hat dir bei Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen schon geantwortet
Danke Dir für deinen Hinweis Exze, hab den Doppel-Thread erst gerade gesehen @colinardo hat dir bei Alle CSV-Dateien in einem Ordner mit einem VBA Makro einlesen schon geantwortet
Abweichend vom Code im Parallel-Thread, platziert der folgende Code die CSV-Dateien nebeneinander auf dem Sheet: (weitere Hinweise zum Code findest du in deinem ersten Ursprungs-Kommentar)
Sub ImportiereCSVDateien()
Dim ws As Worksheet, header As Boolean, startRange As Range, curRange As Range, counter As Integer, fso As Object, f As Object
Const CSVPFAD = "E:\csv-dateien"
Set fso = CreateObject("Scripting.Filesystemobject")
Set ws = Worksheets(1)
ws.Range("A:ZZ").Clear
Set startRange = ws.Range("A2")
Set curRange = startRange
Application.DisplayAlerts = False
For Each f In fso.GetFolder(CSVPFAD).Files
If LCase(Right(f.Name, 3)) = "csv" Then
importCSV f.Path, ";", curRange, True
curRange.Offset(-1, 0).Value = f.Name
curRange.Offset(-1, 0).Font.Bold = True
Set curRange = curRange.End(xlToRight).Offset(0, 1)
End If
Next
Application.DisplayAlerts = True
Set fso = Nothing
End Sub
Function importCSV(strPath, delim, ByVal targetRange As Range, ByVal importHeader As Boolean)
Dim fso As Object, regex As Object, patNumber As String, arrLines As Variant, rngCurrent As Range, intStart As Integer, cols As Variant, c As Integer, wert As String, matches As Object, i As Integer
Set fso = CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
patNumber = "^([\d\.,\+\-]+)$"
arrLines = Split(fso.OpenTextFile(strPath, 1).ReadAll(), vbNewLine, -1, vbTextCompare)
Set rngCurrent = targetRange
If importHeader Then
intStart = 0
Else
intStart = 1
End If
For i = intStart To UBound(arrLines)
If arrLines(i) <> "" Then
cols = Split(arrLines(i), delim, -1, vbTextCompare)
For c = 0 To UBound(cols)
rngCurrent.Offset(0, c).ClearFormats
wert = Trim(Replace(cols(c), """", "", 1, -1, vbTextCompare))
' check for Numberformat
regex.Pattern = patNumber
Set matches = regex.Execute(wert)
If matches.Count > 0 Then
wert = Replace(matches(0).Submatches(0), ",", ".", 1, -1, vbTextCompare)
End If
' set value in cell
rngCurrent.Offset(0, c).Value = wert
Next
Set rngCurrent = rngCurrent.Offset(1, 0)
End If
Next
Set fso = Nothing
Set regex = Nothing
End Function
Zur Auswertung wäre für mich folgende Anordnung der importierten Dateien extrem viel besser:
ist oben angepasst mit den DateinamenPfad und Trennzeichen, anpassen, siehe anderen Thread ... ansonsten den Code im Debug-Modus schrittweise ausführen ... hier geht es einwandfrei ..
Zur Info: In den CSV-Dateien sollte nur eine Zeile für die Überschrift und die Zeilen für die Werte stehen, sonst nichts, ansonsten muss das Script angepasst werden!
Eventuell hast du oben in deinen Code noch ein Option Explicit stehen, wenn ja, dies mal rauslöschen.
JA, hatte ich aber oben bereits geschrieben, ich passe es dir gleich mal an ..
in diesem Fall, tausche die untere Funktion durch diese aus (ist nur die Startzeile geändert worden):
und das nächste mal solchen Inhalt bitte mit Tags posten. Danke.
Function importCSV(strPath, delim, ByVal targetRange As Range, ByVal importHeader As Boolean)
Dim fso As Object, regex As Object, patNumber As String, arrLines As Variant, rngCurrent As Range, intStart As Integer, cols As Variant, c As Integer, wert As String, matches As Object, i As Integer
Set fso = CreateObject("Scripting.FileSystemObject")
Set regex = CreateObject("vbscript.regexp")
patNumber = "^([\d\.,\+\-]+)$"
arrLines = Split(fso.OpenTextFile(strPath, 1).ReadAll(), vbNewLine, -1, vbTextCompare)
Set rngCurrent = targetRange
If importHeader Then
intStart = 2
Else
intStart = 3
End If
For i = intStart To UBound(arrLines)
If arrLines(i) <> "" Then
cols = Split(arrLines(i), delim, -1, vbTextCompare)
For c = 0 To UBound(cols)
rngCurrent.Offset(0, c).ClearFormats
wert = Trim(Replace(cols(c), """", "", 1, -1, vbTextCompare))
' check for Numberformat
regex.Pattern = patNumber
Set matches = regex.Execute(wert)
If matches.Count > 0 Then
wert = Replace(matches(0).Submatches(0), ",", ".", 1, -1, vbTextCompare)
End If
' set value in cell
rngCurrent.Offset(0, c).Value = wert
Next
Set rngCurrent = rngCurrent.Offset(1, 0)
End If
Next
Set fso = Nothing
Set regex = Nothing
End Function
Dann markier das Ganze doch bitte auch als gelöst
Info hier: Wie kann ich einen Beitrag als gelöst markieren?
Grüße
Exze
Info hier: Wie kann ich einen Beitrag als gelöst markieren?
Grüße
Exze
Hallo Forum,
hallo Uwe
vielen Dank für dein Skript!
Ich habe gehofft, es selbst hin zu bekommen, schaffe es aber leider nicht...
Zwei Anpassungen würde ich benötigen:
Jeden Wert in der ersten Spalte möchte ich vom UNIX-Zeitformat umrechnen und als Datum formatieren. Nach meinem Empfinden müsste das so funktionieren: wert = (wert + 7200) / 86400 + 25569 Das geht so aber leider nicht.
In die zweite Spalte soll wieder der Wert der ersten Spalte geschrieben werden, diesmal als Uhrzeit formatiert. Alle weiteren Spalten müssen demnach eine Spalte weiter nach rechts verschoben werden.
Vielleicht kann mir dabei jemand helfen?
Sonnige Grüße
Jonny
hallo Uwe
vielen Dank für dein Skript!
Ich habe gehofft, es selbst hin zu bekommen, schaffe es aber leider nicht...
Zwei Anpassungen würde ich benötigen:
Jeden Wert in der ersten Spalte möchte ich vom UNIX-Zeitformat umrechnen und als Datum formatieren. Nach meinem Empfinden müsste das so funktionieren: wert = (wert + 7200) / 86400 + 25569 Das geht so aber leider nicht.
In die zweite Spalte soll wieder der Wert der ersten Spalte geschrieben werden, diesmal als Uhrzeit formatiert. Alle weiteren Spalten müssen demnach eine Spalte weiter nach rechts verschoben werden.
Vielleicht kann mir dabei jemand helfen?
Sonnige Grüße
Jonny