Microsoft Excel

Herbers Excel/VBA-Archiv

CSV Import Komma Problem

Betrifft: CSV Import Komma Problem von: BlackDevil
Geschrieben am: 05.09.2014 11:10:29

Hallo Zusammen,

kurz zu mir: Programmieren kann ich in verschiedenen Sprachen, muss mir allerdings viel im _
Internet zusammen suchen da ich die Sprachen alle nicht fließend kann. Ich arbeite derzeit an _ einem Excel Sheet welches mir einen ganzen Haufen an CSV Dateien auswerten soll. Beim Import hänge ich nun am berühmt berüchtigten Komma Problem fest: nach dem Import wird aus 1,002 1002 ... die Lösung zum Import habe ich aus dem Internet da die schön schlank ist (wohingegen eine ältere von mir gigantisch ist und ich sie auch gar nicht mehr verstehe). Meine Lösung:


Sub ImportCSV(srcFile As String, dstSheet As String, delim As String)
    Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
    
    If srcFile <> "" Then
    Application.ScreenUpdating = False
    Open srcFile For Input As #1
    arrDaten = Split(Input(LOF(1), 1), vbCrLf)
    Close #1
    
    For lngR = 0 To UBound(arrDaten)
      arrTmp = Split(arrDaten(lngR), delim)
      If UBound(arrTmp) > -1 Then
        With Worksheets(dstSheet)
          lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
          .Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) = Application.Transpose(Application.   _
_
_
Transpose(arrTmp))
        End With
      End If
    Next lngR
    End If
    Worksheets(dstSheet).Rows(1).Delete shift:=xlUp
End Sub

Das zweite Problem ist, dass die Daten ab Zeile 2 stehen, den Grund konnte ich nicht finden. Deshalb lösche ich einfach die erste Zeile und schiebe alles eins nach oben :)

Ich weiß nun, dass es ein Problem mit den Ländereinstellungen gibt und so das Komma Problem zustande kommt. Ich weiß auch, dass man Excel beibringen kann alles so zu lassen wie es ist. Nur wie ich es oben einbaue verstehe ich nicht.

Eventuell kann mir jemand helfen :)

Grüße

  

Betrifft: AW: CSV Import Komma Problem von: fcs
Geschrieben am: 05.09.2014 14:57:38

Hallo BlackDevil,

Komma-Problem:
Nach dem Splitten der Datenzeile am Trennzeichen (hoffentlich nicht gleich Komma oder Punkt!) das Komma in den Feldern des temporären Arrays durch einen Punkt ersetzen, 1000er-Trennzeichen ggf. durch ",".

Erste Zeile leer:
Das liegt daran, wie die Zeile bestimmst, ab der die Daten eingetragen werden sollen.
Ist das Zielblatt leer, dann ergibt sich 2 als Stratzeile.

Gruß
Franz

'Alternative
Sub ImportCSV(srcFile As String, dstSheet As String, delim As String)
    Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
    Dim intI As Integer
    If srcFile <> "" Then
      Application.ScreenUpdating = False
      Open srcFile For Input As #1
      arrDaten = Split(Input(LOF(1), 1), vbCrLf)
      Close #1
      
      With Worksheets(dstSheet)
          lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
          If lngLast = 1 And IsEmpty(.Cells(1, 1)) Then lngLast = 0
          For lngR = 0 To UBound(arrDaten)
            arrTmp = Split(arrDaten(lngR), delim)
            If UBound(arrTmp) > -1 Then
                For intI = LBound(arrTmp) To UBound(arrTmp)
                  If IsNumeric(arrTmp(intI)) Then
                    '1000er-Trennzeichen durch Sonderzeichen ersetzen
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), ".", "§")
                    'Dezimaltrennzeichen durch "."
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), ",", ".")
                    'Sonderzeichen ersetzen durch 1000er-Trennzeichen
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), "§", ",")
                  End If
                Next
                lngLast = lngLast + 1
                .Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) = _
                      Application.Transpose(Application.Transpose(arrTmp))
            End If
          Next lngR
      End With
    End If
End Sub



  

Betrifft: AW: CSV Import Komma Problem von: BlackDevil
Geschrieben am: 05.09.2014 15:50:39

Hallo fcs

vielen Dank - das löst das Problem tatsächlich! Da hätte ich wohl noch länger Suchen müssen ... unterm Strich kann man sagen, dass die Lösung zwar schlank aber fehlerhaft ist. Der Umbau ist am Ende genauso groß wie der hier vorgeschlagene
https://www.herber.de/forum/archiv/1036to1040/1038917_CSVImport.html

Ich denke beide geben sich in der Qualität nix, ich stelle es nur fest :) Kann man das noch so umbauen das die Daten direkt in Zeile 1 kopiert werden?

Ich habe noch ein Problem festgestellt: Die erste Zeile enthält Namen (an anderer Stelle "Elemente" genannt. Hinter jedem dieser Elemente steckt eine Anzahl Leerzeichen, warum auch immer ...

xxxxxxxxx|       	|
xxxxxxxxxxxx|    	|
xxxxxxxxx_xxx|   	|
xxxxxxxxx|       	|
xxxxxxxxxxxx|    	|
xxxxxxxxx_xxx| |


Ich hab das mal versucht durch die || anzuzeigen. Besteht die Möglichkeit die beim Export oder nach dem Export direkt zu entfernen?


  

Betrifft: AW: CSV Import Komma Problem von: fcs
Geschrieben am: 06.09.2014 11:21:15

Hallo BlackDevil,

für das Eintragen der CSV-Daten ab Zeile 1 hatte ich die Lösung ja schon in meiner letzten Antwort mit drin.
Die überzähligen Leerzeichen in der 1. Zeile kannst du mit der Trim-Funktion entfernen.

Wenn die Daten in der CSV-Datei im Format der Einstellungen in der Systemsteuerung gespeichert sind, dann solte man die CSV-Datei mit entsprechenden Parametern als Mappe öffnen und die Daten ins Zielblatt kopieren. Dann erspart man sich den ganzen Zirkus mit dem Komma-Problem.

Gruß
Franz

Sub ImportCSV(ByVal srcFile As String, dstSheet As String, delim As String)
    Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
    Dim intI As Integer
    If srcFile <> "" Then
      Application.ScreenUpdating = False
      Open srcFile For Input As #1
      arrDaten = Split(Input(LOF(1), 1), vbCrLf)
      Close #1
      
      With Worksheets(dstSheet)
          lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
          If lngLast = 1 And IsEmpty(.Cells(1, 1)) Then lngLast = 0
          For lngR = 0 To UBound(arrDaten)
            arrTmp = Split(arrDaten(lngR), delim)
            If UBound(arrTmp) > -1 Then
                If lngR = 0 Then
                    'überzählige Leerzeichen in 1. Zeile entfernen
                    For intI = LBound(arrTmp) To UBound(arrTmp)
                        arrTmp(intI) = Trim(arrTmp(intI))
                    Next
                End If
                For intI = LBound(arrTmp) To UBound(arrTmp)
                  If IsNumeric(arrTmp(intI)) Then
                    '1000er-Trennzeichen durch Sonderzeichen ersetzen
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), ".", "§")
                    'Dezimaltrennzeichen durch "."
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), ",", ".")
                    'Sonderzeichen ersetzen durch 1000er-Trennzeichen
                    arrTmp(intI) = VBA.Replace(arrTmp(intI), "§", ",")
                  End If
                Next
                lngLast = lngLast + 1
                .Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) = _
                      Application.Transpose(Application.Transpose(arrTmp))
            End If
          Next lngR
      End With
    End If
End Sub
Alternative:

Sub ImportCSV(ByVal srcFile As String, dstSheet As String, delim As String)
    Dim wksDst As Worksheet, wkbCSV As Workbook, wksCSV As Worksheet
    Dim lngLast As Long
    Dim lngSpalte As Long
    If srcFile <> "" Then
        Set wksDst = ActiveWorkbook.Worksheets(dstSheet)
'        Application.ScreenUpdating = False
        Set wkbCSV = Application.Workbooks.Open(Filename:=srcFile, ReadOnly:=True, _
                delimiter:=delim, local:=True)
        Set wksCSV = wkbCSV.Sheets(1)
        
        With wksDst
          lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
          If lngLast = 1 And IsEmpty(.Cells(1, 1)) Then lngLast = 1 Else lngLast = lngLast + 1
          wksCSV.UsedRange.Copy
          wksDst.Cells(lngLast, 1).PasteSpecial Paste:=xlPasteValues
          Application.CutCopyMode = False
          'überzählige Leerzeichen in Titelzeile entfernen
          For lngSpalte = 1 To .Cells(lngLast, .Columns.Count).End(xlToLeft).Column
            With .Cells(lngLast, lngSpalte)
                .Value = Trim(.Value)
            End With
          Next
        End With
        
        wkbCSV.Close savechanges:=False
        Set wkbCSV = Nothing
'        Application.ScreenUpdating = True
    End If
End Sub



 

Beiträge aus den Excel-Beispielen zum Thema "CSV Import Komma Problem"