Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1772to1776
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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)
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
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

225 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige