PDA

Vollständige Version anzeigen : Mehrere CSV-Dateien öffnen und in einer Tabelle einfügen


sacredlife
15.10.2010, 09:03
Vorweg:
Ich habe dieselbe Frage vor ein paar Tagen auf www.office-loesungen.de gestellt und leider keine Antwort bekommen.
Link dazu: http://www.*************************417147_0_0_asc.php

Sollte dort eine hilfreiche Antwort auftauchen, werde ich das hier und dort kennzeichnen.
Ich bitte darum, diesen Crosspost nicht zu löschen - trotz identischen Inhalts.

EDIT:
Tut mir Leid, aber ich verstehe nicht, warum meine Links zensiert werden.
Ich poste nicht in böser Absicht, möglichst schnell eine Lösung zu erhalten... darum bitte ich um Verständnis. Meinen Crosspost findet man auf office-loesungen.de problemlos über den jetzigen Threadtitel.

danke!

***********************************************************

Hallo zusammen :)

Ich schreibe gerade an einem Plugin, welches CSV-Dateien im Stapel öffnen, und auf den Daten basierend Berechnungen anstellen soll.

Sehr geholfen hat mir dieser Thread:
http://www.*************************417147_0_0_asc.php

Beschreibung des Problems:
Ich möchte mehrere CSV-Dateien gleichen Aufbaus aus einem frischen Excel-Dokument heraus im Open-Dialog markieren und öffnen können.
Es wird in der VORHANDENEN Datei eine neue Tabelle erzeugt (oder die vorhandene Tabelle1 genutzt), in der alle Datenreihen untereinander Platz finden.

Momentan sieht das bei mir so aus:
Sub LargeFileImport()
'Sehr große Dateien importieren
Dim FileName
Dim FileNum As Integer
Dim n As Integer
Dim ResultStr As String

Dim wsSheet As Worksheet
Dim strValues(65536, 1) As String

Dim lngRow As Long
Dim intSheet As Integer
Dim intCounter As Integer

FileName = Application.GetOpenFilename("*.csv Datei (*.csv), *.csv", , "*.csv Datei öffnen", , False)

If FileName = "" Or FileName = "Falsch" Then Exit Sub
FileNum = FreeFile()

Open FileName For Input As #FileNum
Application.ScreenUpdating = False
Workbooks.Add template:=xlWorksheet

lngRow = 1
intSheet = 1

Application.StatusBar = "Blatt " & intSheet & " wird eingelesen"

Do While Seek(FileNum) <= LOF(FileNum)
Line Input #FileNum, ResultStr
If Left(ResultStr, 1) = "=" Then
strValues(lngRow, 1) = "'" & ResultStr
Else
strValues(lngRow, 1) = ResultStr
End If
If lngRow < 65536 Then
lngRow = lngRow + 1
Else
ActiveSheet.Range("A1:A65536") = strValues
ActiveWorkbook.Worksheets.Add after:=Worksheets(Worksheets.Count)
lngRow = 1
intSheet = intSheet + 1
Application.StatusBar = "Blatt " & intSheet & " wird eingelesen"
End If
Loop
Close
ActiveSheet.Range("A1:A65536") = strValues

intSheet = 0
For Each wsSheet In ActiveWorkbook.Worksheets
intSheet = intSheet + 1
Application.StatusBar = "Daten von Blatt " & intSheet _
& " werden bearbeitet"
With wsSheet
.Range("A:A").TextToColumns Destination:=.Range("A1"), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=True, _
Comma:=False, _
Space:=False, _
Other:=False
End With
Next wsSheet
Application.ScreenUpdating = True
Application.StatusBar = "Fertig"
End Sub


FileName = Application.GetOpenFilename("*.csv Datei (*.csv), *.csv", , "*.csv Datei öffnen", , True)

...funktioniert ansich, nur macht die Zeile darunter Probleme.
Fehlermeldung: Typen unverträglich (Fehler 13)

Ich habe euch mal eine Beispieldatei angehängt, die importiert werden sollte und bedanke mich schonmal im Voraus für eure Unterstützung und Tipps ;)
http://www.file-upload.net/download-2891390/testdateien.zip.html

Dieses Modul soll Teil eines schon existierenden Makros werden, das genau das tut was ich bisher wollte - nur eben bezogen auf eine Einzige Datei.
Gelingt es mir mit eurer Hilfe zumindest mehrere CSV-Dateien nebeneinander zu öffnen, bin ich sicher, dass ich mich selbst weiter durchhangeln kann.

IngGi
15.10.2010, 14:50
Hallo sacredlife,

der Fehler entsteht dadurch, dass die Variable FileName (übrigens kein guter Variablenname, da es sich um ein VBA-Schlüsselwort handelt) nicht nur einen Dateinamen, sondern durch das Multiselect ein Array mit mehreren Dateinamen enthält. Dementsprechend müssen die einzelnen Inhalte der Variablen (des Arrays) über einen Index abgefragt werden.

Ich habe dein Makro (im Großen und Ganzen) mal so beibehalten und rufe dieses Makro aus einem zweiten Makro heraus für jeden gewählten Dateinamen einmal auf:

<blockquote><div style='background-color: #F2F2FF; border: 1px solid #3300B2; padding: 0px 24px;'><pre style='font-size: 12px; padding: 0px 10px;'><span style="color: #0000FF">Sub</span> ChooseFiles<span style='color: #B200CC;'>(</span><span style='color: #B200CC;'>)</span><br><br><span style="color: #0000FF">Dim</span> intFiles <span style="color: #0000FF">As</span> <span style="color: #0000FF">Integer</span><br><br>vntFileName = Application.GetOpenFilename<span style='color: #B200CC;'>(</span><span style='color: #CC9900;'>"*.csv Datei (*.csv), *.csv"</span>, , <span style='color: #CC9900;'>"*.csv Datei öffnen"</span>, , <span style="color: #0000FF">True</span><span style='color: #B200CC;'>)</span><br><br><span style="color: #0000FF">On</span> <span style="color: #0000FF">Error</span> <span style="color: #0000FF">GoTo</span> Fehler<br>intFiles = <span style="color: #0000FF">UBound</span><span style='color: #B200CC;'>(</span>vntFileName<span style='color: #B200CC;'>)</span><br><span style="color: #0000FF">On</span> <span style="color: #0000FF">Error</span> <span style="color: #0000FF">GoTo</span><span style="color: #FF0000"> 0</span><br><br><span style="color: #0000FF">For</span> intFiles =<span style="color: #FF0000"> 1</span> <span style="color: #0000FF">To</span> <span style="color: #0000FF">UBound</span><span style='color: #B200CC;'>(</span>vntFileName<span style='color: #B200CC;'>)</span><br> LargeFileImport <span style='color: #B200CC;'>(</span>vntFileName<span style='color: #B200CC;'>(</span>intFiles<span style='color: #B200CC;'>)</span><span style='color: #B200CC;'>)</span><br><span style="color: #0000FF">Next</span> <span style='color: #008000;'>'intFiles<br></span><br><span style="color: #0000FF">Exit Sub</span><br>Fehler:<br><br><span style="color: #0000FF">End </span><span style="color: #0000FF">Sub</span><br><br><br><br><span style="color: #0000FF">Sub</span> LargeFileImport<span style='color: #B200CC;'>(</span>vntFileName <span style="color: #0000FF">As</span> <span style="color: #0000FF">Variant</span><span style='color: #B200CC;'>)</span><br><br><span style='color: #008000;'>'Sehr große Dateien importieren<br></span><span style="color: #0000FF">Dim</span> FileNum <span style="color: #0000FF">As</span> <span style="color: #0000FF">Integer</span><br><span style="color: #0000FF">Dim</span> n <span style="color: #0000FF">As</span> <span style="color: #0000FF">Integer</span><br><span style="color: #0000FF">Dim</span> ResultStr <span style="color: #0000FF">As</span> <span style="color: #0000FF">String</span><br><br><span style="color: #0000FF">Dim</span> wsSheet <span style="color: #0000FF">As</span> Worksheet<br><span style="color: #0000FF">Dim</span> strValues<span style='color: #B200CC;'>(</span><span style="color: #FF0000">65536</span>,<span style="color: #FF0000"> 1</span><span style='color: #B200CC;'>)</span> <span style="color: #0000FF">As</span> <span style="color: #0000FF">String</span><br><br><span style="color: #0000FF">Dim</span> lngRow <span style="color: #0000FF">As</span> <span style="color: #0000FF">Long</span><br><span style="color: #0000FF">Dim</span> intSheet <span style="color: #0000FF">As</span> <span style="color: #0000FF">Integer</span><br><span style="color: #0000FF">Dim</span> intCounter <span style="color: #0000FF">As</span> <span style="color: #0000FF">Integer</span><br><br>FileNum = FreeFile<span style='color: #B200CC;'>(</span><span style='color: #B200CC;'>)</span><br><br>Open vntFileName <span style="color: #0000FF">For</span> Input <span style="color: #0000FF">As</span> #FileNum<br>Application.ScreenUpdating = <span style="color: #0000FF">False</span><br>Workbooks.Add template:=xlWorksheet<br><br>lngRow =<span style="color: #FF0000"> 1</span><br>intSheet =<span style="color: #FF0000"> 1</span><br><br>Application.StatusBar = <span style='color: #CC9900;'>"Blatt "</span> & intSheet & <span style='color: #CC9900;'>" wird eingelesen"</span><br><br><span style="color: #0000FF">Do</span> <span style="color: #0000FF">While</span> Seek<span style='color: #B200CC;'>(</span>FileNum<span style='color: #B200CC;'>)</span> &lt;= LOF<span style='color: #B200CC;'>(</span>FileNum<span style='color: #B200CC;'>)</span><br> Line Input #FileNum, ResultStr<br> <span style="color: #0000FF">If</span> <span style="color: #0000FF">Left</span><span style='color: #B200CC;'>(</span>ResultStr,<span style="color: #FF0000"> 1</span><span style='color: #B200CC;'>)</span> = <span style='color: #CC9900;'>"="</span> <span style="color: #0000FF">Then</span><br> strValues<span style='color: #B200CC;'>(</span>lngRow,<span style="color: #FF0000"> 1</span><span style='color: #B200CC;'>)</span> = <span style='color: #CC9900;'>"'"</span> & ResultStr<br> <span style="color: #0000FF">Else</span><br> strValues<span style='color: #B200CC;'>(</span>lngRow,<span style="color: #FF0000"> 1</span><span style='color: #B200CC;'>)</span> = ResultStr<br> <span style="color: #0000FF">End </span><span style="color: #0000FF">If</span><br> <span style="color: #0000FF">If</span> lngRow &lt;<span style="color: #FF0000"> 65536</span> <span style="color: #0000FF">Then</span><br> lngRow = lngRow +<span style="color: #FF0000"> 1</span><br> <span style="color: #0000FF">Else</span><br> ActiveSheet.Range<span style='color: #B200CC;'>(</span><span style='color: #CC9900;'>"A1:A65536"</span><span style='color: #B200CC;'>)</span> = strValues<br> ActiveWorkbook.Worksheets.Add after:=Worksheets<span style='color: #B200CC;'>(</span>Worksheets.Count<span style='color: #B200CC;'>)</span><br> lngRow =<span style="color: #FF0000"> 1</span><br> intSheet = intSheet +<span style="color: #FF0000"> 1</span><br> Application.StatusBar = <span style='color: #CC9900;'>"Blatt "</span> & intSheet & <span style='color: #CC9900;'>" wird eingelesen"</span><br> <span style="color: #0000FF">End </span><span style="color: #0000FF">If</span><br><span style="color: #0000FF">Loop</span><br>Close<br>ActiveSheet.Range<span style='color: #B200CC;'>(</span><span style='color: #CC9900;'>"A1:A65536"</span><span style='color: #B200CC;'>)</span> = strValues<br><br>intSheet =<span style="color: #FF0000"> 0</span><br><span style="color: #0000FF">For</span> <span style="color: #0000FF">Each</span> wsSheet <span style="color: #0000FF">In</span> ActiveWorkbook.Worksheets<br> intSheet = intSheet +<span style="color: #FF0000"> 1</span><br> Application.StatusBar = <span style='color: #CC9900;'>"Daten von Blatt "</span> & intSheet _<br> & <span style='color: #CC9900;'>" werden bearbeitet"</span><br> <span style="color: #0000FF">With</span> wsSheet<br> .Range<span style='color: #B200CC;'>(</span><span style='color: #CC9900;'>"A:A"</span><span style='color: #B200CC;'>)</span>.TextToColumns Destination:=.Range<span style='color: #B200CC;'>(</span><span style='color: #CC9900;'>"A1"</span><span style='color: #B200CC;'>)</span>, _<br> DataType:=xlDelimited, _<br> TextQualifier:=xlDoubleQuote, _<br> ConsecutiveDelimiter:=<span style="color: #0000FF">False</span>, _<br> Tab:=<span style="color: #0000FF">False</span>, _<br> Semicolon:=<span style="color: #0000FF">True</span>, _<br> Comma:=<span style="color: #0000FF">False</span>, _<br> Space:=<span style="color: #0000FF">False</span>, _<br> Other:=<span style="color: #0000FF">False</span><br> <span style="color: #0000FF">End </span><span style="color: #0000FF">With</span><br><span style="color: #0000FF">Next</span> wsSheet<br>Application.ScreenUpdating = <span style="color: #0000FF">True</span><br>Application.StatusBar = <span style='color: #CC9900;'>"Fertig"</span><br><br><span style="color: #0000FF">End </span><span style="color: #0000FF">Sub</span><br></pre><hr style='color: #3300B2; background: #3300B2; height: 1px;'><p style='font-size: 8px; font-family: Verdana; text-align: right;'>VBA/HTML - CodeConverter für Excelforen<br>AddIn für Excel XP+2003 - komplett in VBA geschrieben von IngGi<br>Anbindung an VBE-Kontextmenü geklaut ;-) bei: <a href='http://www.cpearson.com/excel/VbeMenus.aspx'>http://www.cpearson.com/excel/VbeMenus.aspx</a></p></div></blockquote>

Gruß Ingolf

sacredlife
18.10.2010, 09:20
Leider komme ich erst jetzt zu einer Antwort.
Ich danke dir für deine Mühe! Dieser Ansatz hatte sich mir nicht erschlossen... mir fehlt eben noch viel Übung.

Nach kleineren Modifikationen funktioniert dein Code im Gesamtmakro absolut perfekt.
Danke dass der Thread trotz der Tatsache, dass er ein Crossposting ist, stehengelassen wurde.