Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1324to1328
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 mit Exponentialwerten importieren

CSV mit Exponentialwerten importieren
13.08.2013 07:42:35
Manuela
Hallo,
Ich habe eine CSV-Datei mit Exponentialwerten die ich per Makro in meine Exceldatei impotieren möchte. Dies klappt auch soweit, weil die Spalten als "Text" formatiert wurden.
Nun zu meinem Problem:
Die Werte in Spalte D & G sollen ohne Exponential impotiert werden.
D10: 1,33176883009912E-02 ändern in: 0,0133176883009912
Die werte ohne Exponential werden korrekt dargestellt (z.B.: D15:D17 oder G10)
Am besten wäre eine Lösung direkt im Makro, aber auch eine Hilfsspalte könnte mir helfen. Hat jemand eine Idee wie ich dieses Problem lösen könnte?
Exceldatei+CSV:
https://www.herber.de/bbs/user/86819.zip
LG,
Manu

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
CSV: Zahlen als Zahlen importieren
13.08.2013 13:13:06
Erich
Hi,
probier mal diesen Code - die hier wichtigeren Änderungen
habe ich mit ' ### markiert:

Option Explicit      ' immer zu empfehlen
Sub CSVImport()                                 'CSV-Import
Dim strSrcFile$, strTmp$, strDelimit$, suche As String
Dim intFile As Integer, arrSrc, lngLast As Long
' Öffnen-Dialog
strDelimit = ";"
intFile = FreeFile
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = ""
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
If .Show Then strSrcFile = .SelectedItems(1)
End With
If strSrcFile  "" Then
suche = "SpalteA"                'Suche
lngLast = 1                      'lngLast = Zähler 1. Zeile
With ThisWorkbook.ActiveSheet                 ' Ausgabeblatt
Columns("A:H").NumberFormat = "@"   ' (Text)
Columns(4).NumberFormat = "0.000000000000000000"            ' ###
' oder Standard, wie gewünscht?
Columns(7).NumberFormatLocal = "Standard"                   ' ###
Open strSrcFile For Input As #intFile      ' Datenimport
Do While Not EOF(intFile)
Line Input #intFile, strTmp
If lngLast = 1 Then
If InStr(1, strTmp, suche, vbTextCompare) > 0 Then
'Suchbegriff gefunden! lngLast = Zeilenzähler
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
Else
'Suchbegriff nicht gefunden!
MsgBox "Falsche CSV-Format ausgewählt", _
vbCritical + vbOKOnly, "Abbruch!"
Exit Do
End If
Else
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
'ExcelSpalte = CSVSpalte
.Cells(lngLast, 1) = arrSrc(0)
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
.Cells(lngLast, 4) = CDbl(arrSrc(3))                  ' ###
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
.Cells(lngLast, 7) = CDbl(arrSrc(6))                  ' ###
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
lngLast = lngLast + 1
End If
Loop
Close #intFile                            ' CSV schließen
.Columns.AutoFit
End With
End If
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: CSV: Zahlen als Zahlen importieren
14.08.2013 07:53:29
Manuela
Hallo Erich,
Deine Version klapp wunderbar. Ich Danke Dir! :-)
LG,
Manu

AW: CSV: Zahlen als Zahlen importieren
14.08.2013 13:28:52
Manuela
Hallo Erich,
ich brauche nochmal Hilfe von Dir. Es geht um diesen Teil:
.Cells(lngLast, 7) = CDbl(arrSrc(6))
Wenn in meiner CSV-Datei an dieser Stelle keine Daten sind, also nur ";;;;;;", dann bekomme ich einen Laufzeitfehler '13': Typen unverträglich.
Ich bräuchte quasi eine Abfrage:
if arrSrc(6) = "" then arrSrc(6) else CDbl(arrSrc(6))
Hättest Du eine Idee wie ich das umsetzten könnte?
LG,
Manu

Anzeige
erledigt
14.08.2013 13:43:03
Manuela
Manchmal muss nur etwas überlegen... :-)

If arrSrc(6) > "" Then
.Cells(lngLast, 7) = CDbl(arrSrc(6))
Else
.Cells(lngLast, 7) = arrSrc(6)
End If
LG,
Manu

AW, ohwohl erledigt :-)
14.08.2013 14:23:48
Erich
Hi,
das geht wohl einfacher:
If arrSrc(6) > "" Then .Cells(lngLast, 7) = CDbl(arrSrc(6))
Warum willst du arrSrc(6) in die Zelle schreiben lassen, wenn arrSrc(6) = "" ist?
Das muss doch vermutlich nicht sein.
Oder ist es möglich, dass in der Zelle vorher ein anderer Wert steht, der gelöscht werden muss?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
kleine Frage noch :-)
15.08.2013 07:13:13
Manuela
Hallo Erich,
stimmt, deine Möglichkeit würde auch Funktionieren, aber ich belasse es erstmal bei meiner umständlichen Variante ;-))))
Aber ich hätte noch eine Frage:
Gibt es eine Möglichkeit die Schleife abbzubrechen und neu laufen zu lassen? Mit "Exit Do" wirds sie nur abgebrochen, aber wie starte ich den nächsten Durchlauf? Siehe unten den "'"-Bereich

Do While Not EOF(intFile)
Line Input #intFile, strTmp
If lngLast = 1 Then
If InStr(1, strTmp, suche, vbTextCompare) > 0 Then      'Suchbegriff  _
gefunden! lngLast = Zeilenzähler
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
Else
MsgBox "Falsche CSV-Format ausgewählt!", vbCritical + vbOKOnly, " _
Abbruch!"
Exit Do
End If
Else
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
If arrSrc(1) = "O" Then
Loop  'Hier möchte ich, dass die Schleife neu oben anfängt
Else
.Cells(lngLast, 1) = arrSrc(0)
End If
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
If arrSrc(3) > "" Then
.Cells(lngLast, 4) = CDbl(arrSrc(3))
Else
.Cells(lngLast, 4) = arrSrc(3)
End If
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
If arrSrc(6) > "" Then
.Cells(lngLast, 7) = CDbl(arrSrc(6))
Else
.Cells(lngLast, 7) = arrSrc(6)
End If
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
.Cells(lngLast, 12) = Now
.Cells(lngLast, 13) = Mid(strSrcFile, InStrRev(strSrcFile, "\") + 1)
.Cells(lngLast, 15) = "=COUNTIF(C1,RC[-14])"
lngLast = lngLast + 1
End If
Loop
LG,
Manu

Anzeige
kleine Frage, große Änderung :-)
15.08.2013 09:51:32
Erich
Hi,
da du jetzt keinen kompletten Code gepostet hast, hier die Änderungen basierend auf meiner letzten lauffähigen Version.
Die Prüfung (und die Schleife über die Dateiermittlung) trennt man tunlichst von der späteren Verarbeitung.
Deine Änderungen kannst du ja selbst nachtragen. :-)

Option Explicit      ' immer zu empfehlen
Sub CSVImport()                                 'CSV-Import
Dim strSrcFile$, strTmp$, strDelimit$, suche As String
Dim intFile As Integer, arrSrc, lngLast As Long
Dim bolFileOK As Boolean
strDelimit = ";"
suche = "SpalteA"                'Suche
Do Until bolFileOK                      ' Schleife, bis OK oder Ende
' Öffnen-Dialog
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = ""
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
strSrcFile = ""
If .Show Then strSrcFile = .SelectedItems(1)
End With
If strSrcFile = "" Then Exit Sub
intFile = FreeFile
Open strSrcFile For Input As #intFile      ' 1. Datenzeile
Line Input #intFile, strTmp
If InStr(1, strTmp, suche, vbTextCompare) > 0 Then
bolFileOK = True
Else                             'Suchbegriff nicht gefunden!
Close #intFile                            ' CSV schließen
MsgBox "Falsche CSV-Format ausgewählt", vbCritical + vbOKOnly, "Abbruch!"
End If
Loop
With ThisWorkbook.ActiveSheet                 ' Ausgabeblatt
Columns("A:H").ClearContents                                   ' ###
Columns("A:H").NumberFormat = "@"   ' (Text)
Columns(4).NumberFormat = "0.000000000000000000"
' oder Standard, wie gewünscht?
Columns(7).NumberFormatLocal = "Standard"
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)    'lngLast = Zeilenzähler
Do While Not EOF(intFile)                    ' Datenimport
Line Input #intFile, strTmp
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
'ExcelSpalte = CSVSpalte
lngLast = lngLast + 1
.Cells(lngLast, 1) = arrSrc(0)
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
If arrSrc(3) > "" Then .Cells(lngLast, 4) = CDbl(arrSrc(3))
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
If arrSrc(6) > "" Then .Cells(lngLast, 7) = CDbl(arrSrc(6))
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
Loop
Close #intFile                            ' CSV schließen
.Columns.AutoFit
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
next one ...
15.08.2013 10:34:48
Erich
Hi,
und noch eine Variante:

Option Explicit      ' immer zu empfehlen
Sub CSVImport()                                 'CSV-Import
Dim strSrcFile$, strTmp$, strDelimit$, suche As String
Dim intFile As Integer, arrSrc, lngLast As Long
Dim bolFileOK As Boolean
strDelimit = ";"
suche = "SpalteA"                'Suche
Do Until bolFileOK                      ' Schleife, bis OK oder Ende
' Öffnen-Dialog
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = ""
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
strSrcFile = ""
If .Show Then strSrcFile = .SelectedItems(1)
End With
If strSrcFile = "" Then Exit Sub
intFile = FreeFile
Open strSrcFile For Input As #intFile      ' 1. Datenzeile
Line Input #intFile, strTmp
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
If arrSrc(0) = suche Then
bolFileOK = True
Else                             'Suchbegriff nicht gefunden!
Close #intFile                            ' CSV schließen
MsgBox "Falsche CSV-Datei ausgewählt", vbCritical + vbOKOnly, "Abbruch!"
End If
Loop
With ThisWorkbook.ActiveSheet                      ' Ausgabeblatt
.Columns("A:H").NumberFormat = "@"   ' (Text)
.Columns(4).NumberFormat = "0.000000000000000000"
' oder Standard, wie gewünscht?
.Columns(7).NumberFormatLocal = "Standard"
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row
lngLast = Application.Max(lngLast, 9)    'lngLast = Zeilenzähler
Do While Not EOF(intFile)                    ' Datenimport
Line Input #intFile, strTmp
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
lngLast = lngLast + 1
'ExcelSpalte = CSVSpalte
.Cells(lngLast, 1) = arrSrc(0)
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
If arrSrc(3) > "" Then .Cells(lngLast, 4) = CDbl(arrSrc(3))
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
If arrSrc(6) > "" Then .Cells(lngLast, 7) = CDbl(arrSrc(6))
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
.Cells(lngLast, 12) = Now
.Cells(lngLast, 13) = Mid(strSrcFile, InStrRev(strSrcFile, "\") + 1)
.Cells(lngLast, 15).FormulaR1C1 = "=COUNTIF(C1,RC[-14])"
Loop
.Columns.AutoFit
Close #intFile                            ' CSV schließen
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: next one ...
15.08.2013 11:15:44
Manuela
Oha Erich,
ich hab deine 2. Variante noch nicht gestestet, weil ich den Bereich mit der Suche von "O" in arrSrc(1) nicht finde. Ich hab' aber auch bescheidene VBA-Kenntnisse. An welcher Stelle hast Du dies eingebaut? In meiner Version (siehe unten) habe ich z.Zt. 2 Stellen an denen vorab gesucht werden soll.
A) Suche nach dem Wort "Punktkennung" im CSV Kopf
- Wenn "Punktkennung" nicht gefunden wird: Import abbrechen + Fehler-MsgBox
B) Suche nach "O" in arrSrc(1)
- Wenn "O" in arrSrc(1) gefunden wird, dann wird der Loop (Exit Do) abbgebrochen. Abbrechen ist hier aber der Falsche Weg, weil nur die "O"-Zeile überlesen werden soll.
Optional zu B) wäre es im nachhinein super, wenn ich mehrere Suchvariablen definieren könnte. Z.B.: Wenn "O", "M" oder "X" in arrSrc(1) gefunden wird, dann überlese diese Zeile.
Meine Version läuft ja soweit, also wenn ich Dir zuviele Umstände mache, dann lass es lieber ;-). Ich hatte gedacht, dass die Suche nach "O" nur ein geringer Aufwand wäre und nicht für Dich solch einen Rattenschwanz mit sich zieht. Sorry :-)
Mein aktueller Code:

Sub CSVImport()
Dim strSrcFile$, strTmp$, strDelimit$, suche As String
Dim intFile As Integer, arrSrc, lngLast As Long
'Öffnen-Dialog
strDelimit = ";"
intFile = FreeFile
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = ""
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
If .Show Then strSrcFile = .SelectedItems(1)
End With
If strSrcFile  "" Then
suche = "Punktkennung"                                              'Suche in Kopfzeile  _
der CSV
lngLast = 1                                                         'lngLast = Zähler 1. _
Zeile
With ThisWorkbook.ActiveSheet                                       'Ausgabeblatt
Columns("A:H").NumberFormat = "@"                               '(Text)
Columns(4).NumberFormat = "0.000000000000000000"                'Opt: Columns(7). _
NumberFormatLocal = "Standard"
Columns(7).NumberFormat = "0.000000000000000000"
Open strSrcFile For Input As #intFile                               'Datenimport
Do While Not EOF(intFile)
Line Input #intFile, strTmp
If lngLast = 1 Then
If InStr(1, strTmp, suche, vbTextCompare) > 0 Then      'Suchbegriff  _
gefunden! lngLast = Zeilenzähler
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 10)
Else
MsgBox "Falsche CSV-Format ausgewählt!", vbCritical + vbOKOnly, " _
Abbruch!"
Exit Do
End If
Else
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
If arrSrc(1) = "O" Then
Exit Do
Else
.Cells(lngLast, 1) = arrSrc(0)
End If
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
If arrSrc(3) > "" Then .Cells(lngLast, 4) = CDbl(arrSrc(3))
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
If arrSrc(6) > "" Then .Cells(lngLast, 7) = CDbl(arrSrc(6))
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
.Cells(lngLast, 12) = Now
.Cells(lngLast, 13) = Mid(strSrcFile, InStrRev(strSrcFile, "\") + 1)
.Cells(lngLast, 15) = "=COUNTIF(C1,RC[-14])"
lngLast = lngLast + 1
End If
Loop
Close #intFile
'.Columns.AutoFit
End With
End If
End Sub
LG,
Manu

Anzeige
mit Satzüberleser
15.08.2013 11:52:05
Erich
Hi,
oft ist es die größte Herausforderung beim Programmieren, herauszubekommen, was das Programm leisten soll.
Jetzt wird mir klar, welche Schleife du "abbrechen und neu laufen lassen" wolltest.
Genauer willst du eigentlich nur bestimmte Datensätze überlesen.
Mit der Dateiprüfung (anhand "SpalteA" bzw. "Punktkennung") hat das rein gar nichts zu tun.
Schau dir das mal an:

Option Explicit      ' immer zu empfehlen
Sub CSVImport()                                 'CSV-Import
Dim strSrcFile$, strTmp$, strDelimit$, suche As String
Dim intFile As Integer, arrSrc, lngLast As Long
Dim bolFileOK As Boolean, arrUeb, nn As Integer          ' #####
strDelimit = ";"
suche = "SpalteA"   ' "Punktkennung"      ' Suche
arrUeb = Array("O", "M", "X")             ' Ueberlesen   ' #####
Do Until bolFileOK                        ' Schleife, bis OK oder Ende
' Öffnen-Dialog
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = ""
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle Dateien", "*.*", 2
strSrcFile = ""
If .Show Then strSrcFile = .SelectedItems(1)
End With
If strSrcFile = "" Then Exit Sub
intFile = FreeFile
Open strSrcFile For Input As #intFile      ' 1. Datenzeile
Line Input #intFile, strTmp
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
If arrSrc(0) = suche Then
bolFileOK = True
Else                             'Suchbegriff nicht gefunden!
Close #intFile                            ' CSV schließen
MsgBox "Falsche CSV-Datei ausgewählt", _
vbCritical + vbOKOnly, "Abbruch!"
End If
Loop
With ThisWorkbook.ActiveSheet                      ' Ausgabeblatt
.Columns("A:H").NumberFormat = "@"   ' (Text)
.Columns(4).NumberFormat = "0.000000000000000000"
' oder Standard, wie gewünscht?
.Columns(7).NumberFormatLocal = "Standard"
lngLast = .Cells(.Rows.Count, 1).End(xlUp).Row
lngLast = Application.Max(lngLast, 9)    'lngLast = Zeilenzähler
Do While Not EOF(intFile)                    ' Datenimport
Line Input #intFile, strTmp
arrSrc = Split(strTmp, strDelimit, -1, vbTextCompare)
If IsError(Application.Match(arrSrc(1), arrUeb, 0)) Then    ' #####
lngLast = lngLast + 1
'ExcelSpalte = CSVSpalte
.Cells(lngLast, 1) = arrSrc(0)
.Cells(lngLast, 2) = arrSrc(1)
.Cells(lngLast, 3) = arrSrc(2)
If arrSrc(3) > "" Then .Cells(lngLast, 4) = CDbl(arrSrc(3))
.Cells(lngLast, 5) = arrSrc(4)
.Cells(lngLast, 6) = arrSrc(5)
If arrSrc(6) > "" Then .Cells(lngLast, 7) = CDbl(arrSrc(6))
.Cells(lngLast, 8) = arrSrc(7)
.Cells(lngLast, 9) = arrSrc(8)
.Cells(lngLast, 10) = arrSrc(9)
.Cells(lngLast, 12) = Now
.Cells(lngLast, 13) = Mid(strSrcFile, InStrRev(strSrcFile, "\") + 1)
.Cells(lngLast, 15).FormulaR1C1 = "=COUNTIF(C1,RC[-14])"
End If                                                      ' #####
Loop
.Columns.AutoFit
Close #intFile                            ' CSV schließen
End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Super! Danke :-)
15.08.2013 14:11:05
Manuela
Hallo Erich,
nun läuft es genau so wie es mir vorgestellt habe. Super, besten Dank!!
Meine Datei nimmt so langsam Gestalt an. Jetzt noch 2-3 Makroproblemchen lösen und der Finalenversion steht nix mehr im Wege. Wahrscheinlich muss ich dann auch nochmal die Hilfe des Forums in Anspruch nehmen, aber vorher muss ich noch eine Musterdatei zusammenschustern..
Dank Dir und Gruß,
Manu

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige