Import aus TXT mit Leerzeilen
Ich möchte Namen, die in einer TXT-Datei stehen und mit TABs getrennt sind untereinander in eine Excel-File importieren.
Ansich keine schwierige Sache, schon tausendmal gemacht - jetzt sollen die Namen aber mit je 5 Leerzeilen importiert werden, d.h.
A1: Name1
A6: Name2
A11: Name3
usw.
Wie geht sowas?
Ansich keine schwierige Sache, schon tausendmal gemacht - jetzt sollen die Namen aber mit je 5 Leerzeilen importiert werden, d.h.
A1: Name1
A6: Name2
A11: Name3
usw.
Wie geht sowas?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 67195
Url: https://administrator.de/contentid/67195
Ausgedruckt am: 05.11.2024 um 19:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo Venjakob!
Mit dem folgenden Stückchen VBA-Code sollte sich Dein Vorhaben umsetzen lassen:
Einschränkungen:
Es wird angenommen, dass die in der Zeile "sTxtPath = ..." angegebene Datei existiert und ein für den Import brauchbares Format aufweist.
Es wird nicht überprüft, ob die maximale Zeilenanzahl des Blattes überschritten wird (da pro Datensatz 5 Zeilen "verbraucht" werden, dürfte die Textdatei nicht mehr als 13.107 Zeilen haben).
Funktionsweise:
Es wird eine neue Mappe erstellt, in deren erstes Tabellenblatt die Importdaten in den vorgegebenen 5er-Zeilenabständen (siehe Zeile "iOffset = 5")eingefügt werden. Dazu wird die Textdatei zeilenweise eingelesen, anhand des Trennzeichens "Tab" (siehe Zeile "sDelim = vbTab") auf Felder aufgeteilt und in die entsprechende Tabellenzeile übertragen.
Ein automatisches Speichern ließe sich bei Bedarf ergänzen ...
Grüße
bastla
P.S.: Da ich mir nicht sicher war, ob es 5 Leerzeilen oder ein Zeilenabstand von 5 sein sollte, habe ich mich an Deinem Beispiel orientiert - wenn wirklich nach jedem Datensatz 5 Leerzeilen gewünscht sein sollten, einfach "iOffset" auf 6 setzen ...
[Edit] Fehlerhafte Zeile ".Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine))) = aLine" durch Hinzufügen von " + 1" korrigiert. [/Edit]
Mit dem folgenden Stückchen VBA-Code sollte sich Dein Vorhaben umsetzen lassen:
Sub Import()
sTxtPath = "D:\ImportDatei.txt" 'Textdatei mit vollständigem Pfad
iRow = 1 'Startzeile
iOffset = 5 'Zeilenabstand
sDelim = vbTab 'Trennzeichen
Set fso = CreateObject("Scripting.FileSystemObject")
Set wbNew = Workbooks.Add
With wbNew.Worksheets(1)
Set oInFile = fso.OpenTextFile(sTxtPath, 1)
Do While Not oInFile.AtEndOfStream
aLine = Split(oInFile.ReadLine, sDelim)
.Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine) + 1)) = aLine
iRow = iRow + iOffset
Loop
.Activate
End With
End Sub
Es wird angenommen, dass die in der Zeile "sTxtPath = ..." angegebene Datei existiert und ein für den Import brauchbares Format aufweist.
Es wird nicht überprüft, ob die maximale Zeilenanzahl des Blattes überschritten wird (da pro Datensatz 5 Zeilen "verbraucht" werden, dürfte die Textdatei nicht mehr als 13.107 Zeilen haben).
Funktionsweise:
Es wird eine neue Mappe erstellt, in deren erstes Tabellenblatt die Importdaten in den vorgegebenen 5er-Zeilenabständen (siehe Zeile "iOffset = 5")eingefügt werden. Dazu wird die Textdatei zeilenweise eingelesen, anhand des Trennzeichens "Tab" (siehe Zeile "sDelim = vbTab") auf Felder aufgeteilt und in die entsprechende Tabellenzeile übertragen.
Ein automatisches Speichern ließe sich bei Bedarf ergänzen ...
Grüße
bastla
P.S.: Da ich mir nicht sicher war, ob es 5 Leerzeilen oder ein Zeilenabstand von 5 sein sollte, habe ich mich an Deinem Beispiel orientiert - wenn wirklich nach jedem Datensatz 5 Leerzeilen gewünscht sein sollten, einfach "iOffset" auf 6 setzen ...
[Edit] Fehlerhafte Zeile ".Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine))) = aLine" durch Hinzufügen von " + 1" korrigiert. [/Edit]
Hallo Venjakob!
Für den Moment einmal die Beschreibung der zweiten Variante:
Ausführen kannst Du das Script
abänderst.
Damit sollte der Import eigentlich schon möglich sein.
Grüße
bastla
1. Wo binde ich das Skript ein?
Je nachdem, wie häufig es benötigt wird, kannst Du es in der "Persönlichen Makroarbeitsmappe" (steht dann immer zur Verfügung) oder in einer beliebigen Exceldatei (die beim Import daher geöffnet sein muss) ablegen.Für den Moment einmal die Beschreibung der zweiten Variante:
- Erstelle eine neue Exceldatei.
- Wechsle über "Extras / Makro / Visual Basic-Editor" (oder der Tastenkombination Alt-F11) in den VBA-Editor.
- Wähle dort "Einfügen / Modul".
- Kopiere das Script in den Arbeitsbereich.
- Speichere zB unter dem Namen "Import-Makro.xls" (damit wird die gesamte - im Prinzip nur aus leeren Tabellen, aber eben auch dem Script, bestehende - Mappe gespeichert).
Ausführen kannst Du das Script
- entweder direkt aus dem VBA-Editor (den Cursor in einer beliebigen Zeile zwischen "Sub Import" und "End Sub" platzieren und den Menüpunkt "Ausführen / Sub/UserForm ausführen" oder F5 oder das grüne "Play"-Symbol aus der Symbolleiste zum Starten verwenden) oder
- aus der Arbeitsmappe so wie ein aufgezeichnetes Makro (also über "Extras / Makro / Makros... / "Import" markieren / Ausführen" oder
- indem Du eine beliebige AutoForm oder Grafik auf dem Tabellenblatt platzierst und diese über das Kontextmenü "Makro zuweisen..." mit "Import" verknüpfst und damit zur Schaltfläche machst.
2. Die Namen, stehen in der TXT-Datei natürlich untereinander, die Vornamen durch Semikolon getrennt
Das ist kein Beinbruch, das derzeit aufgrund Deines Eingangs-Postings vorgesehene Trennzeichen "Tab" lässt sich leicht durch ein Semikolon ersetzen, indem Du die entsprechende Scriptzeile aufsDelim = ";" 'Trennzeichen
Damit sollte der Import eigentlich schon möglich sein.
Grüße
bastla
Hallo Venjakob!
Erstellt habe ich das Script unter Excel 2003 (hätte ich bei der Beschreibung oben noch anmerken sollen) - dass es unter 2007 läuft, freut mich. (Die Beschränkung hinsichtlich der Zeilenanzahl dürfte dann eigentlich auch kein Problem darstellen. )
Grüße
bastla
Erstellt habe ich das Script unter Excel 2003 (hätte ich bei der Beschreibung oben noch anmerken sollen) - dass es unter 2007 läuft, freut mich. (Die Beschränkung hinsichtlich der Zeilenanzahl dürfte dann eigentlich auch kein Problem darstellen. )
Wie kannnoch mehr importiert werden?
Eigentlich nimmt das Script alles, was es kriegen kann - also wenn Du 8 Felder (sauber durch ";" getrennt) in der Textdatei hast, sollten eigentlich auch alle 8 importiert werden - sogar eine unterschiedliche Anzahl von Feldern sollte keine Probleme machen, da jede Zeile dynamisch zerlegt wird und die vorgefundene Anzahl von Feldern in die Tabelle geschrieben werden sollte.Grüße
bastla
Hallo Venjakob!
Hatte leider nur oberflächlich getestet - in der folgenden Zeile hat das "+ 1" gefehlt - bitte ergänzen oder ganze Zeile austauschen - sorry ...
Technische Erklärung für ev Interessierte:
Wenn in VBA ein Array aus einem Zellbereich ("Range") erstellt wird, erfolgt die Indizierung mit Basis 1 - beim Aufspalten oben mittels "Split()" erhält das erste Element den Index 0, sodass UBound(Array) - eigentlich wie in VB gewohnt - (Elementanzahl - 1) liefert. Da die Spaltennummerierung mit 1 beginnt, ist die letzte Spaltennummer entsprechend auf UBound(Array) + 1 zu setzen ...
Grüße
bastla
P.S.: Ich ergänze es oben im kompletten Script auch gleich ...
Hatte leider nur oberflächlich getestet - in der folgenden Zeile hat das "+ 1" gefehlt - bitte ergänzen oder ganze Zeile austauschen - sorry ...
.Range(.Cells(iRow, 1), .Cells(iRow, UBound(aLine) + 1)) = aLine
Technische Erklärung für ev Interessierte:
Wenn in VBA ein Array aus einem Zellbereich ("Range") erstellt wird, erfolgt die Indizierung mit Basis 1 - beim Aufspalten oben mittels "Split()" erhält das erste Element den Index 0, sodass UBound(Array) - eigentlich wie in VB gewohnt - (Elementanzahl - 1) liefert. Da die Spaltennummerierung mit 1 beginnt, ist die letzte Spaltennummer entsprechend auf UBound(Array) + 1 zu setzen ...
Grüße
bastla
P.S.: Ich ergänze es oben im kompletten Script auch gleich ...