Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
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
csv-Datei mit Zahlen, Semikolon als Tr.
29.07.2020 19:22:01
Christian
Hallo noch einmal,
bezogen auf meine Anfrage unter dem Linke https://www.herber.de/forum/cgi-bin/call_thread.pl?index=1773059
möchte ich eine csv-Datei über ein Auswahlfenster importieren, welche Semikolon als Trennzeichen hat , jedoch Dezimalzalen mit Kommas hat. Diese csv-Datei soll in Zelle A1 eines anderen Blattes importiert werden.
Folgenden Code habe ich schon versucht, jedoch überschreibt dieser mit immer die 1 Zeile und die Zahlen werden ohne Kommas eingelesen:
Private Sub CommandButton2_Click()
Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
Const cstrDelim As String = ";" 'Trennzeichen
FilePath = "C:\Ablage\"  ' anpassen
FileName = "*" & ThisWorkbook.Worksheets("Blatt1").Range("A1") & "*"  'anpassen
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = FilePath & FileName
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle-Dateien", "*.*", 2
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With
If strFileName  "" Then
Application.ScreenUpdating = False
Open strFileName For Input As #1
arrDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
For lngR = 0 To UBound(arrDaten)
arrTmp = Split(arrDaten(lngR), cstrDelim)
If UBound(arrTmp) > -1 Then
With ThisWorkbook.Worksheets("Blatt2").Range("A1")
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lngLast = Application.Max(lngLast, 1)
.Cells(lngLast, 1).Resize(, UBound(arrTmp) + 1) _
= Application.Transpose(Application.Transpose(arrTmp))
End With
End If
Next lngR
End If
End Sub

MIt dem Makro-Recorder habe ich die Datei richtig importieren können und bekomme folgendes:
Sub Makro4()
Sheets("Blatt 1").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Ablage\test.csv" _
, Destination:=Range("$A$1"))
.CommandType = 0
.Name = "Kalibrierung LP"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 1252
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = True
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 _
, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub Wäre Klasse wenn mir hier noch geholfen werden kann :-)
Viele Grüße
Christian

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: und warum dafür VBA? ...
29.07.2020 19:26:28
neopa
Hallo Christian,
... nutze doch in Deiner Excelversion einfach die Funktionalität: Daten und da Abrufen und und transformieren (PowerQuery).
Gruß Werner
.. , - ...
AW: und warum dafür VBA? ...
29.07.2020 19:32:04
Christian
Weil das erst der Anfang ist und mehrere Datein auf dem gleichen Weg importiert werden müssen. Meine Kollegen hier immer umständlich geschult werden müssen und ich das Ganze über einen einfachen Klick auf einen Button sicherer machen möchte :-)
AW: wenn es so ist, wie Du jetzt schreibst ...
29.07.2020 19:38:38
neopa
Hallo Christian,
... nämlich das "..mehrere Dateien auf dem gleichen Weg importiert werden müssen", das kannst Du eine Vorlage mit einer PQ-Lösung machen. Es bedarf dann wahrscheinlich auch nur noch ein Mausklick, um die Daten einzulesen.
Gruß Werner
.. , - ...
Anzeige
AW: wenn es so ist, wie Du jetzt schreibst ...
29.07.2020 19:47:09
Christian
Hallo Werner,
ich kann Dir leider nicht wirklich folgen .. dafür reichen meine Kenntnisse nicht aus :-(
Viele Grüße
Christian
AW: dann ...
29.07.2020 19:51:50
neopa
Hallo Christian,
... ist für mich offensichtlich, dass Du Dich noch nicht mit PowerQuery (PQ) beschäftigt hast. Dazu sieh z.B. mal hier: https://support.microsoft.com/de-de/office/hilfe-zu-microsoft-power-query-f%c3%bcr-excel-2b433a85-ddfb-420b-9cda-fe0e60b82a94?correlationid=5cc8d039-a622-404f-a9fe-1a04d52f249b&ui=de-de&rs=de-de&ad=de
und u.a. auch hier: http://www.excel-ist-sexy.de/
Gruß Werner
.. , - .
Anzeige
AW: dann ...
29.07.2020 20:11:41
Christian
Hallo Werner,
Danke für den Tipp für die Zukunft... bisher reichte mir immer für Kleinigkeiten der Makro-Recorder und diverse Forum-Recherchen aus. Nur leider scheint es hier nur eine Kleinigkeit zu sein, die ich nicht finde.
Wäre schön wenn mir jemand mein Makro untersuchen und mir hier helfen könnte
Viele Grüße
Christian
AW: dann ...
30.07.2020 00:22:16
volti
Hallo Christian,
vielleicht hilft dieses hier:
In Deinem Makro war einiges durcheinander, hoffe, dass es jetzt besser passt:
[+][-]
Private Sub CommandButton2_Click() Dim strFileName As String, strFilePath As String, arrDaten, arrTmp, lngR As Long, lngLast As Long Const cstrDelim As String = ";" 'Trennzeichen strFilePath = "C:&bsol;Ablage&bsol;" ' anpassen strFileName = "*" & ThisWorkbook.Worksheets("Blatt1").Range("A1") & "*" 'anpassen With Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = False .Title = "Datei wählen" .InitialFileName = strFilePath & strFileName .Filters.Add "CSV-Dateien", "*.csv", 1 .Filters.Add "Alle-Dateien", "*.*", 2 If .Show = -1 Then strFileName = .SelectedItems(1) End With If strFileName <> "" Then Application.ScreenUpdating = False Open strFileName For Input As #1 arrDaten = Split(Input(LOF(1), 1), vbCrLf) Close #1 For lngR = 0 To UBound(arrDaten) arrTmp = Split(arrDaten(lngR), cstrDelim) If UBound(arrTmp) > -1 Then With ThisWorkbook.Worksheets("Blatt2") 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 End Sub
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: da muss ich Werner Recht geben...
29.07.2020 19:54:31
EtoPHG
Christian,
Wenn Du Dich schon als der Experte unter deinen XL Anwendern ausgibst, beschäftige doch erst mal mit den modernen Hilfsmitteln wie PQ die XL zur Verfügung stellt.
Warum stürzen sich immer alle Anfänger auf VBA, das sie dann total überfordert.
Gruess Hansueli
AW: da muss ich Werner Recht geben...
30.07.2020 01:10:01
Günther
Danke Hansueli, du sprichst mir aus der Seele!
Es wird immer "Ich habe keine/kaum Ahnung von VBA, will aber eine kostenlose VBA-Lösung haben" - Fragesteller geben und leider auch immer Helferlein, die eilfertig die volle Packung liefern ... Hilfe zur Selbsthilfe sollte in Foren selbstverständlich sein. Aufzeigen, wie die üblichen Makrorekorder-Macken ausgebügelt werden können auch, aber den Unwillen, etwas zukunftsweisendes zu lernen zu unterstützen, das sollte imho nicht noch unterstützt werden.
 
Gruß
Günther  |  mein Excel-Blog
Anzeige
AW: CSV-Datei importieren
30.07.2020 00:57:46
fcs
Hallo Christian,
im Prinzip funktioniert dein Makro, aber es fügt die Daten ab Zelle A2 ein.
Hier muss die Berechnung der 1. Einfügezeile angepasst werden.
Auch das doppelte Transponieren von Array arrTemp beim Einfügen der Zeile verstehe nicht - kann man vereinfachen.
Allerdings gibt es das Problem, dass die Zahlenwerte als Text in der Tabelle stehen.
Das müsste ggf. nachträglich korrigiert werden.
"Einfacher" ist es die CSV-Datei zu öffnen und den Inhalt in das Blatt 2 zu kopieren.
Hier muss man dann auch nicht zeilenweise arbeiten, sondern kann alle Daten in einem Rutsch einfügen.
Ich hab das mal als Variante mit eingestellt.
LG
Franz

Private Sub CommandButton2_Click()
Dim strFileName As String, arrDaten, arrTmp, lngR As Long, lngLast As Long
Const cstrDelim As String = ";" 'Trennzeichen
FilePath = "C:\Ablage\"  ' anpassen
Filename = "*" & ThisWorkbook.Worksheets("Blatt1").Range("A1") & "*"  'anpassen
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = FilePath & Filename
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle-Dateien", "*.*", 2
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With
If strFileName  "" Then
Application.ScreenUpdating = False
Open strFileName For Input As #1
arrDaten = Split(Input(LOF(1), 1), vbCrLf)
Close #1
With ThisWorkbook.Worksheets("Blatt2")
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
If lngLast = 1 Then
If .Cells(1, 1)  "" Then
lngLast = 2
End If
Else
lngLast = lngLast + 1
End If
For lngR = 0 To UBound(arrDaten)
arrTmp = Split(arrDaten(lngR), cstrDelim)
If UBound(arrTmp) > -1 Then
.Cells(lngLast + lngR, 1).Resize(, UBound(arrTmp) + 1) _
= arrTmp
End If
Next lngR
End With
End If
End Sub
'Variante - CSV-Datei wird geöffnet als Datei - Inhalt kopiert und dann Datei wieder  _
geschlossen
Private Sub CommandButton2_Click()
Dim strFileName As String, lngLast As Long
Dim wkbCSV As Workbook
FilePath = "C:\Ablage\"  ' anpassen
Filename = "*" & ThisWorkbook.Worksheets("Blatt1").Range("A1") & "*"  'anpassen
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Title = "Datei wählen"
.InitialFileName = FilePath & Filename
.Filters.Add "CSV-Dateien", "*.csv", 1
.Filters.Add "Alle-Dateien", "*.*", 2
If .Show = -1 Then
strFileName = .SelectedItems(1)
End If
End With
If strFileName  "" Then
Application.ScreenUpdating = False
'CSV-Datei schreibgeschützt öffnen, mit Prameter Local:=True werden lokales  _
Trennzeichen(;) undDezimalzeichen (,) verwendet.
Set wkbCSV = Application.Workbooks.Open(strFileName, ReadOnly:=True, Local:=True)
With ThisWorkbook.Worksheets("Blatt2")
lngLast = .Cells(Rows.Count, 1).End(xlUp).Row
If lngLast = 1 Then
If .Cells(1, 1)  "" Then
lngLast = 2
End If
Else
lngLast = lngLast + 1
End If
wkbCSV.Worksheets(1).UsedRange.Copy
.Cells(lngLast, 1).PasteSpecial Paste:=xlPasteValues
End With
Application.CutCopyMode = False
wkbCSV.Close savechanges:=False
End If
End Sub

Anzeige
AW: CSV-Datei importieren
30.07.2020 10:00:30
Christian
Hallo Franz,
Vielen Dank für die schnelle Fehlersuche und Anpassung … das hilft mir wirklich weiter und ich kann das nun auf viele Dinge adaptieren.
Dir ein schönes sonniges Wochenende
Viele Grüße
Christian
AW: CSV-Datei importieren
30.07.2020 10:01:59
Christian

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige