Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Textdatei mit fester Spaltenbreite lesen

Forumthread: Textdatei mit fester Spaltenbreite lesen

Textdatei mit fester Spaltenbreite lesen
22.07.2020 18:02:23
Juergen
Hallo,
ich möchte eine Textdatei mit fester Spaltenbreite in Excel einlesen. Anschließend möchte ich die Daten bearbeiten und die Datei im gleichen Format wieder exportieren. Ich habe schon mehrere Einstellungen für den Import versucht - leider ohne Erfolg. Meine Textdatei ist unten verlinkt. Wäre es evtl. mit einem Makro möglich, die 2. Zeile der Textdatei auszuwerten, und anhand der Spaltenbreite die nachfolgenden Daten zu befüllen? Leider bin ich mit VBA nicht sehr bewandert, daher wäre ich für Hilfe sehr dankbar.
Meine Textdatei: https://www.herber.de/bbs/user/139222.txt
Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Du darfst schon bei der ersten Zeile beginnen:
22.07.2020 18:46:21
lupo1
B1: =MTRANS(XMLFILTERN(WECHSELN("&lta&gt&ltb&gt"&GLÄTTEN($A1)&"&lt/b&gt&lt/a&gt";" ";"&lt/b&gt&ltb&gt");"//b"))
(xl365 rollt es von selbst nach rechts aus; bei Versionen vorher musst Du die Formel vermutlich als Array eingeben)
Anzeige
Für den Export musst Du die 51 Felderbeginne ...
22.07.2020 18:49:58
lupo1
... ermitteln und daraus den Bedarf für die einzelnen Feldlängen.
Die Felder werden dann wieder zu dem (ca. ?) 499 Zeichen langen String verkettet, möglicherweise auch teilweise formatiert mit TEXT().
So sehe ich das auch, lupo1 …
23.07.2020 00:55:10
Günther
… und das funktioniert auch recht gut mit Power Query. Die Feldbreiten habe ich erst einmal aus Bequemlichkeit mit einem Editor (Notepad++) herausgefunden und beim Import von Hand eingegeben, dann alle Spalten als Datentyp Text, die erste Zeile entfernt und die nun 1. Zeile als Überschrift genommen. Bis dahin sind die Spalten exakt so breit, wie vorgesehen. Je nach Bearbeitung muss dann natürlich vor dem speichern die Breite wieder angepasst werden.
 
Gruß
Günther  |  mein Excel-Blog
Anzeige
AW: Textdatei mit fester Spaltenbreite lesen
23.07.2020 08:59:30
volti
Hallo Jürgen,
hier noch mal ergänzend zu den anderen Lösungswegen eine reine VBA-Realisierung.
Probiere es mal aus, wenn Du Lust hast. Ist halt ein wenig aufwändiger.

[+][-]
Sub ImportFestBreite() Dim sFilename As String, iFF As Integer, i As Integer, iPos As Integer Dim iZeile As Long, WSh As Worksheet Dim sArrZL() As String, sArrPos() As Integer, sArrSP() As String Set WSh = ActiveSheet sFilename = "C:&bsol;Users&bsol;voltm&bsol;Desktop&bsol;Testdaten.txt" iFF = FreeFile If Dir(sFilename) <> "" Then Open sFilename For Input As iFF sArrZL = Split(Input(LOF(iFF), iFF), vbCrLf) Close iFF 'Spaltenpositionen ermitteln For iPos = 1 To Len(sArrZL(1)) If Mid(sArrZL(1), iPos, 1) = " " And Mid(sArrZL(1), iPos + 1, 1) <> " " Then ReDim Preserve sArrPos(i) sArrPos(i) = iPos: i = i + 1 End If Next iPos WSh.Cells(iZeile + 1, "A").value = sArrZL(0) For iZeile = 1 To UBound(sArrZL) For i = 0 To UBound(sArrPos) If sArrPos(i) < Len(sArrZL(iZeile)) Then Mid(sArrZL(iZeile), sArrPos(i), 1) = vbTab End If Next i For i = 1 To 16 sArrZL(iZeile) = Replace(sArrZL(iZeile), " " & vbTab, vbTab) sArrZL(iZeile) = Replace(sArrZL(iZeile), " " & vbTab, vbTab) Next i sArrSP = Split(sArrZL(iZeile), vbTab) WSh.Cells(iZeile + 1, "A").Resize(1, UBound(sArrSP) + 1).value = sArrSP Next iZeile End If End Sub Sub ExportFestBreite() Dim sFilename As String, iFF As Integer, i As Integer, iPos As Integer Dim iZeile As Long, iSpalte As Integer, WSh As Worksheet Dim sArrZL() As String, sArrPos() As Integer, sArrSP() As String Dim sZeile As String, iLang As Integer Set WSh = ActiveSheet sFilename = "C:&bsol;Users&bsol;voltm&bsol;Desktop&bsol;Testdaten.txt" iFF = FreeFile Open sFilename For Input As iFF Line Input #iFF, sZeile: Line Input #iFF, sZeile Close iFF 'Spaltenbreiten ermitteln For iPos = 1 To Len(sZeile) If Mid(sZeile, iPos, 1) = " " And Mid(sZeile, iPos + 1, 1) <> " " Then i = i + 1 ReDim Preserve sArrPos(i) sArrPos(i) = iPos - iLang iLang = iLang + sArrPos(i) End If Next iPos 'Jetzt die Daten schreiben Open sFilename For Output As iFF Print #iFF, WSh.Cells(1, "A").value & vbCrLf For iZeile = 2 To WSh.Cells(WSh.Rows.Count, 1).End(xlUp).Row - 1 sZeile = "" For iSpalte = 1 To UBound(sArrPos) sZeile = sZeile & Left(WSh.Cells(iZeile, iSpalte).value _ & Space(50), sArrPos(iSpalte)) Next iSpalte Print #iFF, sZeile Next iZeile Print #iFF, WSh.Cells(iZeile, "A").value Close iFF End Sub
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Textdatei mit fester Spaltenbreite lesen
23.07.2020 17:02:31
Juergen
Hallo zusammen,
vielen Dank für eure Antworten. Spontan hat mir die Lösung mittels VBA von volti am Besten gefallen und es hat auch auf Anhieb funktioniert :-)
Zwei kleine Probleme sind mir allerdings aufgefallen:
-Beim Import wird in der Spalte "Kinematic" das "G" hinten abgeschnitten, sodass dort nur noch "...CF" steht.
-Beim Export ist die zweite Zeile leer
Was muss ich im Code ändern, damit dies noch behoben wird? Vielen Dank für eure Unterstützung
Gruß Jürgen
Anzeige
AW: Textdatei mit fester Spaltenbreite lesen
23.07.2020 20:56:20
volti
Hallo Jürgen,
schau mal, ob es jetzt hinkommt.
Das einzige komplett ausgefüllte Feld deckte zum Glück rechtzeitig den kleinen Denkfehler meinerseits auf.

[+][-]
Sub ImportFestBreite() Dim sFilename As String, iFF As Integer, i As Integer, iPos As Integer Dim iZeile As Long, iLang As Integer, WSh As Worksheet Dim sArrZL() As String, sArrPos() As Integer, sArrSP() As String Dim sNewZeile As String Set WSh = ActiveSheet sFilename = "C:&bsol;Users&bsol;voltm&bsol;Desktop&bsol;Testdaten.txt" iFF = FreeFile If Dir(sFilename) <> "" Then Open sFilename For Input As iFF sArrZL = Split(Input(LOF(iFF), iFF), vbCrLf) Close iFF 'Spaltenpositionen ermitteln For iPos = 1 To Len(sArrZL(1)) If Mid(sArrZL(1), iPos, 1) = " " And Mid(sArrZL(1), iPos + 1, 1) <> " " Then ReDim Preserve sArrPos(i) sArrPos(i) = iPos: i = i + 1 End If Next iPos ReDim Preserve sArrPos(i) sArrPos(i) = Len(sArrZL(1)) WSh.Cells(iZeile + 1, "A").value = sArrZL(0) For iZeile = 1 To UBound(sArrZL) sNewZeile = Left(sArrZL(iZeile), sArrPos(0)) & vbTab If Len(sArrZL(iZeile)) > sArrPos(0) Then For i = 1 To UBound(sArrPos) If sArrPos(i) <= Len(sArrZL(iZeile)) Then If i = 0 Then sNewZeile = Left(sArrZL(iZeile), sArrPos(i)) & vbTab Else iLang = sArrPos(i) - sArrPos(i - 1) sNewZeile = sNewZeile & Trim$(Mid(sArrZL(iZeile), _ sArrPos(i - 1) + 1, iLang)) & vbTab End If End If Next i End If sArrSP = Split(sNewZeile, vbTab) WSh.Cells(iZeile + 1, "A").Resize(1, UBound(sArrSP) + 1).value = sArrSP Next iZeile End If End Sub Sub ExportFestBreite() Dim sFilename As String, iFF As Integer, i As Integer, iPos As Integer Dim iZeile As Long, iSpalte As Integer, WSh As Worksheet Dim sArrZL() As String, sArrPos() As Integer, sArrSP() As String Dim sZeile As String, iLang As Integer Set WSh = ActiveSheet sFilename = "C:&bsol;Users&bsol;voltm&bsol;Desktop&bsol;Testdaten.txt" iFF = FreeFile Open sFilename For Input As iFF Line Input #iFF, sZeile: Line Input #iFF, sZeile Close iFF 'Spaltenbreiten ermitteln For iPos = 1 To Len(sZeile) If Mid(sZeile, iPos, 1) = " " And Mid(sZeile, iPos + 1, 1) <> " " Then i = i + 1 ReDim Preserve sArrPos(i) sArrPos(i) = iPos - iLang iLang = iLang + sArrPos(i) End If Next iPos 'Jetzt die Daten schreiben Open sFilename For Output As iFF Print #iFF, WSh.Cells(1, "A").value 'Kopfzeile For iZeile = 2 To WSh.Cells(WSh.Rows.Count, 1).End(xlUp).Row - 1 sZeile = "" For iSpalte = 1 To UBound(sArrPos) sZeile = sZeile & Left(WSh.Cells(iZeile, iSpalte).value _ & Space(50), sArrPos(iSpalte)) Next iSpalte Print #iFF, sZeile Next iZeile Print #iFF, WSh.Cells(iZeile, "A").value 'Abschlusszeile Close iFF End Sub
viele Grüße aus Freigericht
Karl-Heinz

Anzeige
AW: Textdatei mit fester Spaltenbreite lesen
23.07.2020 23:55:55
Juergen
Hallo Karl-Heinz,
es funktioniert prima. Vielen herzlichen Dank.
Gruß Jürgen
;
Anzeige
Anzeige

Infobox / Tutorial

Textdatei mit fester Spaltenbreite in Excel einlesen und exportieren


Schritt-für-Schritt-Anleitung

Um eine Textdatei mit fester Spaltenbreite in Excel einzulesen und anschließend wieder zu exportieren, kannst Du die folgende VBA-Lösung verwenden:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten.
  2. Füge ein neues Modul hinzu (Einfügen -> Modul).
  3. Kopiere und füge den folgenden VBA-Code in das Modul ein:
Sub ImportFestBreite()
    Dim sFilename As String, iFF As Integer, i As Integer, iPos As Integer
    Dim iZeile As Long, WSh As Worksheet
    Dim sArrZL() As String, sArrPos() As Integer, sArrSP() As String

    Set WSh = ActiveSheet
    sFilename = "C:\Users\voltm\Desktop\Testdaten.txt"
    iFF = FreeFile

    If Dir(sFilename) <> "" Then
        Open sFilename For Input As iFF
        sArrZL = Split(Input(LOF(iFF), iFF), vbCrLf)
        Close iFF

        ' Spaltenpositionen ermitteln
        For iPos = 1 To Len(sArrZL(1))
            If Mid(sArrZL(1), iPos, 1) = " " And Mid(sArrZL(1), iPos + 1, 1) <> " " Then
                ReDim Preserve sArrPos(i)
                sArrPos(i) = iPos: i = i + 1
            End If
        Next iPos

        WSh.Cells(1, "A").Value = sArrZL(0)
        For iZeile = 1 To UBound(sArrZL)
            sArrSP = Split(sArrZL(iZeile), vbTab)
            WSh.Cells(iZeile + 1, "A").Resize(1, UBound(sArrSP) + 1).Value = sArrSP
        Next iZeile
    End If
End Sub
  1. Schließe den VBA-Editor und gehe zurück zu Excel.
  2. Führe das Makro aus (unter Entwicklertools -> Makros).

Häufige Fehler und Lösungen

  • Problem: Die letzte Spalte wird abgeschnitten.

    • Lösung: Überprüfe die Längen der Spaltenbreiten im Code und passe die Indizes in der Schleife entsprechend an.
  • Problem: Leere Zeilen beim Export.

    • Lösung: Stelle sicher, dass die Schleife zum Exportieren die korrekten Zeilen und Spalten berücksichtigt.

Alternative Methoden

  1. Power Query:

    • Du kannst auch Power Query verwenden, um eine Textdatei in Excel zu importieren. Wähle Daten -> Daten abrufen -> Aus Datei -> Aus Text/CSV.
  2. Text to Columns:

    • Für einfachere Dateien kannst Du auch die Funktion Text in Spalten in Excel nutzen. Wähle die Spalte aus, gehe auf Daten und klicke auf Text in Spalten, um die Spaltenbreiten manuell festzulegen.

Praktische Beispiele

Hier ist ein Beispiel für eine Textdatei mit fester Spaltenbreite:

Name       Alter  Stadt      
Max Mustermann 30  Musterstadt 
Maria Musterfrau 25 Musterstadt 

Nach dem Import solltest Du eine Excel-Tabelle mit den entsprechenden Spalten sehen.


Tipps für Profis

  • Nutze VBA für wiederkehrende Aufgaben, um Zeit zu sparen.
  • Achte darauf, die Spaltenbreiten genau zu definieren, um Datenverlust zu vermeiden.
  • Teste Deinen VBA-Code mit einer Kopie der Originaldatei, um unerwünschte Änderungen zu vermeiden.

FAQ: Häufige Fragen

1. Frage
Wie kann ich die Spaltenbreiten automatisch anpassen?
Du kannst die Spaltenbreiten nach dem Import mit Columns.AutoFit anpassen.

2. Frage
Welches Excel-Version benötige ich für diese Methoden?
Der VBA-Code funktioniert in Excel 2010 und späteren Versionen. Die Power Query-Funktion ist ab Excel 2016 verfügbar.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige