AW: Textimport-Darstellung in vernüftige Spalten
02.09.2009 16:14:16
fcs
Hallo Lucia,
man kann die Text-Datei auch Zeilenweise per Makro einlesen und analysieren, ohne sie vorher in eine Excel-Datei zu laden.
Das Ergebnis wird dann in eine Mustertabelle oder in eine Leertabelle geschrieben.
Das Ganze läuft dann in 2 Haupt Do-Loop-Schleifen bis das Ende der Text-Datei erreicht ist nach folgendem Schema:
1. Do-Loop-Schleife
Lese Zeilen bis Zeile mit "Konto" beginnt.
- Schneide Konto, Kunde und Saldo aus dem Text und merke dies Info in 3 Variablen
Lese nächste Zeile ein
- Schneide zHd und Kredit aus dem Text und merke diese Info in 2 Variablen
Lese nächste Zeile ein
- Schneide Telefonnummer aus dem Text und merke diese Info in 1 Variable
Lese Zeilen bis Zeile mit "Datum" beginnt.
Überspringe eine Zeile
2. Do-Loop-Schleife bis zur nächsten Leerzeile
Lese nächste Zeile ein
Schneide die Informationen aus der Zeile und speichere in Variablen.
Dabei
- Umwandlung der Datumsangaben in Excel-Datum
- Umwandlung von Beträgen/Nummern in entsprechende Zahlen
Schreibe die in der 1. Loop gemerkten Kundeninfos und die Daten aus der Zeile in eine Excel-Zeile
2.Do-Loop-Ende
Verlasse Loop wenn Datei zuEnde
1. Do-Loop-Ende
Innerhalb der Schleifen müssen dann noch die Zeilen übersprungen werden, die sich auf jeder Seite wiederholen.
Im Prinzip wird dann mit der Textdatei etwas ähnliches gemacht wie du es mit der Exceldatei vorhast. Der Vorteil ist aber, dass man mit den Original-Daten arbeitet und nicht mit dem was was Excel beim Import der Textdatei aus den Daten macht.
Das Überschreiben von Daten bezog sich hier auf die Beispiel-Textdatei, um die ich gebeten hatte. Wenn du darin im Editor oder Notepad die Kundeninfo neutral gestaltest, dann solltest darauf achten, dass du die Zeichen überschreibst und keine Zeichen löschst oder einfügst, so das die Zeichenzahl und somit der Spaltenaufbau in der Textdatei nicht verändert wird.
Mein Problem mit deiner Beispieldatei war, dass die rechten Betrags-Spalten irgendwie chaotisch getrennt wurden. Dadurch sind sie für eine systematische Auswertung nicht mehr verwendbar.
Gruß
Franz
Hier mal ein Ansatz wie du deine importierten Daten auswerten und in ein neues Blatt übertragen kannst.
Sub ERP_Import()
Dim wksERP As Worksheet, wksImport As Worksheet, bolDatum As Boolean
Dim ZeileERP As Long, ZeileImport As Long, Spalte As Long
Dim varKonto, strKunde As String, varSaldo
Set wksERP = ActiveSheet
'Neues Blatt anlegen
Workbooks.Add Template:=xlWBATWorksheet
Set wksImport = ActiveSheet
With wksImport
'Spaltentitel eintragen
ZeileImport = 1
.Cells(ZeileImport, 1) = "Konto"
.Cells(ZeileImport, 2) = "Kunde"
.Cells(ZeileImport, 3) = "Saldo"
.Cells(ZeileImport, 4) = "Datum"
.Cells(ZeileImport, 5) = "Fälligk."
.Cells(ZeileImport, 6) = "Beleg"
.Cells(ZeileImport, 7) = "Rechnung"
.Cells(ZeileImport, 8) = "Ware"
.Cells(ZeileImport, 9) = "MS"
'Spalten formatieren - Zahlenformate
.Columns(2).NumberFormat = "@" 'als Text
.Columns(3).NumberFormat = "#,##.00"
.Columns(4).NumberFormat = "DD.MM.YYYY"
.Columns(5).NumberFormat = "DD.MM.YYYY"
.Columns(8).NumberFormat = "@" 'als Text
'Spalten formatieren - Breiten
.Columns(1).ColumnWidth = 8
.Columns(2).ColumnWidth = 15
.Columns(3).ColumnWidth = 8
.Columns(4).ColumnWidth = 10
.Columns(5).ColumnWidth = 10
.Columns(6).ColumnWidth = 10
.Columns(7).ColumnWidth = 10
.Columns(8).ColumnWidth = 20
.Columns(9).ColumnWidth = 4
Range("C2").Select
ActiveWindow.FreezePanes = True
End With
With wksERP
bolDatum = True
For ZeileERP = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
'Spalte 1 prüfen
If .Cells(ZeileERP, 1).Value = "OFFENE DEB" _
Or .Cells(ZeileERP, 1).Value = "Bis Datum" _
Or .Cells(ZeileERP, 1).Value = "" Then
'Do nothing, Titelzeilen und Leerzeilen
ElseIf Asc(.Cells(ZeileERP, 1)) = 45 Then
'Horizontalstriche im Blatt
'do nothing
Else
If .Cells(ZeileERP, 1).Value = "Konto ...:" And bolDatum = True Then
'Kundeninfos merken
varKonto = .Cells(ZeileERP, 2).Value
strKunde = .Cells(ZeileERP, 3).Value & .Cells(ZeileERP, 4).Value _
& .Cells(ZeileERP, 5).Value
varSaldo = .Cells(ZeileERP, 9).Value
bolDatum = False
ElseIf .Cells(ZeileERP, 1).Value = "Datum" And bolDatum = False Then
bolDatum = True
ElseIf bolDatum = True Then
ZeileImport = ZeileImport + 1
'Kundendaten übertragen
wksImport.Cells(ZeileImport, 1) = varKonto
wksImport.Cells(ZeileImport, 2) = strKunde
wksImport.Cells(ZeileImport, 3) = varSaldo
'Zeilendaten übertragen
For Spalte = 1 To 6
wksImport.Cells(ZeileImport, Spalte + 3).Value = .Cells(ZeileERP, Spalte).Value
Next
End If
End If
Next
End With
End Sub