Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1380to1384
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV Import Komma Problem

CSV Import Komma Problem
05.09.2014 11:10:29
BlackDevil
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

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV Import Komma Problem
05.09.2014 14:57:38
fcs
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

Anzeige
AW: CSV Import Komma Problem
05.09.2014 15:50:39
BlackDevil
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?

Anzeige
AW: CSV Import Komma Problem
06.09.2014 11:21:15
fcs
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

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige