Txt Dateien in Excel importieren
Hallo Kollegen,
Ich möchte gerne mittels Excel eine Txt einlesen und die Infos in Spalten aufteilen.
Die Spaltenheader sind in der Txt mittels "[ ]" angegeben.
Alle darauf folgenden Zeilen sollen bis zum nächsten Spaltenheader in eine Zelle in der Spalte geschrieben werden.
Wenn der Spaltenheader schon existiert dann werden die darauffolgenden Zeilen bis zum nächsten Spalterheader in den entsprechenden schon vorhandenen Header geschrieben.
z.B:
wird zu:
das ganze soll bis EoF oder bis "***" erkannt wird laufen.
Es handelt sich bei allen Daten um Text.
Kann mir bitte jemand von euch dabei helfen? Vielen Dank im Voraus!!
lg
Ich möchte gerne mittels Excel eine Txt einlesen und die Infos in Spalten aufteilen.
Die Spaltenheader sind in der Txt mittels "[ ]" angegeben.
Alle darauf folgenden Zeilen sollen bis zum nächsten Spaltenheader in eine Zelle in der Spalte geschrieben werden.
Wenn der Spaltenheader schon existiert dann werden die darauffolgenden Zeilen bis zum nächsten Spalterheader in den entsprechenden schon vorhandenen Header geschrieben.
z.B:
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
[Name]
test1
[Beschreibung]
bla1
....
[Name]
test2
[Beschreibung]
bla2
wird zu:
1
2
3
4
5
6
2
3
4
5
6
[Name]
test1
test2
[Beschreibung]
bla1
bla2
das ganze soll bis EoF oder bis "***" erkannt wird laufen.
Es handelt sich bei allen Daten um Text.
Kann mir bitte jemand von euch dabei helfen? Vielen Dank im Voraus!!
lg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 303635
Url: https://administrator.de/forum/txt-dateien-in-excel-importieren-303635.html
Ausgedruckt am: 13.04.2025 um 11:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo Serbitar, Willkommen auf Administrator.de!
Habe dir hier ein Beispiel dafür hochgeladen: excel_parse_txt_to_columns_303635.zip
Entpacke beide Dateien in ein Verzeichnis und führe das Makro mit dem Button auf dem Sheet aus dann werden die Daten aus der demo.txt in das Sheet importiert.
Hier noch der kommentierte Code daraus
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
[OT]
@127944
[/OT]
Habe dir hier ein Beispiel dafür hochgeladen: excel_parse_txt_to_columns_303635.zip
Entpacke beide Dateien in ein Verzeichnis und führe das Makro mit dem Button auf dem Sheet aus dann werden die Daten aus der demo.txt in das Sheet importiert.
Hier noch der kommentierte Code daraus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub ImportTextData()
'Variablen
Dim fso As Object, dic As Object, regex As Object, matches As Object, match As Object, intCol As Long, strFile As String
' Pfad der Datei
strFile = ThisWorkbook.Path & "\demo.txt"
' Objekte erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
Set dic = CreateObject("Scripting.Dictionary")
Set regex = CreateObject("vbscript.regexp")
' Regex Optionen setzen
regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
' Regex Pattern zur extrahierung der Sections mit deren Daten
regex.Pattern = "^\[([^\[]+)\]\s*([^\[]*)"
' Regex ausführen
Set matches = regex.Execute(fso.OpenTextFile(strFile, 1, False, -2).ReadAll())
intCol = 1
With ActiveSheet
' Erste Zeile Überschriften fett machen
Range("1:1").Font.Bold = True
' Für jede Section
For Each match In matches
'Name der Section holen
strSection = match.submatches(0)
'Items der Section holen
arrData = WorksheetFunction.Transpose(Split(match.submatches(1), vbNewLine))
' Existiert die Section schon ?
If Not dic.Exists(strSection) Then
' es ist eine neue Section, füge sie dem Dictionary hinzu
dic.Add strSection, intCol
' Schreibe die Sectionüberschrift in Zeile 1 der neuen Spalte
.Cells(1, intCol).Value = strSection
' Schreibe die Items unter die Überschrift
.Cells(2, intCol).Resize(UBound(arrData), 1).Value = arrData
' Index der nächsten Spalte setzen
intCol = intCol + 1
Else
' Section existiert schon, füge die Items in der jeweiligen Spalte unten an
.Cells(Rows.Count, dic.Item(strSection)).End(xlUp).Offset(1, 0).Resize(UBound(arrData), 1).Value = arrData
End If
Next
'Spaltenbreiten an Inhalt anpassen
.UsedRange.EntireColumn.AutoFit
End With
End Sub
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
[OT]
@127944
Zitat von @127944:
wenn du das möchtest, dann darfst du das von mir aus auch gerne machen.
Nicht dein Ernst ? *Kopfschüttel*. Wenn du in einem Beitrag nichts konstruktives beitragen kannst solltest du in Zukunft solche Kommentare unterdrücken, die sind in einem Administrator-Forum wirklich überflüssig, bringen keinem etwas und senken das Niveau, kein Wunder das hier dann in letzter Zeit so viele kompetente User die Segel streichen wenn ich so was lese, sorry.wenn du das möchtest, dann darfst du das von mir aus auch gerne machen.
[/OT]

[OT]
Hallo Uwe,
bei allem gebührenden Respekt - aber deine Schlussfolgerung ist meiner bescheidenden Meinung nach schlicht falsch.
Es ist dein gutes Recht, dich von Usern, die null Eigeninitiative zeigen, vor den Karren spannen zu lassen. Mir ist es auch egal, das du in einem Forum um Spenden ...
Dein Ding - nicht meines.
[/OT]
Hallo Uwe,
bei allem gebührenden Respekt - aber deine Schlussfolgerung ist meiner bescheidenden Meinung nach schlicht falsch.
Nicht dein Ernst ? *Kopfschüttel*.
Doch mein voller Ernst. Nur ein netter Hinweis durch die Blume, das der TO schlicht vergessen hat, eine Frage zu stellen. Selbst der TO scheint die Ironie verstanden zu haben.Wenn du in einem Beitrag nichts konstruktives beitragen kannst
Ich bin durchaus in der Lage die Frage des TO zu beantworten. Dazu musste er diese aber erst einmal stellen. Hätte ja sein können, das er nur ein triviales Problem hat.solltest du in Zukunft solche Kommentare unterdrücken, die sind in einem Administrator-Forum wirklich überflüssig,
Ansichtssachebringen keinem etwas und senken das Niveau,
Das stimmt, wie man sieht, nicht. Der TO hat seine Frage gestellt und hat damit die Basis für eine Hilfestellung geliefert.kein Wunder das hier dann in letzter Zeit so viele kompetente User die Segel streichen
Das hat eher mit lernresistenten und faulen Fragestellern zu tunwenn ich so was lese, sorry.
Das habe ich auch gedacht, wie ich deinen Absatz gelesen habe.Es ist dein gutes Recht, dich von Usern, die null Eigeninitiative zeigen, vor den Karren spannen zu lassen. Mir ist es auch egal, das du in einem Forum um Spenden ...
Dein Ding - nicht meines.
[/OT]
Zitat von @127944:
Aus dem Thread geht eindeutig hervor was er machen möchte, sonst hätte ich wohl diesen Code nicht zusammenschreiben können.//Nicht dein Ernst ? *Kopfschüttel*.
Doch mein voller Ernst. Nur ein netter Hinweis durch die Blume, das der TO schlicht vergessen hat, eine Frage zu stellen. Selbst der TO scheint die Ironie verstanden zu haben.Wenn du in einem Beitrag nichts konstruktives beitragen kannst
Ich bin durchaus in der Lage die Frage des TO zu beantworten. Dazu musste er diese aber erst einmal stellen. Hätte ja sein können, das er nur ein triviales Problem hat.bringen keinem etwas und senken das Niveau,
Das stimmt, wie man sieht, nicht. Der TO hat seine Frage gestellt und hat damit die Basis für eine Hilfestellung geliefert.,kann mir vielleicht jemand dabei helfen?
hast du nun verstanden worum es beim Thema geht, nur wegen dem fehlenden Fragezeichen im Ursprungsbeitrag??? Unwahrscheinlich ...Es ist dein gutes Recht, dich von Usern, die null Eigeninitiative zeigen, vor den Karren spannen zu lassen. Mir ist es auch egal, das du in einem Forum um Spenden ...
Dein Ding - nicht meines
Nein, ich fördere nur den Prozentsatz an nutzbaren Lösungen hier im Forum, auch indem ich meinen Code detailliert kommentiere. Ob jemand sich nun hinsetzt und versucht den Code zu verstehen oder nicht ist seine Sache. Das ist ein Forum in dem man den Fragestellern hilft und nicht indem man sie mit provozierenden Fragen wieder vertreibt. Beim TO hattest du noch mal Glück das er so verständnisvoll reagiert hat.Dein Ding - nicht meines
Bedenke immer das auch andere Leute hier vorbei schauen und sowas trägt auch indirekt zum Bild des Forums bei. Ob ein TO nun davon was lernt oder nicht ist nicht unser Bier, aber der nutzbare Inhalt eines Forums macht es Interessant nicht nutzlose Kommentare.
Also, wenn Ihr hier schreibt dann helft doch bitte dem Fragesteller oder verkneift euch den Kommentar, wenn euch die Zeit für eine vernünftige Antwort fehlt! Danke.
Den Rest lasse ich jetzt die Mods entscheiden.
Grüße Uwe

Weißt was: Ich erfülle dir deinen Wunsch und mache es Jodel & Co gleich. Dafür ist mir meine Zeit zu schade, als das ich mich für den Support, den ich hier kostenlos Leiste, auch noch vor einer selbsternannten Moralkommission rechtfertigen müsste.
Du verstehst mich falsch. Wir alle opfern hier unsere übrige Zeit um anderen zu helfen. Aber manchmal sollte man halt zwei mal darüber nachdenken ob ein Kommentar sinnvoll war oder nicht.
Das ich einen Spendenlink unter manche (meist nur gute) Beiträge setze heißt ja nicht das ich das nur gegen Dollars mache, im Gegenteil: Wen anhand der Lösung geholfen wurde kann aus freien Stücken Feedback geben oder auch nicht. Ich sehe daran dann welche Beiträge hier gesucht sind.
Wenn dann was gespendet wird kommt es hier einem guten Zweck zu gute.
Das ich einen Spendenlink unter manche (meist nur gute) Beiträge setze heißt ja nicht das ich das nur gegen Dollars mache, im Gegenteil: Wen anhand der Lösung geholfen wurde kann aus freien Stücken Feedback geben oder auch nicht. Ich sehe daran dann welche Beiträge hier gesucht sind.
Wenn dann was gespendet wird kommt es hier einem guten Zweck zu gute.

Zitat von @colinardo:
Aber manchmal sollte man halt zwei mal darüber nachdenken ob ein Kommentar sinnvoll war oder nicht.
Warum hälst du dich nicht selbst an deinen hervorragenden Tip? Du hast den ganzen Thread ruiniert, nur um ein wenig Recht zu haben. Schade. Dabei geht dein wirklich guter Lösungsansatz völlig unterAber manchmal sollte man halt zwei mal darüber nachdenken ob ein Kommentar sinnvoll war oder nicht.
Zitat von @Serbitar:
Was allerdings noch nicht ganz passt ist dass auf die ""-header folgenden Zeilen nicht in eine Zelle geschrieben werden, wenn ein Zeilenumbruch vorhanden ist sondern jede Zeile in eine eigene Zelle.
Gut das ging leider aus deinem ersten Post nicht so ganz eindeutig hervor das alle Elemente in eine einzige Zelle eingefügt werden sollen. Ist aber kein Problem, ein klein bisschen umgeschrieben, dann landet alles pro Block in einer Zelle unter der Überschrift.Was allerdings noch nicht ganz passt ist dass auf die ""-header folgenden Zeilen nicht in eine Zelle geschrieben werden, wenn ein Zeilenumbruch vorhanden ist sondern jede Zeile in eine eigene Zelle.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub ImportTextData()
'Variablen
Dim fso As Object, dic As Object, regex As Object, matches As Object, match As Object, intCol As Long, strFile As String, strData As String
' Pfad der Datei
strFile = ThisWorkbook.Path & "\demo.txt"
' Objekte erstellen
Set fso = CreateObject("Scripting.FileSystemObject")
Set dic = CreateObject("Scripting.Dictionary")
Set regex = CreateObject("vbscript.regexp")
' Regex Optionen setzen
regex.Global = True: regex.IgnoreCase = True: regex.MultiLine = True
' Regex Pattern zur extrahierung der Sections mit deren Daten
regex.Pattern = "^\[([^\[]+)\]\s*([^\[]*)"
' Regex ausführen
Set matches = regex.Execute(fso.OpenTextFile(strFile, 1, False, -2).ReadAll())
intCol = 1
With ActiveSheet
' Erste Zeile Überschriften fett machen
Range("1:1").Font.Bold = True
' Für jede Section
For Each match In matches
'Name der Section holen
strSection = match.submatches(0)
'Items der Section holen
strData = match.submatches(1)
' Existiert die Section schon ?
If Not dic.Exists(strSection) Then
' es ist eine neue Section, füge sie dem Dictionary hinzu
dic.Add strSection, intCol
' Schreibe die Sectionüberschrift in Zeile 1 der neuen Spalte
.Cells(1, intCol).Value = strSection
' Schreibe die Items unter die Überschrift
.Cells(2, intCol).Value = strData
' Index der nächsten Spalte setzen
intCol = intCol + 1
Else
' Section existiert schon, füge die Items in einer neuen Zelle unter der Überschrift an
.Cells(Rows.Count, dic.Item(strSection)).End(xlUp).Offset(1, 0).Value = strData
End If
Next
'Spaltenbreiten an Inhalt anpassen
.UsedRange.EntireColumn.AutoFit
End With
End Sub
Und als ich statt deiner txt meine genommen habe und auf den Knopf drücke kommt immer eine Fehlermeldung mit: "Typen unverträglich" allerdings arbeitet das Makro trotzdem scheinbar fehlerfrei.
Vermutlich einfach ein Kodierungsproblem der Textdatei beim einlesen.Starte den Debugger und gehe den Code mit F8 schrittweise durch und nenne mir die Zeiile in der der Fehler auftritt.
Die Kodierung lässt sich mit dem letzten Parameter von
fso.OpenTextFile(strFile, 1, False, -2)
festlegen.CONSTANT VALUE DESCRIPTION
TristateTrue -1 Opens the file as Unicode
TristateFalse 0 Opens the file as ASCII
TristateUseDefault -2 Use default system setting
Grüße Uwe