Microsoft Excel

Herbers Excel/VBA-Archiv

CSV einlesen per Makro geht nicht richtig | Herbers Excel-Forum


Betrifft: CSV einlesen per Makro geht nicht richtig von: Cello
Geschrieben am: 20.01.2010 09:33:14

Hallo Leute.

Ich habe seit einiger Zeit n kleines Problem mit dem einlesen einer CSV-Datei über ein Makro in Excel. Die Datenbank aus der ich die CSV-Datei erhalten habe wurde durch eine andere ersetzt und in dem Zuge wurde auch der Inhalt der CSV ein klein wenig geändert. Ich habe in der ZIP-Datei einen kleinen Auszug der CSV, die heisst "Original_CSV_Datei.csv". Die richtigen Dateien sind bis zu 1000 Zeilen lang. Die Trennung der einzelnen Felder erfolgt durch ein Semikolon. Das neue an dieser CSV, durch die Umstellung der Datenbank, ist, das bei den letzten beiden Spalten vor den Zahlen mehrere Leerzeichen sind. Eigentlich ja kein Problem denkt man sich. Wenn ich in Excel die Datei öffne und bei Text in Spalten als Trennzeichen das Semikolon auswähle, muss das ja klappen.
Jetzt allerdings zu der Sache, die ich nicht kapiere. Wenn ich in Excel (manuell also kein Makro) "Datei öffnen" sage und diese CSV-Datei auswähle kommt erst gar nicht das Fenster mit dem Textkonvertierungsassistenten. Es wird die Datei gleich in Excel geöffnet und automatisch getrennt. Dazu habe ich in der angehängten ZIP-Datei die Datei "Manuell_geöffnet.xls" eingefügt. Wie man sehen kann, wird das korrekt in Excel umgesetzt und bei den Semikolon getrennt. Wunderbar eigentlich. Wenn ich allerdings dieselbe Datei über mein Makro in Excel bringen will, wird diese total anders eingelesen, wie man aus der Datei "Mit_Makro_eingelesen.xls" in der ZIP-Datei sehen kann. Es wird nicht nach Semikolon getrennt sondern anscheinend nach Komma und Leerzeichen. Hier mal der Code wie ich die Datei per Makro einlese. Die Datei wird allerdings schon automatisch getrennt (siehe obrig genannte Datei "Mit_Makro_eingelesen.xls") bevor das Makro bei der Zeile "Selection.TextToColumns....." angelangt ist.

Sub CSV_Wert_einlesen()

neuDatei = Application.GetOpenFilename("CSV-Datei,*.csv")
If neuDatei = False Then Exit Sub
Workbooks.Open Filename:=neuDatei
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)), _
TrailingMinusNumbers:=True
Range("A:A").Select
Selection.Delete Shift:=xlToLeft

Ich habe deswegen auch schon gegoogelt aber so richtig zufriedenstellende Antworten habe ich nicht gefunden. Einige haben geschrieben, das sich Excel bei vielen gleichaussehnden CSV-Dateien irgendwann merkt welche Trennzeichen genutzt werden und das dann automatisch macht. Wenn das stimmt, wie kann ich diese Automatik abschalten?
Desweiteren, verstehe ich auch nicht, warum Excel die Daten so komisch trennt, wenn ich das per Makro einlesen will, also nach Komma und/oder Leerzeichen obwohl ich ihm das gar nicht sage.
Komischerweise erledigt sich dieses Problem mit dem einlesen wenn ich die CSV-Datei einfach umbenenne in *.txt . Dann funzt das wieder.

Sorry für das viele Geschreibe und ich hoffe, das man einigermaßen versteht was ich will, aber wenn mir jemand sagen kann, was ich falsch mache beim einlesen der CSV-Datei bzw. wie ich Excel abgewöhnen kann die CSV-Datei automatisch zu trennen, wäre ich dankbar.

MfG Marcel

https://www.herber.de/bbs/user/67326.zip

  

Betrifft: alternative Methode von: Rudi Maintaire
Geschrieben am: 20.01.2010 09:50:41

Hallo,
ich mach das so:

Sub tt()
  Dim strTmp, arrDaten, arrTmp, i As Long, j As Integer
  Const sFile As String = "c:\test\Original_CSV_Datei.csv"
  
  Open sFile For Input As #1
  strTmp = Split(Input(LOF(1), 1), vbCrLf)
  Close 1
  
  arrTmp = Split(strTmp(0), ";")
  ReDim arrDaten(1 To UBound(strTmp) + 1, 1 To UBound(arrTmp) + 1)
  For i = 0 To UBound(strTmp)
    arrTmp = Split(strTmp(i), ";")
    For j = 0 To UBound(arrTmp)
      arrDaten(i + 1, j + 1) = arrTmp(j)
    Next
  Next
  
  With Workbooks.Add.Sheets(1)
    .Cells(1, 1).Resize(UBound(arrDaten), UBound(arrDaten, 2)) = arrDaten
    .Columns.AutoFit
  End With
End Sub

Gruß
Rudi


Beiträge aus den Excel-Beispielen zum Thema "CSV einlesen per Makro geht nicht richtig"