7.8k Aufrufe
Gefragt in Tabellenkalkulation von woenni Einsteiger_in (75 Punkte)
Ich habe eine Kontenbewertung vorzunehmen. Dazu liegen mir einige 100 Datenblätter in PDF Dateien vor. Um in einem sehr engen Zeitrahmen eine fundierte Analyse incl. Bewertung der Daten durchführen zu können, möchte ich die Daten in eine Excel Tabelle mit einer klaren Datenstruktur in Zeilen und Spalten überführen. Hierzu habe ich versucht die PDF Daten mit diversen Konvertern auch von namhaften Herstellern zu konvertieren. Die Ergebnisse sind ernüchternd, insbesondere was die Excelergebnisse betrifft. Hier erhalte ich verschachtelte Tabellen, Die (gleichen) Datentypen unterschiedlich formatiert (mal rechts- mal linksbündig) usw. Das besten Ergebnis erhalte ich bei der Konvertierung nach Word 2007. Da habe ich ordentliche Kontenblätter. Mein Problem wäre gelöst, wenn ich diese klar strukturiert, automatisiert nach Excel übernehmen könnte. Dazu habe ich das ganze Word Dokument (alle Kontenblätter) markiert und in Excel eingefügt. Mit dem Ergebnis könnte ich ggf. etwas anfangen, weil ich die vielen Leerzeilen ggf. mit einem Makro loswerden könnte. Schlimmer ist aber, daß ich nun in Excel sog. Textboxen habe, die a) oft Zelleninhalte überlagern. ich kann diese dann wegschieben und so den Inhalt der Zellen darunter in Augenschein nehmen. b) ich weiß aber nicht wie ich den Inhalt der Textboxen klar strukturiert in entsprechende Spalten bekomme.

Mein nächster Versuch, die Daten aus der Worddatei zu kopieren und einzufügen brachte die gewünschte Struktur ist aber zu aufwndig, weil ich nicht weiß, wie man das automatisiern kann Also im Grunde in Excvel Zellen oder Bereichsweise die Daten aus der Word Datei kopieren und in Excel spaltengerecht einfügen.

Gibt es jemand, der mir aus diesem Dilemma helfen kann?

mfg Wönni

19 Antworten

0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Woenni,

das Problem ist (siehe auch meine Antwort 8), dass in der Buchungsbeschreibung Leerzeichen enthalten sind und das Makro die einzelnen Sätze am Leerzeichen in seine "Einzelteile" zerlegt.
Für diesen konkreten Kontoauszug mit den Buchungssätzen, die du als Beispiel zur Verfügung gestellt hast, kann man das Makro so anpassen, dass die Daten deinen Wünschen entsprechenden Spalten zugeordnet werden.

Aber da ich keine Ahnung habe, wie der nächste oder übernächste Kontoauszug aussieht, wäre das Ergebnis bei den einzelnen Buchungen dann wahrscheinlich völlig anders (ich nehme mal an, dass der Buchungstext ja immer anders ist). Wenn dann auch noch in der Bezeichnung ein Leerzeichen vorhanden ist, dann wird es ganz unübersichtlich.

Vielleicht kannst du ja mal ein paar Datensätze zur Verfügung stellen, damit man sich mal einen Überblick verschaffen kann.

Gruß

M.O.
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi mo :-)

eine mögliche variante
Aufgliederung in wörter bzw zahlenblöcken und ein einfügen neuer Leerzeichen(nur 1)

gruss nighty
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo M.O., Hallo auch nighty,

in der Datei, die ich gestern hochgeladen habe http://www.file-upload.net/download-8044591/MO_MakroTest.xlsm.html
sind die Daten von 10 verschiedenen Kontoblättern die m.E. alle "Schwierigkeiten" enthalten.

bei dem Problem mit der Buchungszeile, hätte ich als Idee, daß man zuerts feststellen muß wieviel Betragsfelder es gibt (2 Nachkommastellen). Sind es 3 Betragsfelder kann man das erste Betragsfeld der Spalte Soll, das 2. der Spalte Haben und das 3. der Spalte Saldo zuordnen. Falls danach eine Kostenstelle kommt, ist das keine Dezimalzahl. Schwieriger ist es, wenn nur 2 Betragsfelder in der Buchungszeile sind. Dann bleibt m.E. nur der Weg, daß man vom jeweiligen Saldo der Buchungszeile die Differenz zum EB-Wert (1. Buchungszeile) bzw. dem Saldo der vorhergehenden Buchungszeile ermittelt. Ist die Differnz positiv ist der Betrag in der Soll Spalte, ist sie negativ in der Haben Spalte einzutragen. Die Tücke ist, wenn es sich um einen negativen Betrag (wegen Stornierung) handelt, müßte man umgekehrt entscheiden.

Ich hoffe, daß ich damit den Wunsch nach mehr Daten erüllt habe und uns das weiterbringt.

Vielen Dank und mfg
Wönni
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Wönni,

sorry, hatte nicht gesehen, dass dort mehrere Datensätze vorhanden sind; ich hatte nur die zweite Seite mit Ist- und Sollzustand gesehen :-(.

Ich schaue mal, wie man zu einer Lösung kommen kann.

Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Wönni,

eine Frage habe ich noch: Fangen die Kostenstellen immer mit T an?

Gruß

M.O.
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo M.O. und einen schönen guten Morgen,

ja - aber die Angabe von Kostenstellen ist eher die Ausnahme.

Ich bin am frühen Nachmittag wieder da.

Bis später und mfg
Woenni
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Woenni,

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


Gruß

M.O.
0 Punkte
Beantwortet von woenni Einsteiger_in (75 Punkte)
Hallo M.O.,

die Glückseligkeit, die ich jetzt empfinde, nachdem ich gerade den Test mit der neuen Version Deines Makros gemacht habe, paßt zu dem späten nSommerabend und ich möchte sie mit Dir teilen. Supercallefragelistic! Die Lösung, die Du mir damit gemacht hast ist einfach Spitzenklasse! Bis jetzt konnte ich kein Manko entdecken. Am Wochenende werde ich das Makro über alle Daten laufen lassen und bin guter Dinge, daß ich die an mich gestellten Erwartungen doch noch erfüllen kann. Ich gebe Dir dann Anfang der Woche feedback.

Aber nicht nur das Ergebnis macht mir Freude. Am tollsten finde ich, daß Du mir geholfen hast, mit Einfühlungsvermögen, Geduld und klarem Denken. Du hast sehr viel Kreativität, Können und Tatkraft in Deine Hilfsmaßnahme gesetzt. Dafür danke ich Dir sehr herzlich und wüßte gerne , wie ich Dir das erwidern kann. Gibt es eine Möglichkeit eine persönlichen Kontakt aufzubauen
?. Wobei ich gestehen muß, facebook, twitter u.ä. nicht zu nutzen.

Nochmals ganz Herzlich Danke, schönes Wochenende und bis bald
Woenni
0 Punkte
Beantwortet von m-o Profi (22.9k Punkte)
Hallo Woenni,

danke für deine Rückmeldung und dein Lob :-).

Wie alle Helfer hier im Supportnet mache ich das, weil ich z.B. Spass an der Arbeit mit Excel habe. Andere bauen in ihrer Freizeit Modelle und ich bastle dann halt z.B. an einem Excel-Makro.
Mir reicht als Danke deine Rückmeldung und deine Begeisterung (und ggf. Antwort gelöst ;-)).

Auch ich wünsche dir ein frohes Wochenende.

Gruß

M.O.
...