Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1324to1328
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

Warum wird nicht alles korrekt eingelesen?

Warum wird nicht alles korrekt eingelesen?
10.08.2013 11:38:22
Pascal
Guten Tag
Vor langer Zeit schon mal wurde mir hier im Forum geholfen, den untenstehenden Code zusammenzubasteln.
Es geht um folgendes:
Mittels untenstehendem Code werden Textfiles eingelesen und daraus Fehlermeldungen gesucht und aufbereitet.
Folgendes file als Beispiel wird eingelesen:
https://www.herber.de/bbs/user/86789.txt
In diesem File drin (Protokoll aus einem SAP-Datenexport) sind Zeilen drin, die mit "Aufteiler" beginnen.
Genau diese Zeilen sind Fehler, welche im Excel aufbereitet werden sollen.
wenn ich den folgenden Code laufen lasse, so werden diese Fehler ausgelesen.
Warum aber werden nicht alle Zeilen aus dem Textfile (die mit "Aufteiler") beginnen ins Excel übertragen ?
Wo liegt der Fehler?
Besten Dank für Eure Hilfe!
Sub DateiImport()
Dim varDatei, strText As String, arrTemp As Variant, intI As Integer
Dim intFF As Integer, wks As Worksheet, lngZeile As Long, intLine As Integer
Dim strSp1$, strSp2$, strSp3$, strSp4$, strSp5$
Dim Zeile As Long 'Variable um Zeile mit "Generierungsprotokoll" auszulesen und dann zu lö _
schen inkl. der nächsten beiden folgenden Zeilen
Dim strTXT_File As String, sInhalt As String 'Variablendeklaration für Bearbeitung Textfile  _
vor Import
Dim F As Integer 'Variablendeklaration für Bearbeitung Textfile vor Import
Dim oldStatus As String
oldStatus = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = "BITTE HABEN SIE EINEN MOMENT GEDULD ! DIE DATEN WERDEN AUFBEREITET" _
strTXT_File = Application.GetOpenFilename(Filefilter:="Texte(*.txt),*.txt", Title:="Bitte  _
Datendatei öffnen")
F = FreeFile
'Lese TXT
Open strTXT_File For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
'Schreibe TXT
Open strTXT_File For Output As #F
Print #F, sInhalt
Close #F
'____________________________________________________________________________________________________
Sheets("Tabelle2").Select 'leeres Tabellenblatt "Tabelle 2" wählen
'Textdatei auswählen
varDatei = strTXT_File
If varDatei = False Then Exit Sub
Set wks = ActiveSheet
lngZeile = 1
With wks
'Spaltentitel eintragen
.Cells(lngZeile, 1) = "Aufteiler"
.Cells(lngZeile, 2) = "Position"
.Cells(lngZeile, 3) = "Bestellposition für: Artikel"
.Cells(lngZeile, 4) = "Betrieb"
.Cells(lngZeile, 5) = "Sonstiges"
'Spalten formatieren
.Range(.Columns(1), .Columns(5)).VerticalAlignment = xlVAlignTop
.Range(.Columns(1), .Columns(4)).AutoFit
.Columns(5).ColumnWidth = 40
.Columns(5).WrapText = True
End With
intFF = FreeFile()
Open varDatei For Input As #intFF
Do Until EOF(intFF)
Line Input #intFF, strText
If Left(strText, 9) = "Aufteiler" Then 'Zeile 1 aufbereiten
arrTemp = Split(strText, ",")
strSp1 = Trim(arrTemp(0))
strSp2 = Trim(arrTemp(1))
strSp5 = ""
intLine = 1
ElseIf Left(strText, 8) = "Bestellp" Then 'Zeile 2 aufbereiten
arrTemp = Split(strText, ",")
strSp3 = Trim(arrTemp(0))
strSp4 = Left(Trim(arrTemp(1)), 13)
strSp5 = Trim(Mid(arrTemp(1), 1))
strSp5 = VBA.Replace(strSp5, "wurde nicht ange", "wurde nicht angelegt ", 1)
intLine = 2
Else 'Zeile 3 + 4 aufbereiten
strSp5 = strSp5 & strText
intLine = intLine + 1
End If
If intLine = 4 Then '4. Zeile des Datensatzes ist eingelesen
'Daten in Tabelle schreiben
lngZeile = lngZeile + 1
With wks
'führende Nullen bleiben erhalten
.Cells(lngZeile, 1) = "'" & VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = "'" & VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = "'" & VBA.Replace(strSp3, "Bestellposition für: Artikel: ", "", 1) _
.Cells(lngZeile, 4) = "'" & VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
'oder ohne führende Nullen
.Cells(lngZeile, 1) = VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = VBA.Replace(strSp3, "Bestellposition für: Artikel: ", "", 1)
.Cells(lngZeile, 4) = VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
End With
End If
Loop
Close #intFF
'Autofit / Zellenformatierung der Tabelle in Excel:
Rows("1:1").Select
Selection.Font.Bold = True
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
Cells.Select
Selection.NumberFormat = "0_ ;[Red]-0 "
Range("A1").Select
'fertig aufbereitete Daten aus Tabellenblatt 2 (Aktive Arbeitsmappe) in neue Arbeitsmappe rü _
berkopieren
Cells.Select
Selection.Cut
Workbooks.Add
ActiveSheet.Paste
End Sub

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Warum wird nicht alles korrekt eingelesen?
10.08.2013 14:33:47
Luschi
Hallo Pascal,
das Vba-Programm findet schon alle 7 Zeilen mit Anfangsinhalt 'Aufteiler', nur ist deine Logig dann falsch. Zwischen dieser Zeile:
Aufteiler 0000814273 ,Position 00030
und
Aufteiler 0000814273 ,Position 00040
und
Aufteiler 0000814274 ,Position 00040
liegen jeweils nur 2 Zwischenzeilen. Da Du aber jedesmal den internen Zähler auf 1 zurücksetzt, gehen beide Position 00030/00040 von '0000814273' verloren!
Gruß von Luschi
aus klein-Paris

AW: Warum wird nicht alles korrekt eingelesen?
11.08.2013 02:00:39
fcs
Hallo Pascal,
mit folgenden Anpassungen sollte die Auswertung alle Zeilen ausgeben.
Gruß
Franz
Sub DateiImport()
Dim varDatei, strText As String, arrTemp As Variant, intI As Integer
Dim intFF As Integer, wks As Worksheet, lngZeile As Long, intLine As Integer
Dim strSp1$, strSp2$, strSp3$, strSp4$, strSp5$
Dim Zeile As Long 'Variable um Zeile mit "Generierungsprotokoll" auszulesen und _
dann zu löschen inkl. der nächsten beiden folgenden Zeilen
Dim strTXT_File As String, sInhalt As String 'Variablendeklaration für Bearbeitung _
Textfile vor Import
Dim F As Integer 'Variablendeklaration für Bearbeitung Textfile vor Import
Dim oldStatus As String
oldStatus = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = _
"BITTE HABEN SIE EINEN MOMENT GEDULD ! DIE DATEN WERDEN AUFBEREITET"
strTXT_File = Application.GetOpenFilename(Filefilter:="Texte(*.txt),*.txt", _
Title:="Bitte Datendatei öffnen")
F = FreeFile
'Lese TXT
Open strTXT_File For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
'Schreibe TXT
Open strTXT_File For Output As #F
Print #F, sInhalt
Close #F
'____________________________________________________________________________________________________
Sheets("Tabelle2").Select 'leeres Tabellenblatt "Tabelle 2" wählen
'Textdatei auswählen
varDatei = strTXT_File
If varDatei = False Then Exit Sub
Set wks = ActiveSheet
lngZeile = 1
With wks
'Spaltentitel eintragen
.Cells(lngZeile, 1) = "Aufteiler"
.Cells(lngZeile, 2) = "Position"
.Cells(lngZeile, 3) = "Bestellposition für: Artikel"
.Cells(lngZeile, 4) = "Betrieb"
.Cells(lngZeile, 5) = "Sonstiges"
'Spalten formatieren
.Range(.Columns(1), .Columns(5)).VerticalAlignment = xlVAlignTop
.Range(.Columns(1), .Columns(4)).AutoFit
.Columns(5).ColumnWidth = 40
.Columns(5).WrapText = True
End With
intFF = FreeFile()
Open varDatei For Input As #intFF
intLine = 0
Do Until EOF(intFF)
Line Input #intFF, strText
If Left(strText, 9) = "Aufteiler" Then 'Zeile 1 aufbereiten
If intLine >= 2 Then
'Daten in Tabelle schreiben
lngZeile = lngZeile + 1
With wks
GoTo OhneNullen
'führende Nullen bleiben erhalten
.Cells(lngZeile, 1) = "'" & VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = "'" & VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = "'" & VBA.Replace(strSp3, _
"Bestellposition für: Artikel: ", "", 1)
.Cells(lngZeile, 4) = "'" & VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
GoTo weiter
OhneNullen:
'oder ohne führende Nullen
.Cells(lngZeile, 1) = VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = VBA.Replace(strSp3, _
"Bestellposition für: Artikel: ", "", 1)
.Cells(lngZeile, 4) = VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
weiter:
End With
intLine = 0
End If
arrTemp = Split(strText, ",")
strSp1 = Trim(arrTemp(0))
strSp2 = Trim(arrTemp(1))
strSp5 = ""
intLine = intLine + 1
ElseIf intLine = 1 And Left(strText, 8) = "Bestellp" Then 'Zeile 2 aufbereiten
arrTemp = Split(strText, ",")
strSp3 = Trim(arrTemp(0))
strSp4 = Left(Trim(arrTemp(1)), 13)
strSp5 = Trim(Mid(arrTemp(1), 1))
strSp5 = VBA.Replace(strSp5, "wurde nicht ange", "wurde nicht angelegt ", 1)
intLine = 2
ElseIf intLine = 2 Or intLine = 3 Then 'Zeile 3 + 4 aufbereiten
strSp5 = strSp5 & strText
intLine = intLine + 1
End If
Loop
Close #intFF
'Autofit / Zellenformatierung der Tabelle in Excel:
Rows("1:1").Select
Selection.Font.Bold = True
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
Cells.Select
Selection.NumberFormat = "0_ ;[Red]-0 "
Range("A1").Select
'fertig aufbereitete Daten aus Tabellenblatt 2 (Aktive Arbeitsmappe) _
in neue Arbeitsmappe rüberkopieren
Cells.Select
Selection.Cut
Workbooks.Add
ActiveSheet.Paste
Application.StatusBar = False
Application.DisplayStatusBar = oldStatus
End Sub

Anzeige
AW: Warum wird nicht alles korrekt eingelesen?
12.08.2013 07:14:35
Pascal
Vielen Dank schon mal für den angepassten Code.
werde den gleich mal anschauen und austesten.

AW: Warum wird nicht alles korrekt eingelesen?
12.08.2013 07:22:48
Pascal
Habe nun den obigen Code getestet.
Scheint besser zu funktionieren.
allerdings.... wenn ich das Textfile welches ich hier im Thread mitgeliefert habe einlese, so wird der letzte Fehler im File nicht gefunden:
Aufteiler 0000819919 ,Position 00010
Bestellposition für: Artikel: 000000000004386321, Betrieb: 2363 wurde nicht ange
Betrieb 2363 ist zum Lieferdatum geschlossen
Was ist da noch falsch ?

AW: Warum wird nicht alles korrekt eingelesen?
13.08.2013 08:32:25
Pascal
Hallo zusammen
Also.... danke an Franz für den folgenden Code:
Sub DateiImport()
Dim varDatei, strText As String, arrTemp As Variant, intI As Integer
Dim intFF As Integer, wks As Worksheet, lngZeile As Long, intLine As Integer
Dim strSp1$, strSp2$, strSp3$, strSp4$, strSp5$
Dim Zeile As Long 'Variable um Zeile mit "Generierungsprotokoll" auszulesen und _
dann zu löschen inkl. der nächsten beiden folgenden Zeilen
Dim strTXT_File As String, sInhalt As String 'Variablendeklaration für Bearbeitung _
Textfile vor Import
Dim F As Integer 'Variablendeklaration für Bearbeitung Textfile vor Import
Dim oldStatus As String
oldStatus = Application.DisplayStatusBar
Application.DisplayStatusBar = True
Application.StatusBar = _
"BITTE HABEN SIE EINEN MOMENT GEDULD ! DIE DATEN WERDEN AUFBEREITET"
strTXT_File = Application.GetOpenFilename(Filefilter:="Texte(*.txt),*.txt", _
Title:="Bitte Datendatei öffnen")
F = FreeFile
'Lese TXT
Open strTXT_File For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
Close #F
'Schreibe TXT
Open strTXT_File For Output As #F
Print #F, sInhalt
Close #F
'____________________________________________________________________________________________________
Sheets("Tabelle2").Select 'leeres Tabellenblatt "Tabelle 2" wählen
'Textdatei auswählen
varDatei = strTXT_File
If varDatei = False Then Exit Sub
Set wks = ActiveSheet
lngZeile = 1
With wks
'Spaltentitel eintragen
.Cells(lngZeile, 1) = "Aufteiler"
.Cells(lngZeile, 2) = "Position"
.Cells(lngZeile, 3) = "Bestellposition für: Artikel"
.Cells(lngZeile, 4) = "Betrieb"
.Cells(lngZeile, 5) = "Sonstiges"
'Spalten formatieren
.Range(.Columns(1), .Columns(5)).VerticalAlignment = xlVAlignTop
.Range(.Columns(1), .Columns(4)).AutoFit
.Columns(5).ColumnWidth = 40
.Columns(5).WrapText = True
End With
intFF = FreeFile()
Open varDatei For Input As #intFF
intLine = 0
Do Until EOF(intFF)
Line Input #intFF, strText
If Left(strText, 9) = "Aufteiler" Then 'Zeile 1 aufbereiten
If intLine >= 2 Then
'Daten in Tabelle schreiben
lngZeile = lngZeile + 1
With wks
GoTo OhneNullen
'führende Nullen bleiben erhalten
.Cells(lngZeile, 1) = "'" & VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = "'" & VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = "'" & VBA.Replace(strSp3, _
"Bestellposition für: Artikel: ", "", 1)
.Cells(lngZeile, 4) = "'" & VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
GoTo weiter
OhneNullen:
'oder ohne führende Nullen
.Cells(lngZeile, 1) = VBA.Replace(strSp1, "Aufteiler ", "", 1)
.Cells(lngZeile, 2) = VBA.Replace(strSp2, "Position ", "", 1)
.Cells(lngZeile, 3) = VBA.Replace(strSp3, _
"Bestellposition für: Artikel: ", "", 1)
.Cells(lngZeile, 4) = VBA.Replace(strSp4, "Betrieb: ", "", 1)
.Cells(lngZeile, 5) = strSp5
weiter:
End With
intLine = 0
End If
arrTemp = Split(strText, ",")
strSp1 = Trim(arrTemp(0))
strSp2 = Trim(arrTemp(1))
strSp5 = ""
intLine = intLine + 1
ElseIf intLine = 1 And Left(strText, 8) = "Bestellp" Then 'Zeile 2 aufbereiten
arrTemp = Split(strText, ",")
strSp3 = Trim(arrTemp(0))
strSp4 = Left(Trim(arrTemp(1)), 13)
strSp5 = Trim(Mid(arrTemp(1), 1))
strSp5 = VBA.Replace(strSp5, "wurde nicht ange", "wurde nicht angelegt ", 1)
intLine = 2
ElseIf intLine = 2 Or intLine = 3 Then 'Zeile 3 + 4 aufbereiten
strSp5 = strSp5 & strText
intLine = intLine + 1
End If
Loop
Close #intFF
'Autofit / Zellenformatierung der Tabelle in Excel:
Rows("1:1").Select
Selection.Font.Bold = True
Columns("A:A").EntireColumn.AutoFit
Columns("B:B").EntireColumn.AutoFit
Columns("C:C").EntireColumn.AutoFit
Columns("D:D").EntireColumn.AutoFit
Columns("E:E").EntireColumn.AutoFit
Cells.Select
Selection.NumberFormat = "0_ ;[Red]-0 "
Range("A1").Select
'fertig aufbereitete Daten aus Tabellenblatt 2 (Aktive Arbeitsmappe) _
in neue Arbeitsmappe rüberkopieren
Cells.Select
Selection.Cut
Workbooks.Add
ActiveSheet.Paste
Application.StatusBar = False
Application.DisplayStatusBar = oldStatus
End Sub

Leider aber liest mir dieser die letzte Fehlermeldung zwar ein, bereitet diese im Excel-Tabellenblatt2 aber nicht auf.
d.h. wenn wir im beliegenden Textfile schauen, so müsste die letzte gefundene Fehlermeldung sein:
Aufteiler 0000819919 ,Position 00010
Bestellposition für: Artikel: 000000000004386321, Betrieb: 2363 wurde nicht ange
Betrieb 2363 ist zum Lieferdatum geschlossen
aber eben genau diese Fehlermeldung fehlt dann in der Auswertung.
Warum ? - wird da aus dem Array nicht sauber übertragen ? - ich jedenfalls hab den Fehler leider bisher noch nicht lokalisieren können.
kann mir da jemand behilflich sein?
Herzlichen Dank im voraus für Eure Unterstützung
Anbei nochmals das Beispiels-Textfile, welches es zu importieren gilt:
https://www.herber.de/bbs/user/86820.txt

Anzeige
AW: Warum wird nicht alles korrekt eingelesen?
14.08.2013 08:02:01
Pascal
Hallo zusammen!
Ich suche nach wie vor eine Lösung für mein Problem.
was ich zwischenzeitlich noch rausgefunden habe:
die Schlaufe in obigem Code wird ein "Umgang" zu früh verlassen.
Denn ... schreibe ich in die Textdatei am Ende nochmals das Wort "Aufteiler" rein, so wird auch die letzte Fehlermeldung gefunden und aufs Excel übertragen. (aber Makro bricht dann mit einem Laufzeitfehler ab)
Ich stell mir daher die Frage, ob ich das Makro so erweitern / ändern kann, dass zu Beginn das .txt - File geöffnet wird und dort drinn am Ende des Files nochmals das Wort "Aufteiler" hingeschrieben wird (um zu bewirken, dass die Loop-Schlaufe ein weiteres Mal durchlaufen wird und somit der letzte Fehlereintrag auf das Excel-Sheet übertragen wird, ehe die Schlaufe verlassen wird)
Natürlich müsste ich dann auch allfällige Fehler irgendwie abfangen, so dass das Makro nicht abbricht.
geht das irgendwie ?
Besten Dank für Eure Hilfe!
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige