M
MSCom
Neuer Benutzer
Threadstarter
- Dabei seit
- 20.09.2016
- Beiträge
- 1
Hallo!
Ich hab zwei identische CSV-Dateien die ich einlese und jeweils den erste und letzten Wert einer Spalte ausgebe.
Die beiden CSV-Dateien unterscheiden sich lediglich im Namen und eine CSV hat eine Spalte mehr.
CSV A funktioniert ohne Probleme
Bei CSV B bekomm ich den Error "Laufzeitfehler 9".
Wenn ich aber den Inhalt, ohne Überschrift, von B nach A kopiere funktioniert diese auch.
Der Dateiname ist auch irrelevant.
Hoffe einer hat eine Idee.
Code:
Sub Update()
Dim FS As New FileSearch
Dim ff As Integer
Dim Contents As String
Dim FName, Data, Lines, Part
Dim i As Long
Dim Dict As Object 'Scripting.Dictionary
Dim r As Range
Dim NewFiles As New Collection
Set Dict = CreateObject("Scripting.Dictionary")
Dict.CompareMode = vbTextCompare
For Each r In Range("A2", Range("A" & Rows.Count).End(xlUp))
FName = r.Value
If Not Dict.Exists(FName) Then Dict.Add FName, 0
Next
With FS
'Dateien suchen
.LookIn = "Dateipfad"
.FileName = "*.csv"
.SearchSubFolders = True
.Execute
If .FoundFiles.Count = 0 Then
MsgBox "Keine Dateien gefunden"
Exit Sub
End If
For Each FName In .FoundFiles
Part = Mid(FName, InStrRev(FName, "\") + 1)
If Not Dict.Exists(Part) Then NewFiles.Add FName
Next
If NewFiles.Count = 0 Then
MsgBox "Keine Dateien gefunden"
Exit Sub
End If
Set .FoundFiles = NewFiles
'Ausgabe vorbereiten
ReDim Data(1 To .FoundFiles.Count, 1 To 3)
For Each FName In .FoundFiles
'Dateiname speichern
i = i + 1
Data(i, 1) = Mid(FName, InStrRev(FName, "\") + 1)
'Datei einlesen
ff = FreeFile
Open FName For Binary Access Read Lock Write As #ff
Contents = Space(LOF(ff))
Get #ff, , Contents
Close #ff
'Zeilen trennen
Lines = Split(Contents, vbCrLf)
'Erster Wert in 3ter Spalte
'Das ist der Part bei dem ich den Laufzeitfehler bekomme
Part = Split(Lines(1), ";")
If UBound(Part) < 2 Then
Data(i, 2) = "-"
Else
Data(i, 2) = Part(6)
End If
'Letzter Wert in 3ter Spalte
Part = Split(Lines(UBound(Lines)), ";")
If UBound(Part) < 2 Then
Data(i, 3) = "-"
Else
Data(i, 3) = Part(6)
End If
Next
End With
'Ausgeben
Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(UBound(Data), UBound(Data, 2)).Value = Data
End Sub
LG
Ich hab zwei identische CSV-Dateien die ich einlese und jeweils den erste und letzten Wert einer Spalte ausgebe.
Die beiden CSV-Dateien unterscheiden sich lediglich im Namen und eine CSV hat eine Spalte mehr.
CSV A funktioniert ohne Probleme
Bei CSV B bekomm ich den Error "Laufzeitfehler 9".
Wenn ich aber den Inhalt, ohne Überschrift, von B nach A kopiere funktioniert diese auch.
Der Dateiname ist auch irrelevant.
Hoffe einer hat eine Idee.
Code:
Sub Update()
Dim FS As New FileSearch
Dim ff As Integer
Dim Contents As String
Dim FName, Data, Lines, Part
Dim i As Long
Dim Dict As Object 'Scripting.Dictionary
Dim r As Range
Dim NewFiles As New Collection
Set Dict = CreateObject("Scripting.Dictionary")
Dict.CompareMode = vbTextCompare
For Each r In Range("A2", Range("A" & Rows.Count).End(xlUp))
FName = r.Value
If Not Dict.Exists(FName) Then Dict.Add FName, 0
Next
With FS
'Dateien suchen
.LookIn = "Dateipfad"
.FileName = "*.csv"
.SearchSubFolders = True
.Execute
If .FoundFiles.Count = 0 Then
MsgBox "Keine Dateien gefunden"
Exit Sub
End If
For Each FName In .FoundFiles
Part = Mid(FName, InStrRev(FName, "\") + 1)
If Not Dict.Exists(Part) Then NewFiles.Add FName
Next
If NewFiles.Count = 0 Then
MsgBox "Keine Dateien gefunden"
Exit Sub
End If
Set .FoundFiles = NewFiles
'Ausgabe vorbereiten
ReDim Data(1 To .FoundFiles.Count, 1 To 3)
For Each FName In .FoundFiles
'Dateiname speichern
i = i + 1
Data(i, 1) = Mid(FName, InStrRev(FName, "\") + 1)
'Datei einlesen
ff = FreeFile
Open FName For Binary Access Read Lock Write As #ff
Contents = Space(LOF(ff))
Get #ff, , Contents
Close #ff
'Zeilen trennen
Lines = Split(Contents, vbCrLf)
'Erster Wert in 3ter Spalte
'Das ist der Part bei dem ich den Laufzeitfehler bekomme
Part = Split(Lines(1), ";")
If UBound(Part) < 2 Then
Data(i, 2) = "-"
Else
Data(i, 2) = Part(6)
End If
'Letzter Wert in 3ter Spalte
Part = Split(Lines(UBound(Lines)), ";")
If UBound(Part) < 2 Then
Data(i, 3) = "-"
Else
Data(i, 3) = Part(6)
End If
Next
End With
'Ausgeben
Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(UBound(Data), UBound(Data, 2)).Value = Data
End Sub
LG