Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1552to1556
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 Datenimport

CSV Datenimport
02.05.2017 15:27:37
Ronny
Ich habe in einem Ordner mehrere CSV-Dateien. Diese werden laufend generiert. Das heisst es kommen laufend Dateien dazu.
Ich möchte mit dem Excel diese Dateien einlesen und die Daten in der richtigen Tabelle einfügen. Ich habe bereits ein Makro mit dem ich per Filedialog eine Datei auswählen kann und diese in der Tabelle 1 einfügt. Nun möchte ich die Daten immer in die Tabelle einfügen wie im CSV in der zweiten Zeile der erste Wert lautet. Es gibt 24 verschiedene Tabellen mit immer den selben Daten die importiert werden.
Die Idee soll es sein das das Excel alles automatisch macht also die Dateien möchte ich nicht über den Filedialog öffnen. Nach dem importieren sollen die Dateien gelöscht oder in einen anderen Ordner gelegt werden.
Mein CSV-Import hat zudem noch ein Problem mit Umlauten.
Beispieldatei ist hier, https://www.herber.de/bbs/user/113243.zip

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV Datenimport
04.05.2017 02:11:04
fcs
Hallo Ronny,
mit dem nachfolgenden Makro sollte der Import funktionieren.
Deine CSV-Dateien enthalten Text-Daten im Unicode (UTF-8) Format.
Deshalb das Problem mit Umlauten.
Es gibt aber auch Probleme mit Zahlen,3 Nachkommastelen haben. Hier wird das Komma bei deinem gewählten Weg des Datenimports als 100er-Zeichen interpretiert.
LG
Franz
Sub Import_CSV_Data()
' Get_CSV_Data Makro
Dim wkbCSV As Workbook, wksCSV As Worksheet
Dim strCSV As String
Dim strSheet As String
Dim wkbZiel As Workbook
Dim wksZiel As Worksheet
Dim lngZeile_Z As Long
Dim strArchiv As String
Dim strFolder As String
Set wkbZiel = ActiveWorkbook
'Verzeichnis mit CSV-Dateien
strFolder = wkbZiel.Path                                            'ggf. anpassen
If Dir(strFolder, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strFolder & vbLf & vbLf & "existiert nicht!",  _
_
vbInformation + vbOKOnly, _
"Verzeichnis mit den CSV-Dateien"
Exit Sub
End If
'Verzeichnis in das die CSV-Dateien verschoben werden sollen
strArchiv = strFolder & Application.PathSeparator & "CSV_Archiv"    'ggf. anpassen
If Dir(strArchiv, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strArchiv & vbLf & vbLf & "existiert nicht!",  _
_
vbInformation + vbOKOnly, _
"Verzeichnis in das CSV-Dateien verschoben werden sollen"
Exit Sub
End If
'CSV-Dateien suchen
strCSV = Dir(strFolder & Application.PathSeparator & "*.csv", vbNormal)
Application.ScreenUpdating = False
'   'gefundene CSV-Dateien abarbeiten
Do Until strCSV = ""
strCSV = strFolder & Application.PathSeparator & strCSV
'CSV-Datei als neue Mappe öffnen - Unicode (UTF-8)
Workbooks.OpenText Filename:=strCSV, _
Origin:=65001, _
StartRow:=2, _
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, 1), Array(5, 1), _
Array(6, 2), Array(7, 4), Array(8, 1), Array(9, 1), _
Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15,  _
1), _
Array(16, 1), Array(17, 1), Array(18, 4), Array(19, 1), Array(20, 1), Array(21,  _
1)), _
DecimalSeparator:=",", ThousandsSeparator:=".", TrailingMinusNumbers:=False
Set wkbCSV = ActiveWorkbook
Set wksCSV = wkbCSV.Sheets(1)
'Ziel-Blatt setzen
strSheet = wksCSV.Range("A1").Text
Set wksZiel = wkbZiel.Sheets(strSheet)
With wksZiel
lngZeile_Z = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
If lngZeile_Z 

Anzeige
AW: CSV Datenimport
04.05.2017 08:55:22
Ronny
Hallo Franz
Danke für deinen Vorschlag. Ich bin mir nicht sicher ob beim Einfügen oder Kopieren was schiefgelaufen ist. Wenn ich der Code Kopiere bekomme ich in den Zeilen
    'Verzeichnis mit CSV-Dateien
strFolder = wkbZiel.Path                                            'ggf. anpassen
If Dir(strFolder, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strFolder & vbLf & vbLf & "existiert nicht!",  _
_
_
vbInformation + vbOKOnly, _
"Verzeichnis mit den CSV-Dateien"
Exit Sub
End If
'Verzeichnis in das die CSV-Dateien verschoben werden sollen
strArchiv = strFolder & Application.PathSeparator & "CSV_Archiv"    'ggf. anpassen
If Dir(strArchiv, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strArchiv & vbLf & vbLf & "existiert nicht!",  _
_
_
vbInformation + vbOKOnly, _
"Verzeichnis in das CSV-Dateien verschoben werden sollen"
Exit Sub
End If
bei MsgBox einen Fehler, also der Code wird schon von Anfang an rot gefärbt. Ich erkenne bloss den Fehler nicht.
Eine Frage noch, muss die Excel-Datei im selben Verzeichnis liegen wie die csv-Dateien?
Gruss
Ronny
Anzeige
AW: CSV Datenimport
04.05.2017 16:19:50
fcs
Hallo Ronny,
da hatte ich nicht bemerkt, dass die Forums-Software zusätzliche " _" an ungünstigen Stelle eingefügt hatte weil die Code-Zeile etwas zu lang ist. " _" am Zeilenende bedeutet, dass die folgende Zeile
Mit folgenden Anpassungen sollte es funktionieren.
Die Verzeichnisse für die CSV-Dateien kannst du beliebig festlegen.
Die Excel-Datei muss nicht im Verzeichnis mit den CSV-Dateien liegen. Ich hatte es so gemacht, weil dann die Programmierung schön einfach ist.
Das Archiv-Verzeichnis für die CSV-Dateien muss jedoch auf dem gleichen Laufwerk liegen, wie das Verzeichnis aus dem die CSV-Dateien eingelesen werden. Sonst funktioniert die gewählte Methode zum Verschieben nicht.
LG
Franz
    'Verzeichnis mit CSV-Dateien
strFolder = wkbZiel.Path                                            'ggf. anpassen
If Dir(strFolder, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strFolder & vbLf & vbLf _
& "existiert nicht!", _
vbInformation + vbOKOnly, _
"Verzeichnis mit den CSV-Dateien"
Exit Sub
End If
'Verzeichnis in das die CSV-Dateien verschoben werden sollen
strArchiv = strFolder & Application.PathSeparator & "CSV_Archiv"    'ggf. anpassen
If Dir(strArchiv, vbDirectory) = "" Then
MsgBox "Das Verzeichnis " & vbLf & vbLf & strArchiv & vbLf & vbLf _
& "existiert nicht!", _
vbInformation + vbOKOnly, _
"Verzeichnis in das CSV-Dateien verschoben werden sollen"
Exit Sub
End If

Anzeige
AW: CSV Datenimport
08.05.2017 08:37:21
Ronny
Hallo Franz
Ich hatte es mir gedacht, dass mit den "_" etwas nicht stimmt. Aber egal wie ich es probiert habe, es war immer falsch. Ich habe das immer noch nicht begriffen wie es genau klappt.
Aber es hat nun funktioniert. Das Problem ist bloss noch, dass die CSV-Dateien nicht nur den Namen des Typs beinhalten sondern auch noch das Datum mit Uhrzeit beinhalten. Also so "MNN9 - 20170505115415.csv"
Meine Tabellen enthalten nur den Namen des Typs, also in dem Fall nur "MNN9". Ich kann das leider nicht ändern weil ich einen Dateiname benötige der einmalig ist. Kann man den Teil abschneiden?
Dann noch eine Frage zum Platzieren des Codes. Für mich war es einfach zum ausprobieren wenn ich den Code mal in einer Tabelle platziert hatte und über einen Button ausführe. Nun habe ich aber in der Beispieldatei 24 Tabelle. Also für jeden Typ eine Tabelle. Kann ich den Code auch über alles ausführen also wenn ich ihn in die Arbeitsmappe kopiere oder wäre da ein Modul besser?
Danke viel mal fürs Helfen! Ist echt was tolles wenn es klappt!
Gruss
Ronny
Anzeige
AW: CSV Datenimport
08.05.2017 14:38:09
fcs
Hallo Ronny,
Ich hatte es mir gedacht, dass mit den "_" etwas nicht stimmt. Aber egal wie ich es probiert habe, es war immer falsch. Ich habe das immer noch nicht begriffen wie es genau klappt.
Mit der Zeichenfolge " _" + Enter kann man im VBA-Editor eine sehr lange Anweisung in mehrere Zeilen umbrechen. Am besten wählt man hierfür eine Posituion nach einem Komma, das Parameter trennt.
Auf keinen Fall darf man dabei Ausdrücke, die in Anführungszeichen gesetzt sind trennen!
Möchte man lange Texte auf mehrere Zeilen aufteilen, dann muss man am Zeilenende " & _ einfügen und die folgende Zeile mit & " beginnen.
... Das Problem ist bloss noch, dass die CSV-Dateien nicht nur den Namen des Typs beinhalten sondern auch noch das Datum mit Uhrzeit beinhalten. Also so "MNN9 - 20170505115415.csv"
Meine Tabellen enthalten nur den Namen des Typs, also in dem Fall nur "MNN9". Ich kann das leider nicht ändern weil ich einen Dateiname benötige der einmalig ist. Kann man den Teil abschneiden?

Wann soll der Teil nach dem Typ abgeschnitten werden?
Beim Verschieben ins CSV-Archiv? Falls ja, dann darf die entsprechende Datei im Archiv noch nicht vorhanden sein oder sie muss dort vorher gelöscht werden.
Der entsprechende Abschnitt muss dann wie folgt angepasst werden.
'   'gefundene CSV-Dateien verschieben
'CSV-Dateien suchen
strCSV = Dir(strFolder & Application.PathSeparator & "*.csv", vbNormal)
Do Until strCSV = ""
'Datei umbenennen/verschieben
strSheet = strCSV
'" - DatumUhrzeit" aus Name der CSV herausschneiden
strSheet = Left(strSheet, InStr(1, strSheet, " -") - 1) & ".csv"
'prüfen ob Datei strSheet im Archiv schon vorhanden ist
If Dir(strArchiv & Application.PathSeparator & strSheet, vbNormal)  "" Then
'Datei im Archiv löschen
VBA.Kill strArchiv & Application.PathSeparator & strSheet
End If
'CSV-Datei ins Archiv verschieben und umbenennen
Name strFolder & Application.PathSeparator & strCSV _
As strArchiv & Application.PathSeparator & strSheet
strCSV = Dir(strFolder & Application.PathSeparator & "*.csv", vbNormal)
Loop
Dann noch eine Frage zum Platzieren des Codes. ... Kann ich den Code auch über alles ausführen also wenn ich ihn in die Arbeitsmappe kopiere oder wäre da ein Modul besser?
Es funktioniert sowohl wenn du das Makro unter "DieseArbeitsmappe" ablegst als auch unter einem allgemeinen Modul. Ich empfehle ein allgemeines Modul zu nehmen.
Als Schaltfläche verwendest du die Schaltfläche aus den Formularsteuerelementen. Dieser weist du das Makro einmal zu und kannst die Schaltfläche dann in alle anderen Blätter kopieren.
LG
Franz
Anzeige
AW: Code-Zeilen Trennen - Korrektur
08.05.2017 14:45:21
fcs
Hallo Ronny,
bei den Hinweisen zum Trennen von Codezeilen ist mir ein kleiner Fehler passiert. Es ist mir ein &-Zeichen zuviel reingerutscht.
Auf keinen Fall darf man dabei Ausdrücke, die in Anführungszeichen gesetzt sind trennen!
Möchte man lange Texte auf mehrere Zeilen aufteilen, dann muss man am Zeilenende " & _ einfügen und die folgende Zeile mit " beginnen. So werden die Textteile bei der Abarbeitung des Makros korrekt zusammengefügt.
LG
Franz
AW: Code-Zeilen Trennen - Korrektur
09.05.2017 08:28:10
Ronny
Hallo Franz,
danke für deine Ausführungen! Das ist sehr hilfreich. War mir schon aufgefallen das fast immer nach einem , getrennt wird. Also wenn man sich den Code ansieht die andere schreiben. Immerhin habe ich das mit dem & kapiert. Braucht man ja oft auch um Strings zusammen zu setzen.
Jetzt noch zum Thema wieso ich den Dateinamen abschneiden wollte. Ich meinte das etwas anders. Also ich habe den Code in ein Modul kopiert. Das läuft bis auf einen Laufzeitfehler 9: Index ausserhalb des gültigen Bereichs. Das Modul ist in meiner Exceldatei wo ich für jeden typ eine Tabelle habe. Das Modul führe ich über einen Button aus. Dann kommt der Laufzeitfehler. Es macht mir aber trotzdem ein neues Excel-File auf mit genau dem Namen der Datei, also MNN9 - 20170309114523.csv also wenn ich auf Debuggen klicke. Leider importiert er aber dann nichts in meine eigentliche Datei.
Der Fehler kommt in der Zeile:
'Ziel-Blatt setzen
strSheet = wksCSV.Range("A1").Text
Set wksZiel = wkbZiel.Sheets(strSheet)
Gruss
Ronny
Anzeige
AW: Code-Zeilen Trennen - Korrektur
10.05.2017 15:56:03
Ronny
Hallo Franz
Es ist alles in Ordnung und es klappt auch alles. Sorry war ein echt dummer Fehler von mir. Ich hatte eine CSV-Datei die etwas älter war als die eigentlichen. Dabei fehlt noch der Eintrag vom Typ der schlussendlich im Feld A1 steht. Das Problem hat sich somit erledigt! Ich bin sehr zufrieden wie es läuft.
Vielen vielen Dank für deine Hilfe!
Gruss
Ronny

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige