PDA

Vollständige Version anzeigen : Viele CSV-Dateien in eine Exceldatei einlesen


Johannes2012
18.07.2012, 17:51
Hallo,

zu meinem Thema gibt es zwar schon Forumsbeiträge, allerdings bin ich so ein Laie, dass ich noch nicht einmal eine einzige Zeile in einem Skript ändern kann. Deshalb ganz konkret mein Anliegen:

Ich habe monatlich mehrere Hundert csv-Dateien mit unterschiedlichem Dateinamen in einem Verzeichnis. Alle Dateien sind gleich aufgebaut, haben aber eine unterschiedliche Anzahl von Datensätzen. Diese möchte ich gerne in Excel einlesen und zwar so, dass die Inhalte untereinander stehen:

Datei 1.csv:
Zeile 1: d;4;3;...
Zeile 2: G;2;1;...
Zeile 3: f;665;1;...

Datei 2.csv:
Zeile 1: r;7;5;...
Zeile 2: z;32;6;...

Datei n.csv:
Zeile 1: x;6;3;...
Zeile 2: h;32;55;...
Zeile 3: k;64;79;...

Daraus soll werden:

Datei Auswertung.xlsx (in einem anderen Verzeichnis, Datei gibt es) in Tabelle Zusammenfassung
Zeile 1 soll leer sein für Spaltenüberschriften (wird manuell vorher gefüllt)
Zeile 2 soll aus Datei 1.csv Erster Datensatz generiert werden
Zeile 3 soll aus Datei 1.csv Zweiter Datensatz generiert werden
Zeile 4 soll aus Datei 1.csv Dritter Datensatz generiert werden
Zeile 5 soll aus Datei 2.csv Erster Datensatz generiert werden
Zeile 6 soll aus Datei 2.csv Zweiter Datensatz generiert werden
Zeile 7 soll aus Datei 3.csv Erster Datensatz generiert werden
Zeile 8 soll aus Datei 3.csv Zweiter Datensatz generiert werden
...

Die Originaldateien sollen erhalten bleiben.

Noch eine Herausforderung:
Wenn ich eine CSV im Excel öffne, dann habe ich in Zeile 1 eine Überschriftszeile und Zeile 2 ist leer. Ab Zeile 3 gehen die Datensätze los. Die ersten beiden Zeile pro csv-Datei müssten also nicht ins Excel übertragen werden. Keine Ahnung, wie hier der Zeilenumbruch in der csv erfolgt.

Bin gespannt und hoffe auf HIlfe. Vielen Dank

Johannes

ebs17
18.07.2012, 18:37
//OT:
allerdings bin ich so ein Laie, dass ich noch nicht einmal eine einzige Zeile in einem Skript ändern kann
Weshalb hält man Dich geeignet dafür, die genannte Aufgabe zu lösen?

Ein Forum will Hilfe zur Selbsthilfe bieten. Letztere ist aber bisher nicht erkennbar. Du bist sicher, dass Du nicht die Jobbörse (http://www.ms-office-forum.net/forum/forumdisplay.php?f=48) bemühen willst?

josef e
18.07.2012, 19:33
<div style="width:98%; margin-left:5px; margin-right:15px; text-align:justify;">
Hallo Johannes,

ungetestet!

<div style="background-color:#F5F5F5; border-width:2px; border-style: groove; border-color:#ff9966; padding:4px;"><nobr><span style="font-family:Courier New,Arial; font-size:8pt ;" ><span style="color:#008000"; >' **********************************************************************</span><br /><span style="color:#008000"; >' Modul: Modul2 Typ: Allgemeines Modul</span><br /><span style="color:#008000"; >' **********************************************************************</span><br /><br /><span style="color:#0000FF"; >Option</span> <span style="color:#0000FF"; >Explicit</span><br /><br /><b><span style="color:#0000FF"; >Sub</span> colectCSV()</b><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> strPath <span style="color:#0000FF"; >As</span> String, strFile <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >String</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> vntTmp <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >Variant</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> lngIndex <span style="color:#0000FF"; >As</span> Long, lngRow <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >Long</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> strTmp <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >String</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> ff <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >Integer</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >Dim</span> lngCalc <span style="color:#0000FF"; >As</span> <span style="color:#0000FF"; >Long</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >On</span> <span style="color:#0000FF"; >Error</span> <span style="color:#0000FF"; >GoTo</span> ErrExit<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >With</span> Application<br />&nbsp;&nbsp;&nbsp;&nbsp;.ScreenUpdating = <span style="color:#0000FF"; >False</span><br />&nbsp;&nbsp;&nbsp;&nbsp;.EnableEvents = <span style="color:#0000FF"; >False</span><br />&nbsp;&nbsp;&nbsp;&nbsp;lngCalc = .Calculation<br />&nbsp;&nbsp;&nbsp;&nbsp;.Calculation = xlCalculationManual<br />&nbsp;&nbsp;&nbsp;&nbsp;.DisplayAlerts = <span style="color:#0000FF"; >False</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >With</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;lngRow = 2<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;strPath = <span style="color:#808080"; >"E:\Forum\Test"</span> <span style="color:#008000"; >'Verzeichnis - Anpassen!</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;strPath = IIf(Right(strPath, 1) = <span style="color:#808080"; >"\"</span>, strPath, strPath & <span style="color:#808080"; >"\"</span>)<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >With</span> Sheets(<span style="color:#808080"; >"Zusammenfassung"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;.Range(<span style="color:#808080"; >"A2"</span>).Resize(.Rows.Count - 2, .Columns.Count - 1) = ""<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;strFile = Dir(strPath & <span style="color:#808080"; >"*.csv"</span>, vbNormal)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Do</span> <span style="color:#0000FF"; >While</span> strFile &lt;&gt; ""<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ff = FreeFile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngIndex = 0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Open</span> strPath & strFile <span style="color:#0000FF"; >For</span> <span style="color:#0000FF"; >Input</span> <span style="color:#0000FF"; >As</span> #ff<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Do</span> <span style="color:#0000FF"; >While</span> <span style="color:#0000FF"; >Not</span> EOF(ff)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Line <span style="color:#0000FF"; >Input</span> #ff, strTmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngIndex = lngIndex + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >If</span> lngIndex &gt; 2 <span style="color:#0000FF"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >If</span> Len(Trim$(strTmp)) <span style="color:#0000FF"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntTmp = Split(strTmp, <span style="color:#808080"; >";"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(lngRow, 1).Resize(1, <span style="color:#0000FF"; >UBound</span>(vntTmp) + 1) = vntTmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngRow = lngRow + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >If</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Loop</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Close</span> #ff<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFile = Dir<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >Loop</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >With</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;ErrExit:<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >With</span> Err<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >If</span> .Number &lt;&gt; 0 <span style="color:#0000FF"; >Then</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox <span style="color:#808080"; >"Fehler in Prozedur:"</span> & vbTab & <span style="color:#808080"; >"'colectCSV'"</span> & vbLf & <span style="color:#0000FF"; >String</span>(60, <span style="color:#808080"; >"_"</span>) & _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vbLf & vbLf & IIf(Erl, <span style="color:#808080"; >"Fehler in Zeile:"</span> & vbTab & Erl & vbLf & vbLf, "") & _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#808080"; >"Fehlernummer:"</span> & vbTab & .Number & vbLf & vbLf & <span style="color:#808080"; >"Beschreibung:"</span> & vbTab & _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#808080"; >"VBA - Fehler in Modul - Modul2"</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Clear<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >If</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >With</span><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >On</span> <span style="color:#0000FF"; >Error</span> <span style="color:#0000FF"; >GoTo</span> 0<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<span style="color:#0000FF"; >With</span> Application<br />&nbsp;&nbsp;&nbsp;&nbsp;.ScreenUpdating = <span style="color:#0000FF"; >True</span><br />&nbsp;&nbsp;&nbsp;&nbsp;.EnableEvents = <span style="color:#0000FF"; >True</span><br />&nbsp;&nbsp;&nbsp;&nbsp;.Calculation = lngCalc<br />&nbsp;&nbsp;&nbsp;&nbsp;.DisplayAlerts = <span style="color:#0000FF"; >True</span><br />&nbsp;&nbsp;<span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >With</span><br />&nbsp;&nbsp;<br /><b><span style="color:#0000FF"; >End</span> <span style="color:#0000FF"; >Sub</span></b><br /><br /></span></nobr></div>


</div>

<div style="width:100px; text-align:center; color:white; font-style:italic; font-size:0.8em; font-family:Tahoma; background-color:royalblue;margin-left:5px; margin-top:15px; padding:4px; border:3px double darkblue;">&laquo; Gru&szlig; Sepp &raquo;</div>

Johannes2012
19.07.2012, 09:00
Hallo Eberhard,

ich bin lernwillig, jedoch wollte ich damit meinen Kenntnisstand zum Ausdruck bringen. Und da mein Umfeld die Tabellen monatlich manuell zusammenführen wollte, hab ich an Eure Hilfe gedacht...

Ich weiß, dass sind nicht die besten Ausgangsvoraussetzungen :rolleyes:

Danke für den Tipp mit der Jobbörse. Hab noch weitere (und größere Themen).

Gruß

Johannes

Johannes2012
19.07.2012, 09:01
Hallo Sepp,

danke für die Zeilen. Ich werde mich gleich an die Arbeit machen und testen.

Grüße

Johannes

Johannes2012
19.07.2012, 11:26
Hallo Sepp,

das Skript lief nicht durch. Ich hab dann den Teil "With... bis End With" rausgenommen, damit ich die Fehler sehe und es kommt:


Fehlernummer 9
index außerhalb des gültigen bereichs

Hast Du mir einen Tipp?

Danke und Grüße

Johannes

ebs17
19.07.2012, 11:34
Zur Fehlersuche deaktivierst Du besser die Fehlerbehandlung (Auskommentieren):
' On Error GoTo ErrExit
Dann wird der Debugger bei Fehler die betreffende Zeile markieren, wo der Fehler auftritt.

Johannes2012
19.07.2012, 11:49
Hmm, jetzt läuft es zwar durch aber es passiert im Excelfile nichts. Kann es daran liegen, dass die Spalte A in jeder csv-Datei leer ist. Die Daten befinden sich in den Spalten B-U, wobei auch dazwischen Spalten leer sind.

Grüße

Johannes

Johannes2012
19.07.2012, 12:07
Jetzt wirds kurios:

Wenn ich die CSV-Datei aufmache, eine Spalte lösche, dann versuche zu speichern, möchte Excel ein anderes Format. Das verneine ich und schließe die DAtei ohne speichern. Wenn ich dann das Skritp laufen lasse, funktioniert es für alle Dateien, für die ich diesen Vorgang gemacht habe (obwohl nix geändert wurde (das sind immer noch csv-Dateien).

Alle anderen csv-Dateien bleiben außen vor.

????

Johannes2012
19.07.2012, 13:54
Komme der Sache näher:

Obwohl ich bei der vorher beschriebenen Vorgehensweise eigentlich nicht speichere macht das Excel trotzdem. Und dann sehen die Dateien etwas anders aus:

Original csv beginnt beim Anschauen im Texteditor mit

;a-ersterdatensatz;44;fewifjefienfeife;8237262723782;"dann kommt so ein viereckiges Kästchen. Ich nehme an es ist der zeilenumbruch. Nach dem Kästchen kommt sofort ein Semikolon";b_zweiterdatensatz;55;weofe;22;"dann kommt so ein viereckiges Kästchen. Ich nehme an es ist der zeilenumbruch. Nach dem Kästchen kommt sofort ein Semikolon";c_dritterdatensatz;55;weofe;22;"....

Damit funktioniert das Skript oben nicht. D.h. es läuft, aber es kommt nichts raus. Es funktioniert aber, nachdem ich die (wie oben beschrieben) die erste leere Spalte rauslösche und dann wieder als csv speicher dann sieht die csv so aus:

a-ersterdatensatz;44;fewifjefienfeife;8237262723782;
b_zweiterdatensatz;55;weofe;22
c_dritterdatensatz;55;weofe;22;

-> Man sieht im Texteditor dann die Zeilenumbrüche
-> am Ende der Zeilen ist manchmal ein Semikolon, manchmal mehrere, manchmal keine
-> UND das Skript tut

Jetzt ist guter Rat teuer :upps:

ebs17
19.07.2012, 14:29
Eine Lösung würde man nicht auf "Ich nehme an ..." aufbauen wollen, sondern auf Kenntnis der konkreten Umstände.

Daher solltest Du die wirkliche Bedeutung des "Kästchens" ergründen, bspw. mit Asc() den ASCII-Code des Zeichens ermitteln oder Dir mit einem ordentlichen Editor wie z.B. Notepad++ den wirklichen Inhalt ansehen.
Ersatzweise stellst Du eine reale Datei hier als Download zur Verfügung.

Johannes2012
19.07.2012, 17:15
Hallo Eberhard,

die Ermittlung des Asci-Codes gelingt mir nicht, da Excel das Zeichen als Zeilenumbruch erkennt. Jetzt wollte ich die Datei hochladen, aber csv geht nicht. Da bräuchte ich noch einen Tipp. Danke.

ebs17
19.07.2012, 18:09
Umbenennen der Datei als TXT sollte funktionieren.

Was Excel mit dem Zeichen macht, ist doch unerheblich. Der Code von josef liest Textzeilen aus der Textdatei aus und verarbeitet diese. Also ist die Bedeutung in der Textdatei relevant.

Johannes2012
19.07.2012, 19:52
Hier hab ich die csv-Datei im Dateinamen auf txt geändert. Ich bekomme es noch nicht hin. Erst durch das Löschen der ersten leeren Spalte und zurückspeichern als csv führt dazu, dass das Skript ein Ergebnis liefert. Kann es sein, dass EOF aufgrund der leeren ersten Zelle da ein falsches Ergebnis liefert.