hier mal das überarbeitete Makro zum Testen. Bei der Bezeichnung der Konten und bei den Buchungstexten wird wohl noch etwas Handarbeit nötig sein, da die Trennfunktion hier an ihre Grenzen stößt.
Sub aufteilen_neu()
Dim ws As Worksheet
Dim bExists, bs As Boolean
Dim exText As Variant
Dim zeile, lzeile, i, ezeile, seite, z As Long
Dim bezeichnung, btext, konto, kontenbez As String
'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False
'Prüfen ob Blatt aufgeteilt existiert
' Alle vorhandenen Arbeitsblätter durchlaufen
For Each ws In Worksheets
If ws.Name = "aufgeteilt" Then
bExists = True: Exit For
End If
Next
'Falls nein, wird das Arbeitsblatt angelegt
If bExists = False Then
'Neues Blatt wird am Ende eingefügt
Worksheets.Add After:=Worksheets(Worksheets.Count)
'Neues Blatt benennen
ActiveSheet.Name = "aufgeteilt"
End If
Worksheets("Konten").Select
'letzte Zeile auf dem aktuellen Blatt ermitteln
lzeile = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
'letzte Zeile auf dem Blatt aufgeteilt ermitteln und um 1 erhöhen
ezeile = Sheets("aufgeteilt").UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1
'Schleife um nur die benötigten Daten aufgeteilt in das Blatt aufgeteilt zu schreiben
For zeile = 1 To lzeile
'Text aufteilen - Trennzeichen: Leer
exText = Split(ActiveSheet.Cells(zeile, 1), " ")
'Prüfen ob Seitenzahl vorhanden ist und in Variable schreiben
If UBound(exText) > 0 Then
If exText(UBound(exText) - 1) = "Seite:" Then seite = Val(exText(UBound(exText)))
End If
'Kontonummer suchen und in Variable schreiben
If exText(0) = "Konto" Then
exText = Split(ActiveSheet.Cells(zeile + 1, 1), " ")
konto = exText(0)
'Kontenbezeichnung wird in Variable geschrieben
kontenbez = exText(1)
For i = 2 To UBound(exText)
If exText(i) <> "EUR" Then
kontenbez = kontenbez & exText(i)
Else
Exit For
End If
Next i
End If
'Falls Zeile mit EB-Wert Soll alt anfängt, Überschriften und alte Werte schreiben
If Left(ActiveSheet.Cells(zeile, 1), 16) = "EB-Wert Soll alt" Then
'Überschriften für Kontenblatt erstellen
With Sheets("aufgeteilt")
.Cells(ezeile, 1) = "Konto"
.Cells(ezeile, 2) = "Bezeichnung"
.Cells(ezeile, 3) = "Seite"
.Cells(ezeile, 4) = "PE"
.Cells(ezeile, 5) = "BA"
.Cells(ezeile, 6) = "Beleg"
.Cells(ezeile, 7) = "vom"
.Cells(ezeile, 8) = "Gegenkonto"
.Cells(ezeile, 9) = "Bezeichnung"
.Cells(ezeile, 10) = "Buchungstext"
.Cells(ezeile, 11) = "EB-Wert"
.Cells(ezeile, 12) = "Soll"
.Cells(ezeile, 13) = "Haben"
.Cells(ezeile, 14) = "lfd. Saldo"
.Cells(ezeile, 15) = "Kostenstelle"
.Range(.Cells(ezeile, 4), .Cells(ezeile, 14)).Font.Bold = True
End With
ezeile = ezeile + 1
'nächste Zeile wird eingelesen und gesplittet
exText = Split(ActiveSheet.Cells(zeile + 1, 1), " ")
'Konto und Kontenbezeichnung werden geschrieben
Sheets("aufgeteilt").Cells(ezeile, 1) = konto
Sheets("aufgeteilt").Cells(ezeile, 2) = kontenbez
With Sheets("aufgeteilt")
.Cells(ezeile, 2) = "Alt"
.Cells(ezeile, 2).Font.Bold = True
End With
'Spalten K bis N
For i = 0 To 3
With Sheets("aufgeteilt")
.Cells(ezeile, 11 + i) = exText(i)
.Cells(ezeile, 11 + i) = CDbl(.Cells(ezeile, 11 + i))
.Cells(ezeile, 11 + i).NumberFormat = "#,##0.00"
End With
Next i
ezeile = ezeile + 1
End If
'Marker für Buchungssätze wird auf wahr gestellt
If Left(ActiveSheet.Cells(zeile, 1), 16) = "Pe BA Soll Haben" Then
bs = True
End If
'Buchungssätze schreiben
If bs = True And IsNumeric(exText(0)) = True Then
With Sheets("aufgeteilt")
.Cells(ezeile, 3) = seite
.Cells(ezeile, 4) = exText(0)
.Cells(ezeile, 5) = exText(1)
.Cells(ezeile, 6) = exText(2)
.Cells(ezeile, 7) = exText(3)
.Cells(ezeile, 8) = exText(4)
End With
i = UBound(exText)
'Prüfen ob letzter Inhalt Zahl ist
If IsNumeric(exText(i)) = False Then
'Falls nicht, wird Wert in Kostenstelle geschrieben
Sheets("aufgeteilt").Cells(ezeile, 15) = exText(i)
i = i - 1
End If
'Kontobewegung und Saldo schreiben
With Sheets("aufgeteilt")
.Cells(ezeile, 14) = exText(i)
.Cells(ezeile, 14) = CDbl(.Cells(ezeile, 14))
.Cells(ezeile, 14).NumberFormat = "#,##0.00"
.Cells(ezeile, 13) = exText(i - 1)
.Cells(ezeile, 13) = CDbl(.Cells(ezeile, 13))
.Cells(ezeile, 13).NumberFormat = "#,##0.00"
End With
'Rest zwischen 5 und i ist Bezeichnung und Buchungstext
'Bezeichnung
Sheets("aufgeteilt").Cells(ezeile, 9) = exText(5)
'Buchungstext
For z = 6 To i - 2
btext = btext & exText(z)
Next z
Sheets("aufgeteilt").Cells(ezeile, 10) = btext
'Variable für Buchungstext wieder leeren
btext = ""
ezeile = ezeile + 1
End If
'Falls Zeile mit EB-Wert Soll neu anfängt, Marker für Buchungssätze auf falsch stellen und nächste Zeile aufteilen
If Left(ActiveSheet.Cells(zeile, 1), 16) = "EB-Wert Soll neu" Then
bs = False
exText = Split(ActiveSheet.Cells(zeile + 1, 1), " ")
'aufgeteilten Text in Blatt aufgeteilt in einzelne Zellen schreiben
'nächste Zeile wird eingelesen und gesplittet
exText = Split(ActiveSheet.Cells(zeile + 1, 1), " ")
With Sheets("aufgeteilt")
.Cells(ezeile, 2) = "Neu"
.Cells(ezeile, 2).Font.Bold = True
End With
'Spalten K bis N
For i = 0 To 3
With Sheets("aufgeteilt")
.Cells(ezeile, 11 + i) = exText(i)
.Cells(ezeile, 11 + i) = CDbl(.Cells(ezeile, 11 + i))
.Cells(ezeile, 11 + i).NumberFormat = "#,##0.00"
End With
Next i
'zusätzliche Leerzeile nach Buchungssätzen einfügen
ezeile = ezeile + 2
End If
Next zeile
'Auf Blatt aufgeteilt wechseln
Sheets("aufgeteilt").Activate
'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True
End Sub
M.O.