Hallo zusammen
@Ulrich
Ich möchte Dir nicht in die Parade fahren, aber dann doch noch den ADO-Stream als Lösungsmöglichkeit anbieten.
@Basti
Um es ganz unverblümt zu sagen ... Dein Ausgangsmakro ist ... Grütze. Allein das Zählen der Zeilen der CSV Datei ist überflüssig, weil es gar nicht genutzt wird. CSV-Dateien würde ich zur Zeit immer mit einem ADO-Stream einlesen. Das klingt total kompliziert, weil keine Sau weiß, was ein Stream bei einer Textdatei sein soll, ist aber unterm Strich sehr strukturiert und klar. Das folgende Makro enthält mehr Kommentare als Quelltext glaube ich. Aber die dienen dem Verständnis und wollen unbedingt gelesen werden ;-)
Wenn Deine Datei damit nicht eingelesen werden kann, dann weiß ich auch nicht. Den ADO-Stream habe ich bis runter zu Excel 2010 getestet und weiß deshalb, dass er mindestens bis zu der Version runter so funktioniert, wie im folgenden implementiert:
Sub ImportWithAdoStream()
Dim delimiter As String 'Das Trennzeichen der einzulesenden CSV Datei
Dim importPath As String 'Der Pfad, in dem die Datei zum Importieren liegt
Dim importFileName As String 'Der Datzeiname inklusive Punkt und Dateiendung
Dim objStream As Object 'Der Kern dieses Makros: Late Binding Object Variable für den ADO-Stream
Dim lineOfTextFile As String 'Nimmt jede Zeile der Textdatei aus importPath und importFileName für die sofortige Verarbeitung auf
Dim splitlineOfTextFile() As String 'Array zur Aufnahem der Datenfelder einer eingelesenen Zeile aus der angegebenen Textdatei
Dim currRow As Long 'Aktuelle Zeile in der zu beschrreibenden Excel-Tabelle
Dim currCol As Long 'Aktuelle Spalte in der zu beschrreibenden Excel-Tabelle
Dim textItem As Long 'Jedes Datenfeld aus jeder gesplitteten Zeile erhält in einer Schleife hiermit einen Index zur weiteren Verarbeitung
delimiter = Chr(9) 'Das Trennzeichen der CSV Datei. 9 ist der Code für Tabstop
currRow = 1 'Die eingelesenen Daten werden ab Zeile 1 in die Excel-Tabelle eingetragen
currCol = 1 'Die eingelesenen Daten werden ab Spalte 1 in die Excel-Tabelle eingetragen
importPath = "Laufwerksbuchstabe:\Pfad zur Datei\" 'Der Pfad muss mit einem Backslash abgeschlossen sein (\)
importFileName = "Dateiname.xxx" 'Dateiname mit Punkt und Erweiterung
'ADO Stream initialisieren
Set objStream = CreateObject("ADODB.Stream") 'Objekt via late binding erzeugen (kein Einbinden einer Bibliothek über einen Verweis notwendig aber kein IntelliSense)
objStream.Charset = "utf-8" 'Voreingestellter Zeichensatz = Unicode (bei weglassen dieser Zeile) UTF-8 ist mit den ersten 127 ASCII Zeichen identisch, die ersten 256 mit ISO 8859-1 (Latin 1)
objStream.Type = 2 'Art der einzulesenden Datei: 2 = Text, 1 = Binär
objStream.LineSeparator = -1 'Zeilenendezeichen: -1 = adCrLf (voreingestellt), 13 = adCr (nur carriage return), 10 = adLf (nur line feed), Letzte 2 Nummern sind die Kodierungen im Zeichensatz
objStream.Open 'Öffnet den Stream (quasi die Datei)
objStream.LoadFromFile importPath & importFileName 'Datei wird geladen von oben festgelegtem Pfad mit Backslash am Ende (\) und dem oben angegebenen Dateinamen inklusive Punkt und Dateiendung
Do Until objStream.EOS 'Bis zum Ende des Streams
lineOfTextFile = objStream.ReadText(-2) 'Zeilenweises Einlesen der Datei in der Schleife (-2 = zeilenweise, -1 = ganze Datei auf einmal, dann braucht man keine Schleife)
'*********************************************************************************************************************************************************************************************
'Innerhalb der Sternchen folgt Dein individueller Wunsch der Verarbeitung aller Zeilen (Deinem Makro entnommen)
'Der ganze Rest funktioniert für jede zeilenweise zu verabeitende Textdatei gleich
'Natürlich müssen die Werte der Variablen angepasst werden. z.B. der Zeichensatz (hier UTF-8, aber für vieles heutzutage wahrscheinlich passend)
'
'Aktuell eingelesene Zeile am oben angegebenen Delimiter splitten
splitlineOfTextFile = Split(lineOfTextFile, delimiter)
'
'Gesplittete Datenfelder aus aktuell eingelesener Zeile in die Excel Tabelle schreiben
For textItem = 0 To UBound(splitlineOfTextFile)
'Die Daten werden in die Excel-Tabelle eingetragen, aus der das Makro aufgerufen wurde
Cells(currRow, currCol) = textItem
currCol = currCol + 1
Next textItem
currCol = 1 'Spalte für nächste Zeile auf 1 zurücksetzen
currRow = currRow + 1 'Zeilennummer für die nächste eingelesene Textzeile festlegen
'*********************************************************************************************************************************************************************************************
Loop 'Nächste Zeile bis EOS erreicht wurde
objStream.Close 'Schließen des Streams (qusi das Schließen der Datei)
End Sub
Viele Grüße,
Zwenn
|