Frage: Mehrere csv-Dateien in eine Excel-Tabelle

Hallo, habe mir einige Artikel zu dem Thema durchgelesen, da ich ebenfalls regelmäßig identisch aufgebaute csv-Datensätze in einer Exceltabelle (2003) zusammenfassen möchte.
Die CSV-Dateien enthalten in Zeile 1 die Feldnamen und in Zeile 2 die jeweiligen Daten.
Die Daten in der CSV-Datei sind per Semikolon getrennt, Dezimalstellen per Punkt, Text enthält manchmal Kommas.
Diese Daten müssen täglich in eine Datenbank eingespielt werden.
Da es reichlich umständlich ist, täglich 50 CSV-Dateien einzeln zu importieren, sollen sie in einer Exceltabelle zusammengefasst werden, um die Daten in einem Rutsch in die Datenbank zu importieren.
Das wäre eine echte Erleichterung.

Die Execeltabelle soll daher folgendermaßen aussehen:
In Zeile 1 die Feldnamen aus den CSV-Dateien (die ja immer gleich sind).
Ab Zeile 2 die eigentlichen Daten.

Ich habe den Code aus http://www.wer-weiss-was.de/article/6344078 für mich folgendermaßen angepasst:

Sub CSVEinlesen()
Dim fs As FileSearch, ZeiQ As Long, ZeiZ As Long, F As Integer
Dim wksQ As Worksheet, wksZ As Worksheet
Set wksZ = ThisWorkbook.Worksheets(„Tabelle1“) 'Anpassen
Set fs = Application.FileSearch
On Error GoTo hell
Call Loesch
Application.ScreenUpdating = False
With fs
.LookIn = „C:…Anfragen\CSV“ 'Anpassen
.SearchSubFolders = False 'Anpassen
.Filename = „*.csv“
If .Execute() > 0 Then
For F = 1 To .FoundFiles.Count
ZeiZ = wksZ.Cells(Rows.Count, 1).End(xlUp).Row + 1
Workbooks.Open Filename:=.FoundFiles(F) ', Format:=4 '4=Semikolon 'Anpassen
ZeiQ = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
ActiveWorkbook.Worksheets(1).Rows(„2:“ & ZeiQ).Copy Destination:=wksZ.Cells(ZeiZ, 1)
Next F
Else
MsgBox „There were no xls files found in c:…Anfragen\CSV.“
End If
Call Loesch
End With
hell:
If Err.Number 0 Then
MsgBox ActiveWorkbook.Name & vbCr & Err.Number & vbCr & Err.Description
End If
Application.ScreenUpdating = True
End Sub
Sub Loesch()
Dim wkb As Workbook
Application.ScreenUpdating = False
For Each wkb In Workbooks
If wkb.Name ThisWorkbook.Name And UCase(wkb.Name) „PERSONL.XLS“ Then
wkb.Close savechanges:=False
End If
Next wkb
Application.ScreenUpdating = True
End Sub

Das Ergebnis ist leider noch nicht „perfekt“, denn ich habe das Gefühl, dass die Funktion „Text in Spalten“ nicht richtig ausgeführt wird.
Das Ergenis ist nämlich folgendermaßen:
Alle Datensätze sind in einer Spalte zusammengefasst.
AUSSER es ist ein Komma in einem Datensatz, dann wird getrennt und in einer neuen Spalte weitergemacht.
Das verstehe ich gar nicht, ich dacht Format=4 (Semikolon)??? würde das schon berücksichtigen. Und wenn ich die CSV-Dateien einzeln mit Excel öffne, funktioniert es ja einwandfrei (Tabellenblatt mit 2 Zeilen und jeweiligen Spalten).

Und es fehlen mir noch die Feldnamen in Zeile 1, logo, aber ich habe halt null Plan von VB…

Kann mir jemand dazu noch einen Tipp geben? Das wäre echt prima!

Vielen Dank und viele Grüße

Dirk

Da es reichlich umständlich ist, täglich 50 CSV-Dateien
einzeln zu importieren, sollen sie in einer Exceltabelle
zusammengefasst werden, um die Daten in einem Rutsch in die
Datenbank zu importieren.
Das wäre eine echte Erleichterung.

Wenn du das machst weil dir das mit Excel so gefällt und du die daten dann für was anderes brauchst , ok . Aber warum sol ich was 2 mal portieren wenn direkt nun wirklich einfach geht.

Das kann man sogar über eine batch datei regeln , da man datenbanken meist auch über kommandozeile füttert.

Nichts für ungut, aber aus erfahrung hab ich selbst gesehen das dabei die meisten probleme auftreten, durch das ewig hin und her portieren, und gerade excel macht mit CVS dateien auch so seine Geschichten. Zweitens ist Excel ungeeignet bei Zeichen von mehr als 255 pro Zelle , Da wird faktisch abgeschnitten , bei CVS dateien aber nicht, damit kannich auch ein TEXT feld mit einem roman füllen.

Deswegen kann ich dir nur abraten diese amateurhafte protieren zwischen mehrern formaten, und empfehle einen zweizeiler in einem script oder batch vorzuziehen. Deine Lösung heist möglicher Datenverlusst , das wird dein auge auch nicht mal eben prüfen .

wenn man wüsste was für ein Datenbank Server das ist, auf welchen System der läuft, dann sollte das nicht das Problem sein dafür die korrekte Lösung zusammen zu fummeln .

Hi,

Wenn du das machst weil dir das mit Excel so gefällt und du
die daten dann für was anderes brauchst , ok . Aber warum sol
ich was 2 mal portieren wenn direkt nun wirklich einfach geht.

Das ist sicher richtig, aber ich suche halt etwas, was ich zumindest ansatzweise selbst „verstehe“ und bedienen kann. Und im Ansatz funktioniert es ja schon in etwa so, wie es mir vorstelle.

Das kann man sogar über eine batch datei regeln , da man
datenbanken meist auch über kommandozeile füttert.

Natürlich bin ich Alternativen, die noch einfacher/besser sind immer aufgeschlossen.

Nichts für ungut, aber aus erfahrung hab ich selbst gesehen
das dabei die meisten probleme auftreten, durch das ewig hin
und her portieren, und gerade excel macht mit CVS dateien auch
so seine Geschichten. Zweitens ist Excel ungeeignet bei
Zeichen von mehr als 255 pro Zelle , Da wird faktisch
abgeschnitten , bei CVS dateien aber nicht, damit kannich auch
ein TEXT feld mit einem roman füllen.

Ja, das stimmt leider, z. B. werden die führenden Nullen bei den Vorwahlen abgeschnitten, welches ich aber bisher mit der „Übersetzungsmaske“ beim CSV-Import im Zielprogramm (eGroupware) korrigieren kann.

Deswegen kann ich dir nur abraten diese amateurhafte protieren
zwischen mehrern formaten, und empfehle einen zweizeiler in
einem script oder batch vorzuziehen. Deine Lösung heist
möglicher Datenverlusst , das wird dein auge auch nicht mal
eben prüfen .

wenn man wüsste was für ein Datenbank Server das ist, auf
welchen System der läuft, dann sollte das nicht das Problem
sein dafür die korrekte Lösung zusammen zu fummeln .

Ähm, ja… da kenne ich mich nur rudimentär aus, weil das ganze ein Freund für uns installiert hat (der im Moment auch noch im Ausland ist) und ich ein Windowskind bin.
Also, unser Server läuft auf Linux (Ubuntu).
Darauf läuft die eGroupware (1.6…) und die greift auf eine MySQL-Datenbank zurück.
So, an der Stelle bin ich mit meinem Computer-Latein am Ende.

Wenn du das machst weil dir das mit Excel so gefällt und du
die daten dann für was anderes brauchst , ok . Aber warum sol
ich was 2 mal portieren wenn direkt nun wirklich einfach geht.

Das ist sicher richtig, aber ich suche halt etwas, was ich
zumindest ansatzweise selbst „verstehe“ und bedienen kann. Und
im Ansatz funktioniert es ja schon in etwa so, wie es mir
vorstelle.

Hallo Binhero,

ich habe nicht das Wissen von Datenbanken u.v.m. wie Lae, ich kann dir aber evtl. eine Excel-Lösung in Vba anbieten.

Du hast immer zweizeilige csv-dateien?
Erste Zeile quasi die Spaltenüberschriften.
Zweite Zeile die Datenzeile dazu.

Dann erstelle bitte eine mappe.
In Blatt1 sieht man wie dein bisheriger Code da sagen wir mal drei csv-dateien eingelesen hat.
In Blatt2 schreibst du rein wie denn das Ergebnis aussehen soll.

In Blatt3 zeigst du in Zeile 1 und 2 den Inhalt von Csv1
In Zeile 3 und 4 den Inhalt von csv2 usw.

Stehen in den csvs intime Daten so ändere die ab, ersetzte Text durch zufallstext aber laß Textlängen und Trennzeichen wie Komma, Semikolon unberührt.

Hochladen mit http://npshare.de/

Achja, wo stehen diese 50 csv-Dateien, alle in einem ordner?
Stehen nur die drin oder noch andere csv-Dateien, wie erkennt man dann welche gemeint sind.
Welche Excelversion hast du?

Gruß
Reinhard

Hey Reinhard,

das klingt doch gut, vielen Dank. Hier die Infos:

Hallo Binhero,

ich habe nicht das Wissen von Datenbanken u.v.m. wie Lae, ich
kann dir aber evtl. eine Excel-Lösung in Vba anbieten.

Du hast immer zweizeilige csv-dateien?

Jawohl!

Erste Zeile quasi die Spaltenüberschriften.
Zweite Zeile die Datenzeile dazu.

Ganz genau!

Dann erstelle bitte eine mappe.
In Blatt1 sieht man wie dein bisheriger Code da sagen wir mal
drei csv-dateien eingelesen hat.
In Blatt2 schreibst du rein wie denn das Ergebnis aussehen
soll.

In Blatt3 zeigst du in Zeile 1 und 2 den Inhalt von Csv1
In Zeile 3 und 4 den Inhalt von csv2 usw.

Stehen in den csvs intime Daten so ändere die ab, ersetzte
Text durch zufallstext aber laß Textlängen und Trennzeichen
wie Komma, Semikolon unberührt.

Hochladen mit http://npshare.de/

Habe ich gemacht.
http://npshare.de/files/d67698e2/CSV_zusamengefasst…

Achja, wo stehen diese 50 csv-Dateien, alle in einem ordner?
Stehen nur die drin oder noch andere csv-Dateien, wie erkennt
man dann welche gemeint sind.

Sie werden täglich in einen Ordner geladen und danach in einem anderen Ordner archiviert.

Welche Excelversion hast du?

Excel 2003

Wenn noch mehr Fragen auftauchen, stehe ich Gewehr bei Fuß :smile:

Grüße zurück

Gruß
Reinhard

Ach ja, das habe ich noch vergessen.

In Blatt1 in Zeile 5 und 8 sieht man den Effekt, wie das Komma wirkt (Trennung des Datensatzes in zwei Spalten)

Und im Blatt „so solls aussehen“ sieht man, dass in Spalte „P“ die Nullen der Vorwahlen wegfallen… das ist aber wie schon gesagt nicht so dramatisch, da ich dass ohne Aufwand von der eGroupware korrigiert bekomme.

Hallo Dirk,

http://www.wer-weiss-was.de/article/6344078 für mich

ich habe jetzt den Link nicht geprüft aber der Code ist wohl von mir.

Das Ergebnis ist leider noch nicht „perfekt“, denn ich habe
das Gefühl, dass die Funktion „Text in Spalten“ nicht richtig
ausgeführt wird.

„Text in Spalten“? In Vba heißt das TextToColumns und das steht nicht im Code.

Das verstehe ich gar nicht, ich dacht Format=4 (Semikolon)???
würde das schon berücksichtigen.

Ja, dafür hatte ich es reingeschrieben ABER es kommt so nicht zum Tragen.
Hochkommas bedeuten alles was rechts vom Hochkomma steht wird nicht ausgeführt.
Ist quasi nur Rem bzw. Remarks bzw. bemerkung/Erklärung.

Ändere mal diese eine Codezeile so ab:

Workbooks.Open Filename:=.FoundFiles(F) , Format:=4

war’s das? Wenn nicht so schau ich nochmal genauer.

Gruß
Reinhard

Hallo Dirk,

In Blatt1 in Zeile 5 und 8 sieht man den Effekt, wie das Komma
wirkt (Trennung des Datensatzes in zwei Spalten)

okay, aber das schau ich mir erst an wenn du die eine Codezeile geändert hast.

Und im Blatt „so solls aussehen“ sieht man, dass in Spalte
„P“ die Nullen der Vorwahlen wegfallen… das ist aber wie
schon gesagt nicht so dramatisch, da ich dass ohne Aufwand von
der eGroupware korrigiert bekomme.

Tja nun, altes Problem in Excel. Kann man schon mit Vba gegensteuern, z.B. ein Hochkomma davor setzen, mit Nullen auffüllen und als Text in die Zelle schreiben.
Daß es aber in Excel kein Häkchen gibt „Importiere die Daten so wie sie sind und wage es nicht da was zwangsumzuwandeln (Nuller entfernen) o.ä.“ finde ich recht ärgerlich für alle User weltweit.

Gruß
Reinhard

Ja, klar ist der Code von Dir :wink:

Hm, die Zeile in „Workbooks.Open Filename:=.FoundFiles(F) , Format:=4“ zu ändern, bringt leider keinen Unterschied. Immernoch erfolgt eine Splittung in zwei Spalten, sobald ein Komma zwischen 2 Semikolons auftaucht.

Das Ergebnis ist leider noch nicht „perfekt“, denn ich habe
das Gefühl, dass die Funktion „Text in Spalten“ nicht richtig
ausgeführt wird.

„Text in Spalten“? In Vba heißt das TextToColumns und das steht
nicht im Code.

Ok, ich dachte, das wäre schon Teil des Codes…
Und wenn ein Komma auftaucht, trennt er ja auch. Das soll aber doch beim Semikolon passieren, gell?

Seltsam, seltsam…

Das mit den Nullen, wäre ja auch theoretisch kein Problem, wenn Excel die CSV-Datei wirklich als CSV-Input akzeptieren würde und auch so wieder zurückgeben würden.
Aber leider sind die Zellen beim Import als Standard definiert (führende Null fällt weg) und eine Formatänderung der Zelle auf Text, wird im CSV-Format nicht abgespeichert. Tolle Wurst :frowning:
Da ist Open Office etwas flexibler… dafür mit anderen Nachteilen versehen…

Hallo Dirk,

In Blatt1 in Zeile 5 und 8 sieht man den Effekt, wie das Komma
wirkt (Trennung des Datensatzes in zwei Spalten)

warum wird da getrennt?
Ich wollte da den Inhalt der csvs sehen so wie sie in der datei stehen.
D.h. in einem Texteditor rauskopieren und in Excel einfügen.
Da dürfte m.E. nichts von Excel getrennt werden.

Und im Blatt „so solls aussehen“ sieht man, dass in Spalte
„P“ die Nullen der Vorwahlen wegfallen… das ist aber wie
schon gesagt nicht so dramatisch, da ich dass ohne Aufwand von
der eGroupware korrigiert bekomme.

Okay, lassen wir erstmal die Nuller weg.

Gruß
Reinhard

Guten Morgen Reinhard,

Das hatte ich dann wohl falsch verstanden.
In Blatt 2 (Tabelle2) sind zwei Datensätze untereinander, sowie ich sie bekommen und dann mit Excel geöffnet bekomme.

Ich habe eine neue Datei hochgeladen, wo ich in Blatt2 die Inhalte aus einem Editor reinkopiert habe.

http://npshare.de/files/64853202/CSV_zusamengefasst2…

Gruß Dirk

Ich habe eine neue Datei hochgeladen, wo ich in Blatt2 die
Inhalte aus einem Editor reinkopiert habe.

http://npshare.de/files/64853202/CSV_zusamengefasst2…

Hallo Dirk,

ja, so brauch ich das.

Es gibt jetzt zwei neue Blätter, Originalcsv und Ergebnis.

In Originalcsv sind deine Rohdaten aus Tabelle2, aus denen erstelle ich drei zweizeilige csv-Dateien mit dem Code von „CSVErstellen“ im Ordner: c:\test\auswahl.

Im Blatt Ergebnis erscheinen dann die eingelesenen Daten aus den drei csv-Dateien. In Spalte P sind wieder (Vor-) Nuller vorhanden.
Was noch fehlt ist Korrektur bestimmter Sonderzeichen, ü wird noch als ü dargestellt usw.

Nachfolgend die Codes fürs hiesige Archiv, hier die Datei:

http://npshare.de/files/da0708b8/kwCSV_zusamengefass…

Gruß
Reinhard

Option Explicit

Sub CSVEinlesen()
 Dim fs As FileSearch, ZeiQ As Long, ZeiZ As Long, F As Integer
 Dim wksQ As Worksheet, wksZ As Worksheet
 Set wksZ = ThisWorkbook.Worksheets("Ergebnis") 'Anpassen
 Set fs = Application.FileSearch
 On Error GoTo hell
 Call Loesch
 Application.ScreenUpdating = False
 wksZ.UsedRange.ClearContents
 With fs
 .LookIn = "c:\test\Auswahl"
 '.LookIn = "Z:\profin intern\Finanzierungsanfragen\Anfragen\CSV\20110608" 'Anpassen
 .SearchSubFolders = False 'Anpassen
 .Filename = "\*.csv"
 If .Execute() \> 0 Then
 For F = 1 To .FoundFiles.Count
 ZeiZ = wksZ.Cells(Rows.Count, 1).End(xlUp).Row + 1
 Workbooks.Open Filename:=.FoundFiles(F), Format:=4 '4=Semikolon 'Anpassen
 ZeiQ = ActiveWorkbook.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
 ActiveWorkbook.Worksheets(1).Rows("2:" & ZeiQ).Copy Destination:=wksZ.Cells(ZeiZ, 1)
 If wksZ.Cells(1, 1).Value = "" Then
 ActiveWorkbook.Worksheets(1).Rows(1).Copy Destination:=wksZ.Cells(1, 1)
 End If
 Next F
 Else
 MsgBox "There were no xls files found in c:\.....Anfragen\CSV."
 End If
 ThisWorkbook.Worksheets("Ergebnis").Columns(16).NumberFormat = "00000"
 Call Loesch
 End With
hell:
 If Err.Number 0 Then
 MsgBox ActiveWorkbook.Name & vbCr & Err.Number & vbCr & Err.Description
 End If
 Application.ScreenUpdating = True
End Sub

Sub Loesch()
 Dim wkb As Workbook
 Application.ScreenUpdating = False
 For Each wkb In Workbooks
 If wkb.Name ThisWorkbook.Name And UCase(wkb.Name) "PERSONL.XLS" Then
 wkb.Close savechanges:=False
 End If
 Next wkb
 Application.ScreenUpdating = True
End Sub

Sub CSVErstellen()
Dim N As Integer, FF As Long
If Dir("c:\test\Auswahl\/nul") = "" Then MkDir "c:\test\Auswahl"
For N = 1 To 3
 FF = FreeFile
 Open "c:\test\Auswahl\Test" & N & ".csv" For Output As #FF
 Print #FF, Worksheets("Originalcsv").Cells((N - 1) \* 2 + 1, 1).Value
 Print #FF, Worksheets("Originalcsv").Cells((N - 1) \* 2 + 2, 1).Value
 Close #FF
Next N
End Sub

Hallo Reinhard,

aha, erstmal vielen Dank für Deinen unermütlichen Einsatz.

Allerdings kapiere ich noch nicht ganz, wie es funktioniert.
Ich versuche mal zu erklären, was ich verstanden habe:

Es gibt jetzt zwei neue Blätter, Originalcsv und Ergebnis.

Ok, das kann ich nachvollziehen. Das heißt, den Rest könnte ich zur Übersicht löschen (überflüssige Arbeitblätter und die alten Makros).

In Originalcsv sind deine Rohdaten aus Tabelle2, aus denen
erstelle ich drei zweizeilige csv-Dateien mit dem Code von
„CSVErstellen“ im Ordner: c:\test\auswahl.

Aber, wie kommen die Daten im normalen Prozeß in „Originalcsv“ rein?
Oder brauche ich das dann gar nicht, weil das nur für Dich zu Testen war?

Im Blatt Ergebnis erscheinen dann die eingelesenen Daten aus
den drei csv-Dateien. In Spalte P sind wieder (Vor-) Nuller
vorhanden.

Wenn ich das neue Makro (ich habe es wieder in meinem CSV-Ordner suchen lassen) laufen lasse, liest er auch diese Daten ein (erstellt zwischen durch jede Menge Excel-Dateien) und gibt diese in „Ergebnis“ aus.
Die Feldbezeichnung ist in der 1. Zeile und darunter die Daten.
Aber nicht in einzelnen Spalten und es tritt immernoch der Kommafehler auf. Das hat sich also nicht verändert.
Oder mache ich etwas grundlegendes noch falsch?

Was noch fehlt ist Korrektur bestimmter Sonderzeichen, ü wird
noch als ü dargestellt usw.

Das ist kein Problem, das regel ich über den Import.

Nachfolgend die Codes fürs hiesige Archiv, hier die Datei:

http://npshare.de/files/da0708b8/kwCSV_zusamengefass…

Gruß
Reinhard

Hallo Dirk,

Es gibt jetzt zwei neue Blätter, Originalcsv und Ergebnis.

Ok, das kann ich nachvollziehen. Das heißt, den Rest könnte
ich zur Übersicht löschen (überflüssige Arbeitblätter und die
alten Makros).

du kannst alle Blätter bis auf Ergebnis löschen.
An Codes nur den Code von „CSVErstellen“ löschen.

In Originalcsv sind deine Rohdaten aus Tabelle2, aus denen
erstelle ich drei zweizeilige csv-Dateien mit dem Code von
„CSVErstellen“ im Ordner: c:\test\auswahl.

Aber, wie kommen die Daten im normalen Prozeß in „Originalcsv“
rein?
Oder brauche ich das dann gar nicht, weil das nur für Dich zu
Testen war?

Genau, ich brauch ja csv zum Testen, du hast die ja fertig. Mußt nur den Pfad zum Verzeichnis anpassen im Code.

Wenn ich das neue Makro (ich habe es wieder in meinem
CSV-Ordner suchen lassen) laufen lasse, liest er auch diese
Daten ein (erstellt zwischen durch jede Menge Excel-Dateien)
und gibt diese in „Ergebnis“ aus.

Ja, der neue Code ist ja im Wesentlichen der alte Code. Jede csv wird durch den Code geöffnet.
Aber auch durch den Code geschlossen.

Die Feldbezeichnung ist in der 1. Zeile und darunter die
Daten.

So soll es doch sein!?

Aber nicht in einzelnen Spalten und es tritt immernoch der
Kommafehler auf. Das hat sich also nicht verändert.
Oder mache ich etwas grundlegendes noch falsch?

Bei mir tritt das nicht auf, da ist alles pro Zeile in Spalten aufgeteilt. Keine Probleme mit irgendwelchen Kommas.

Oder mache ich etwas grundlegendes noch falsch?

Anscheinend. In der Mappe hast du doch alles um genau das nachzustellen was ich getan habe. Also lösche erstmal gar nix in der Mappe!
Erstelle falls nicht vorhanden ein Verzeichnis „c:\test“
Dann lasse das Makro „CSVErstellen“ laufen
Danach hast du in „c:\test\Auswahl“ drei csv-Dateien stehen.

Jetzt starte das Makro „CSVEinlesen“. Im Blatt „Ergebnis“ sollte es dann alles schön zeilenmäßig und Spaltenmäßig stehen.

hier die Datei:
http://npshare.de/files/da0708b8/kwCSV_zusamengefass…

Gruß
Reinhard

Hi,

habe ich schon gemacht. In dem Verzeichnis werden die 3 Test-Dateien erstellt und im Blatt „Ergebnis“ werden die dann gelistet, aber eben nicht hübsch in Spalten, wie bei Dir, sondern auch hier mit dem Kommafehler. Es tritt auch so der gleiche Effekt auf.

Ich verstehe es ja auch nicht, grrr.
Es kann doch dann nur noch an den Einstellung bei mir in Excel liegen, aber wo und was könnte es sein.
Mein Verdacht ist ja, dass er das Trennzeichen nicht akzeptiert und auf das Komma reagiert. Obwohl Excel beim direkten Aufruf einer CSV-Datei alles richtig macht und der Code das Semikolon zur Trennung doch vorgibt.
Nichtsdestotrotz, kann man in Excel hier eine Voreinstellung definieren?

Oder liegt es an den CSV-Dateieigenschaften? Bei mir werden die immer als „Microsoft Office Excel Comma Separated Value Files“ an gezeigt (Inkl. entsprechendem Logo von Excel).

Verzweifelte Grüße

Dirk

habe ich schon gemacht. In dem Verzeichnis werden die 3
Test-Dateien erstellt und im Blatt „Ergebnis“ werden die dann
gelistet, aber eben nicht hübsch in Spalten, wie bei Dir,
sondern auch hier mit dem Kommafehler. Es tritt auch so der
gleiche Effekt auf.

Hallo Dirk,

Sub CSVEinlesen2()
Dim fs As FileSearch, ZeiQ As Long, ZeiZ As Long, F As Integer, S
Dim wksQ As Worksheet, wksZ As Worksheet, FF As Long, Satz As String
Set wksZ = ThisWorkbook.Worksheets("Ergebnis") 'Anpassen
Set fs = Application.FileSearch
On Error GoTo hell
Application.ScreenUpdating = False
wksZ.UsedRange.ClearContents
With fs
 .LookIn = "c:\test\Auswahl" 'Anpassen
 .SearchSubFolders = False 'Anpassen
 .Filename = "\*.csv"
 If .Execute() \> 0 Then
 ZeiZ = 1
 For F = 1 To .FoundFiles.Count
 FF = FreeFile
 Open .FoundFiles(F) For Input As #FF
 Input #FF, Satz
 If F = 1 Then
 S = Split(Satz, ";")
 wksZ.Range(wksZ.Cells(1, 1), wksZ.Cells(1, UBound(S))) = S
 End If
 Input #FF, Satz
 S = Split(Satz, ";")
 ZeiZ = ZeiZ + 1
 wksZ.Range(wksZ.Cells(ZeiZ, 1), wksZ.Cells(ZeiZ, UBound(S))) = S
 Close #FF
 Next F
 Else
 MsgBox "There were no xls files found in c:\.....Anfragen\CSV."
 End If
 ThisWorkbook.Worksheets("Ergebnis").Columns(16).NumberFormat = "00000"
End With
hell:
If Err.Number 0 Then
 MsgBox ActiveWorkbook.Name & vbCr & Err.Number & vbCr & Err.Description
End If
Application.ScreenUpdating = True
End Sub

Gruß
Reinhard

Oh, das hat jetzt einen Fortschritt gebracht! Interessant…

Im Blatt Ergebnis habe ich jetzt die drei Datensätze in Spalten!
Nur leider (ich traue es mich fast gar nicht zu sagen) hat er nur die Datensätze ohne Komma perfekt übernommen.
Die Datenreihe mit Komma schneidet er ab dem Datensatz vor dem mit Komma ab (also ab dann leere Spalten).
Oder er hat die Spalten vorher schon „überschrieben“. Sowas in der Art teilt Excel nämlich mit, wenn ich vorher die „unsortierten“ per „Text in Spalten“ umwandeln wollte. Logo, denn da stand zwar das meiste in Spalte A, aber da waren teilweise ja auch schon die B bis xy (je nachdem wieviele Kommas auftauchen) gefüllt.
Könnte das sein?

Unter Wikipedia habe übrigens folgendes zum Thema CSV-Dateien gefunden (Das erklärt schonmal, warum Excel die einzelnen CSV-Dateien bei direktem Aufruf (Doppelklick) immer richtig öffnet.):

Die CSV Dateien werden nicht immer auf die gleiche Art und Weise von denselben Tabellenkalkulationsprogrammen interpretiert:

Microsoft Excel
Öffnen durch Importieren aus Textdatei
Spaltenbreite wird an den Inhalt angepasst
Trennzeichen kann im Importdialog gewählt werden
Öffnen durch Doppelklick
Alle Spalten haben die gleiche Breite
Trennzeichen ist stillschweigend Semikolon, wenn die CSV Datei nach ANSI-Norm gespeichert ist
Trennzeichen kann aber auch das Komma sein. Das hängt offenbar von der Programmversion ab.
Trennzeichen ist stillschweigend Tabulator, wenn die CSV Datei in Unicode-Format gespeichert ist

Mir stellt sich da die Frage, wie die CSV-Dateien per Makro aufgerufen werden (daran sieht man bestimmt, dass ich echt keine Ahnung von VB habe…)

Fällt Dir noch was dazu ein?

Und selbst wenn es funktioniert, ist der Code doch so immer noch nicht fertig, denn ich möchte ja nicht die 3 Datensätze aus dem Blatt „Originalcsv“ importieren, sondern die CSV-Dateien direkt.

Viele Grüße

Dirk

Hallo Dirk,

Im Blatt Ergebnis habe ich jetzt die drei Datensätze in
Spalten!
Nur leider (ich traue es mich fast gar nicht zu sagen) hat er
nur die Datensätze ohne Komma perfekt übernommen.

? ich hab nur drei csv-dateien also drei Datensätze ohne die Überschriftszeile.

Die Datenreihe mit Komma schneidet er ab dem Datensatz vor dem
mit Komma ab (also ab dann leere Spalten).

Dann lade mal so eine csv-datei hoch die da Kommas hat.

Oder er hat die Spalten vorher schon „überschrieben“.
Sowas in
der Art teilt Excel nämlich mit, wenn ich vorher die
„unsortierten“ per „Text in Spalten“ umwandeln wollte. Logo,
denn da stand zwar das meiste in Spalte A, aber da waren
teilweise ja auch schon die B bis xy (je nachdem wieviele
Kommas auftauchen) gefüllt.

Ich lese in der letzten Codeversion direkt in Vba aus der csv.
Deshalb spielt es keine Rolle was TextinSpalten macht oder Excel wenn es selbst eine csv öffnet.
Und im Code trenne ich die Eingelesenen datenzeilen beim Semikolon, das Komma spielt keinerlei Rolle.

Unter Wikipedia habe übrigens folgendes zum Thema CSV-Dateien
gefunden

vergiss das mit dem C omma S eparated V alues, übersetze dir csv mit C haracter S eparated V alues.

Und selbst wenn es funktioniert, ist der Code doch so immer
noch nicht fertig, denn ich möchte ja nicht die 3 Datensätze
aus dem Blatt „Originalcsv“ importieren, sondern die
CSV-Dateien direkt.

? Der Code interessiert sich nicht die Bohne für das Blatt „Originalcsv“. Er macht genau das was du forderst, er liest csv-Dateien aus einem Ordner ein in „Ergebnis“

Gruß
Reinhard

Hi,

Dann lade mal so eine csv-datei hoch die da Kommas hat.

Ist doch eine dabei: Die generierte Test1 bzw. im Blatt „originalcsv“ der Datensatz, der die „LEADID“ 5870431 hat enthält ein Komma.

vergiss das mit dem C omma S eparated V alues, übersetze dir csv
mit C haracter S eparated V alues.

Ja, ja :smile:

? Der Code interessiert sich nicht die Bohne für das Blatt
„Originalcsv“. Er macht genau das was du forderst, er liest
csv-Dateien aus einem Ordner ein in „Ergebnis“

Ok, das heißt aber doch, dass ich den Suchordner auf meinen Pfad ändern muss, oder.
Weil, dass hatte ich kurz ausprobiert und dann hatte ich in „Ergebnis“ alles in der 1. Zeile hintereinander. Und es kommt die Meldung

_______________
Microsoft Excel

unser_Dateiname.xls
62
Einlesen hinter Dateiende
______________

Deshalb war (und bin) ich diesbezüglich etwas irritiert.

Viele Grüße

Dirk

Gruß
Reinhard

Hallo Dirk,

Dann lade mal so eine csv-datei hoch die da Kommas hat.

Ist doch eine dabei: Die generierte Test1 bzw. im Blatt
„originalcsv“ der Datensatz, der die „LEADID“ 5870431 hat
enthält ein Komma.

Also der mittlere der drei Datensätze?
Der hat weder in Originalcsv noch in Tabelle2 ein Komma.

? Der Code interessiert sich nicht die Bohne für das Blatt
„Originalcsv“. Er macht genau das was du forderst, er liest
csv-Dateien aus einem Ordner ein in „Ergebnis“

Ok, das heißt aber doch, dass ich den Suchordner auf meinen
Pfad ändern muss, oder.

Logo. Oder deine Dateien in den Ordner stellen der im Code steht, was ist wohl leichter?

Weil, dass hatte ich kurz ausprobiert und dann hatte ich in
„Ergebnis“ alles in der 1. Zeile hintereinander.

Das steht aber nicht so im Code :smile:

Lade mal die Mappe doch wo das geschieht und 3 csv-Dateien mit Komma ohne Komma.

62
Einlesen hinter Dateiende

Der Code liest pro Datei zwei Datenzeilen, möglicherweise kommt der Fehler wenn du eine csv hast die keine zwei Datensätze hat

Tausche mal die unterste MSGBox-Zeile gegen
MsgBox .FoundFiles(F) & vbCr & Err.Number & vbCr & Err.Description

Gruß
Reinhard