WORD VBA - Schwärzen von Rechnungspositionen

Moderator: ModerationP

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon El1337 » 12. Jun 2014, 10:50

Also ich mein, im Prinzip kann man immer die Ganze Zeile entfärben, sobald er einen der Begriffe aus dem Array findet.

Gruß
El1337
El1337
 

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon Miss Marple » 12. Jun 2014, 11:00

Deine Antworten kommen reichlich tröpfchenweise. Immer wenn ich denke, das Thema ist durch, fehlt noch was .. Kommt danach noch was ? Nur ne Nachfrage, bevor ich einen neuen Vorschlag andenke.

Gruß
MM

Nimm's nur n bißchen persönlich :wink:
Miss Marple
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1568
Registriert: 24. Jan 2014, 08:13
Wohnort: 52° 15' 53" N, 10° 31' 26" E

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon El1337 » 12. Jun 2014, 11:18

Sorry für den Umstand!

Nein, sonst kommt nichts dazu. Die Rechnung soll innerhalb der Positionen so geschwärzt werden, dass nur bestimmt Artikelnummern inkl. der Zeile in der sie stehen (wegen bezeichnung, Stück, Preis) sichtbar sind.

Vielen Lieben Dank
El1337

Habe es gerade mit einer If abfrage probiert, aber das funktioniert leider nicht so wie gedacht.
Code: Alles auswählen
    With rng1.Find
        For i = LBound(RePaintText) To UBound(RePaintText)
            .Text = RePaintText(i)
            If .Found Then
                Selection.Expand wdLine
            End If
            .Replacement.Highlight = True
            .Execute Replace:=wdReplaceAll
        Next i
    End With
El1337
 

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon Miss Marple » 12. Jun 2014, 11:34

Das Problem in diesem Gedanken ist, dass Tabellen keine "Linie" kennen.

Das viel größere Problem aber ist gleich der erste Rechnungsposten ("8000287") in deinem Beispiel: die Überschrift ist keine Tabelle, das ist reiner Text. Darunter befinden sich verschiedene Textboxen also keine normaler Text, keine Tabelle. Pos. Art.Nr und Bezeichnung stehen in einer Textbox, Menge-ME in einer zweiten und Preis und Total in einer Dritten. Wie willst du da rausfinden, welche Textbox was ist und wiviele davon nebeneinader stehen in einer Zeile stehen ? Das ist mir ein Räsel. Wor allem wor kommt sowas zustande?

Kopschüttel :evil:
MM
Miss Marple
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1568
Registriert: 24. Jan 2014, 08:13
Wohnort: 52° 15' 53" N, 10° 31' 26" E

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon El1337 » 12. Jun 2014, 12:35

Danke trotzdem für deine Hilfe.

Ja ich weiß, die Word Dokumente sind nicht das Gelbe vom Ei. Kurz vor Knapp wurde mir die Sache übertragen, die Daten kommen von einem Kollegen, der im Urlaub ist. Ich komme leider nicht an die Rohdaten in PDF Form ran und muss deshalb mit dem Murks arbeiten.

Mal sehen, von Hand schwärzen kommt halt nicht in Frage, bei insgesamt über 30k Seiten.

Mit der Funktion, Tabelle in Text, verschiebts alles nur und so wie ich es jetzt einschätzen kann, müsste man alle Felder in einen einzigen Typen überführen und dabei die "Formatierung/Orientierung" des Textes übernehmen.
Hmmm, vielleicht fällt dir ja noch etwas ein, aber dein Kopfschüttel ist schon berechtigt!!!!

Danke und Gruß
Michi
El1337
 

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon Miss Marple » 12. Jun 2014, 12:52

Vielleicht gibt es ja eine Zwischenlösung, mit der man einen Großteil des Problems erschlagen kann.

Was kommt denn häufiger vor Textfelder oder Tabellen? Wenn Textfelder, sind die dann immer genauso eingefügt oder sind es mal 3, mal 4, mal 1?

Sind das alle Varianten: Textfelder und Tabellen oder gibt es da noch andere Überraschungen? Wenn ein Dokument überwiegend aus Ausnahmen besteht, lässt es sich ganz schwer automatisieren :roll:

MM
Miss Marple
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1568
Registriert: 24. Jan 2014, 08:13
Wohnort: 52° 15' 53" N, 10° 31' 26" E

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon El1337 » 12. Jun 2014, 15:57

Also überwiegend, kann ich dir jetzt so nicht direkt sagen, vom bisher gesehen Zustand würde ich auf Tabellen tippen.
Die Textfelder sollten immer gleich viele sein, da die Rechnungen ja Spaltentechnisch alle Gleich sind. Also das OCR Proramm vom Kollegen wird eben mal Tabelle mal Textfeld erstellt haben.

Ja, dass die nicht einheitlich sind, nervt mich auch tierisch. Kollegen erreichen wir auch nicht und er ruft auch nicht zurück.

Mein Gedanken wäre, dass man nun die Artikelnummern, die nicht geschwärzt werden sollen sucht und den Anfang und das Ende der Zeile als "Zusatz-Eck-Punkte" für die Ranges hernimmt. Diese x-vielen Ranges, sollten dann beim Schwärzen iwie abgefragt werden. Hierzu müsste man aber das Programm so laufen lassen, dass es den Positionen Block erkennt, Zeile für Zeile abarbeitet und eben in der abarbeitung muss definiert sein, dass er das bis zum Ende der Zeile machen soll. Da kommt aber wieder das, Tabelle, Fließtext usw. Problem dazwischen. Also iwie müsste das Makro wissen, Anfang der Zeile wird geschwärzt, dann muss es das bis zum ende der Zeile durchziehen und dann zur nächsten Zeile springen, Anfang überprüfen, weiter im Text.

Also ich muss ehrlich sein, leider fehlen mir hierzu die Details bzw. Erfahrung mit VBA.

Danke und Gruß
El1337
El1337
 

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon Miss Marple » 12. Jun 2014, 16:03

Da kommt aber wieder das, Tabelle, Fließtext usw. Problem dazwischen. Also iwie müsste das Makro wissen, Anfang der Zeile wird geschwärzt, dann muss es das bis zum ende der Zeile durchziehen und dann zur nächsten Zeile springen, Anfang überprüfen, weiter im Text.
Es gibt bei den TextBoxZeilen keine Ende der Zeile. Du kannst die komplette Zeile ja auch nicht 'von Hand' makieren.
Wir bleiben dran - nur heute nicht mehr :P

MM

P.S. Kein Wunder, dass auch dein ursprünglicher Ansatz da nicht so recht gegriffen hat, seufz.
Miss Marple
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1568
Registriert: 24. Jan 2014, 08:13
Wohnort: 52° 15' 53" N, 10° 31' 26" E

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon El1337 » 12. Jun 2014, 21:18

Schön zu hören, dass der Ansatz zumindest in die richtige Richtung ging, halbwegs bzw. umständlich und kompliziert.

Ja ich war gerade bei Kumpels, aber keiner hat eine Idee wie man das Problem richtig lösen kann, ohne die Rohdaten. Wenn man die Daten in PDF Form hätte, wäre es kein Problem. Acrobat Pro bringt da ne nette Funktion mit. Die heißt sogar "Schwärzen". Einzelne Seiten per selbst gebastelter Maske (manipuliert natürlich mit c++), im Stapelverfahren schwärzen. Habe ich noch nicht gemacht, wurde mir gerade erzählt und dass es n direkt implementiertes Werkzeug is.

Naja heute meinte mein Chef, da wir den Rohdatenlieferanten, der gerade im Urlaub ist, nicht erreichen, legen wir das ganze erstmal auf Eis. Es geht um Patentanwalttechnische Dinge, kA .. plötzlich können wir warten... :doubt: aber ... und das ist das Gute am Cheffe, die Verantwortung hat er gleich wieder auf den "Lieferanten" geschoben :roll:
Mal sehen was er morgen vor hat ... lol

Mich lässt der Schmarn nicht in Ruhe, aber ohne die Rohdaten, also den Export von "Roh" zu "Geschwärzt", geht da nix ... die inkonsistenz ist einfach nicht zu bewältigen, wenn man auch einen hohen Grad an Plausibilität haben will.
Nach langem Überlegen bin ich auch zu dem Schluss gekommen, dass der Export aus dem WaWi schon manipuliert werden könnte ...... *verzweifel" ..
Deine Hilfe hat mir zumindest sehr viel beigebracht, was Word betrifft und dessen Elemente. Ein herzliches Dankeschön hierfür! Ein bisschen wachsen an der Herausforderung war ja dann doch drin ;)

Schönen Abend noch!

LG, El1337
El1337
 

Re: WORD VBA - Schwärzen von Rechnungspositionen

Beitragvon Miss Marple » 13. Jun 2014, 07:56

Mich lässt der Schmarn nicht in Ruhe
Kann ich verstehen :lol:

Also. Ich hab - mit etwas Denkpause dazwischen – den Code nochmal überarbeitet. In deiner Beispieldatei funktioniert er nun tadellos. Da zwei Suchen mit Ranges darin enthalten sind, wird es bei längeren Dokumenten schon etwas dauern bis die komplette Datei bearbeitet ist – also nicht wundern.
Code: Alles auswählen
Sub PaintItBlack_II()
    Dim doc As Document: Set doc = ActiveDocument
    Dim rng1 As Range
    Dim rng2 As Range
    Dim rngB As Range
    Dim RePaintText As Variant
    Dim RePaintArtNr As Variant
    Dim i As Long
    Dim bFound As Boolean

    RePaintText = Array("Pos.", "Warenwert", "Art.-Nr.", "Bezeichnung" _
                      , "Menge ME", "Preis", "Total", vbTab, Chr(32))
    RePaintArtNr = Array("077.0087", "077.0086")
    On Err GoTo ErrHdlg
    Application.ScreenUpdating = False
    Set rng1 = doc.Range
    ClearFindnReplace
    If rng1.Find.Execute(FindText:="Pos.") Then
        Do
            Set rng2 = doc.Range(rng1.End, doc.Range.End)
            If rng2.Find.Execute(FindText:="Warenwert") Then
                Set rngB = doc.Range(rng1.End, rng2.Start)
                rngB.HighlightColorIndex = wdBlack
            End If
        Loop Until rng1.Find.Execute = False
    End If
    Options.DefaultHighlightColorIndex = wdYellow
    Set rng1 = doc.Range
    ClearFindnReplace
    With rng1.Find
        For i = LBound(RePaintText) To UBound(RePaintText)
            .Text = RePaintText(i)
            .Font.Bold = True
            .MatchWholeWord = True
            .Replacement.Highlight = True
            .Execute Replace:=wdReplaceAll
        Next i
    End With
    Set rng1 = doc.Range
    ClearFindnReplace
    With rng1.Find
        For i = LBound(RePaintArtNr) To UBound(RePaintArtNr)
            .Text = RePaintArtNr(i)
'            .Font.Bold = True
            .MatchWholeWord = True
            .Replacement.Font.DoubleStrikeThrough = True
            .Execute Replace:=wdReplaceAll
        Next i
    End With
    Set rng1 = doc.Range
    ClearFindnReplace
    Selection.Find.Font.DoubleStrikeThrough = True
    Do
        With rng1.Find
            .Font.DoubleStrikeThrough = True
            .Format = True
            .Wrap = wdFindContinue
            .Execute
            If .Found Then
                bFound = True
                If rng1.Information(wdWithInTable) = True Then
                    Set rng2 = rng1.Tables(1).Rows(rng1.Information(wdStartOfRangeRowNumber)).Range
                    rng2.Font.DoubleStrikeThrough = False
                    rng2.HighlightColorIndex = wdYellow
                  Else
                    Set rng2 = doc.Range(rng1.Start, doc.Range.End)
                    Set rngB = rng1
                    rngB.Expand wdParagraph
                    If rng2.Find.Execute(FindText:="EUR", MatchCase:=True) Then
                        Set rngB = doc.Range(rngB.Start, rng2.End)
                        rngB.Font.DoubleStrikeThrough = False
                        rngB.HighlightColorIndex = wdYellow
                    End If
                End If
              Else
                bFound = False
            End If
        End With
    Loop Until bFound = False
    Exit Sub
ErrHdlg:
    MsgBox Err.Number & "   -   " & Err.Description
End Sub

Sub ClearFindnReplace()
    With Selection.Find
       .ClearFormatting
       .Replacement.ClearFormatting
       .Text = ""
       .Replacement.Text = ""
       .Forward = True
       .Wrap = wdFindStop
       .Format = False
       .MatchCase = False
       .MatchWholeWord = False
       .MatchWildcards = False
       .MatchSoundsLike = False
       .MatchAllWordForms = False
    End With
End Sub
Ein paar Erklärungen
RePaintText ist jetzt nur für die Überschriften (incl. Tabulator und Leerzeichen).
RePaintArtNr nur für die Artikelnummern.

Der erste Ersetzungsvorgang ist wie gehabt.

Im zweiten werden die "Überschriften" entschwärzt: Begriffe nur dann, wenn als ganzes Wort gefunden und wenn Formatierung = fett. Damit soll verhindert werden, dass mittendrin irgend ein Wortteil oder ein ganzes Wort, das eigentlich geschwärzt bleiben soll, auch wieder sichtbar wird.

Im dritten Ersetzungsvorgang sind schließlich die Artikelnummern dran. Alle in RePaintArtNr enthaltenen Nummern werden gesucht und doppelt durchstrichen = Erkennungsmerkmal für die letzte Suche.

Im letzten Teil wird nach doppelt durchgestrichenem Text gesucht. Befindet er sich in einer Tabelle, wird die ganze Tabellenzeile entschwärzt. Befindet er sich in einem der Textfelder (oder sonst wo). Wird nach dem nächsten „EUR“ gesucht (ganzes Wort, Großschreibung) und dieser Range entschwärzt.

Damit nicht noch irgendwas von vorherigen Ersetzungsvorgängen eingestellt ist, wird vor jedem Ersetzen alles auf Null gesetzt (Sub ClearFindnReplace).

Sollte funktionieren.

Risiken:
  • Wenn im Dokument (warum auch immer) geschachtelte Tabellen auftauchen, endet das Entfärben der Tabellenzeile in einem Fehler. Ebenso bei verbundenen Zellen - aber beides kann ich mir nicht wirklich vorstellen.
  • Sollte (wieder warum auch immer) nach einer gefundenen Artikelnummer kein „EUR“ gefunden werden, landest du in einer Endlosschleife. Wie du da rauskommst weißt du sicher. Sollte ein „Eur“ oder „€“ statt des „EUR“ verwendet werden, wird „EUR“ nicht gefunden. Da muss du dann selbst mal gucken ob die Suche so reicht.
Ich würde mir – wenn ich weiß wie lange der Ein-/Entfärbevorgang normalerweise dauert – zusätzlich einen Timer einbauen, der nach Überschreiten der Dauer + x das Programm automatisch beendet.

Ob nun wirklich alle Eventualitäten aufgefangen werden ? Bin gespannt ...

MM
Miss Marple
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1568
Registriert: 24. Jan 2014, 08:13
Wohnort: 52° 15' 53" N, 10° 31' 26" E

Vorherige

Zurück zu Word Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast