Wow,
und ich schreibe noch "jedes Datenfeld bekommt einen Index", nur um dan zu denken, ich hätte "For Each" angewendet. Hier das korrigierte Makro auf Basis von Ubound:
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) = splitLineOfTextFile(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
|