PDA

Vollständige Version anzeigen : Automatische Änderungen möglich?


oliver74
27.08.2019, 17:41
Hallo liebe Community,

folgende Frage habe ich:

Ich habe große Dokumentenmengen in Word-Dokumenten mit Übungsaufgaben, Fällen und Klausuren, die Preisangaben und Jahreszahlen enthalten.

Die Jahreszahlen treten in zwei Varianten auf:

Jahreszahlen, die unverändert im Sachverhalt bleiben (zurzeit farbig X markiert, z.B. eine Gerichtsentscheidung)
Jahreszahlen, die jährlich um ein Jahr verändert werden müssen, damit die Übungsaufgabe nicht überaltet aussieht. Diese Jahreszahlen sind auch farbig markiert (Farbe Y). Es handelt sich dabei um verschiedene Jahre, d.h. nicht nur 2019, sondern es werden diverse Jahre der Vergangenheit genannt.


Bisher hat ein Schüler die Jahreszahlen manuell um ein Jahr "weitergeschrieben",d.h. aus 2018 dann 2019 gemacht. Durch die farbige Markierung kam er mehr oder weniger schnell durch den Text.
"Suchen, ersetzen" funktionierte nicht, da nicht erkennbar ist, welche Jahreszahlen genau im Text vorkommen. Dies variiert von Dokument zu Dokument, so dass wahllos von 2019 - 1980 jedes Jahr im Dokument gesucht und ersetzt werden müsste, obwohl z.B. nur 1992, 1999 und 2007 genannt sind.

Meine Überlegung ist, ob man einer Jahreszahl ein "Merkmal" mitgeben kann und diesem Merkmal dann den Befehl gibt, ein Jahr dazu zuzählen.

Fällt euch dazu etwas ein?

Vielen Dank!
Oliver

Gerhard H
27.08.2019, 20:28
Hallo oliver,

ich würde das schon mit Suchen und Ersetzen angehen, aber da die Zahlen immer verschieden sein können und da mit ihnen addiert werden muss, geht das nur per Makro.

Im folgenden Makro (erst mal nur für 1 Dokument) wird davon ausgegangen, dass das kennzeichnende rote X unmittelbar nach der zu ändernden Jahreszahl folgt. Wenn nicht, muss das Makro geändert werden. Das würde dann so aussehen:
Sub suchdieZahlMitX()
Dim suchBereich As Range, fundBereich As Range
Dim fundZahl As Variant

Set suchBereich = ActiveDocument.Range

With suchBereich.Find
.MatchWildcards = True

'Textstellen mit beliebigen vierstelligen Zahlen, gefolgt von "X" suchen
.Text = "[0-9]{4}X"

Do While .Execute
'gefundene Zahl um x vermindern, 1 draufaddieren und ins Dokument einsetzen
Set fundBereich = suchBereich
fundZahl = CInt(Left(fundBereich.Text, Len(fundBereich.Text) - 1)) + 1
fundBereich.Text = fundZahl

'Rest-Suchbereich definieren
suchBereich.SetRange Start:=fundBereich.End, End:=ActiveDocument.Range.End
Loop
End With
End Sub
Dieses Makro ist im angehängten Beispiel enthalten

oliver74
27.08.2019, 22:37
Hallo Gerhard,
vielen Dank für Deine schnelle Nachricht. Da hab ich mich leider mit X und Y unklar ausgedrückt.

Gemeint ist folgendes:
Die Jahreszahlen, die verändert werden müssen, sind farblich markiert..rot z.B.
die Jahreszahlen, die nicht verändert werden dürfen, sind pink. X und Y waren nur Bezeichnungen für die Farbe.

Im Ergebnis heisst das, dass es kein X hinter den Jahreszahlen gibt, sondern das einzige Kennzeichen für (+1) oder (nicht verändern) ist die unterschiedliche Farbe.

Sorry, wenn ich für Verwirrung gesorgt habe,

Oliver

Gerhard H
28.08.2019, 06:41
Hallo Oliver,

da hatte ich offenbar schlampig gelesen. Also: Gesucht werden ausschließlich rote vierstellige Zahlen? Handelt es sich um Schriftfarbe, Hintergrundfarbe oder Highlightfarbe? Im Zweifelsfall bitte ein Musterdokument hochladen.

halweg
28.08.2019, 08:12
Wäre es nicht einfacher, alle Jahreszahlen als Felder auszuführen, die sich am aktuellen Jahr orientieren und dann ggf. noch eine Differenz dazurechnen.
Die farbliche Kennzeichnung könnte dann helfen, sie weiterhin als variabel oder fest zu erkennen.

oliver74
28.08.2019, 08:52
Hallo und guten Morgen,
es handelt sich um Schriftfarbe, mit denen die Jahreszahlen markiert sind.
Da ich erst morgen wieder im Büro bin, würde ich morgen ein Testdokument hochladen.

@halweg: Das war auch mein erster Gedanke: Jeder Zahl ein Merkmal mitzugeben (in Word offenbar: Feld), um damit dann automatisiert weiter arbeiten zu können. Ich bin mit Felder aber zugegebenermaßen nicht gut vertraut.

Danke und beste Grüße,
Oliver

halweg
28.08.2019, 09:08
So ein Feld könnte z. B. so aussehen:
{= {DATE \@ "yyyy"} - 3}

In diesem Fall würde also immer die Jahreszahl von vor drei Jahren angezeigt ("2016").
Die {} Klammerpaare fügst du nicht mit der entsprechend Taste sondern über STRG+F9 ein, damit sie als Felder erkannt werden.

Ich finde diese Verfahren deutlich einfacher und übersichtlicher als jedes Mal manuell die Jahreszahlen über Suchen-Ersetzen zu ändern (was natürlich auch gehen würde).

Gerhard H
28.08.2019, 09:22
Hallo zusammen,

ich hab es so verstanden, dass es um einen Haufen bereits existierender Dokumente geht, daher die Idee, es per Makro zu lösen.

Hier die Variante für roten Schriftfarbe. Bei dem Rot handelt es sich um eine Standardfarbe, d.h. gewählt aus der Schaltfläche Schriftfarbe, untere Reihe. Das Makro bezieht sich vorläufig nur auf 1 (das aktive) Dokument:
Sub suchdieRoteZahl()
Dim suchBereich As Range, fundBereich As Range
Dim fundZahl As Variant

Set suchBereich = ActiveDocument.Range

With suchBereich.Find
.MatchWildcards = True

'Textstellen mit roten vierstelligen Zahlen suchen
.Text = "[0-9]{4}"
.Font.ColorIndex = wdRed

Do While .Execute
'auf gefundene Zahl 1 draufaddieren und ins Dokument zurückschreiben
Set fundBereich = suchBereich
fundZahl = CInt(fundBereich.Text) + 1
fundBereich.Text = fundZahl

'Rest-Suchbereich definieren
suchBereich.SetRange Start:=fundBereich.End, End:=ActiveDocument.Range.End
Loop
End With
End Sub

oliver74
29.08.2019, 21:47
Hallo Gerhard,
vielen Dank für Deine Idee mit dem Makro. In Deinem Testdokument hat es genauso geklappt, wie es sollte.
Ich füge ein Testdokument bei, das neben den roten Zahlen auch noch pinke Zahlen und schwarze Zahlen enthält, die nicht geändert werden sollen.

In Deinem Makro gibt es die Zeile: ActiveDocument.Range . Wie würde der Befehl lauten, wenn das Makro über mehrere .dokx-Dokumente laufen soll, die alle in einem Ordner liegen?

Ich befürchte, ich muss noch einmal die große Makro-Schulung besuchen....

Danke für Deine Hilfe!

Oliver

derHoepp
30.08.2019, 06:52
Hallo und guten Morgen,

ich würde ähnlich wie halweg Vorgehen und auf möglichst viel VBA-Verzichten. Statt des Bezugs auf DATE würde ich eine DocVariable "Ausgangsjahr" anlegen:
Option Explicit

Sub AusgangsjahrAnlegen()
Me.Variables.Add "Ausgangsjahr", 2013
End Sub

Sub AusgangsjahrFestlegen()
Me.Variables("Ausgangsjahr").Value = 2016
End Sub

Dann ersetzt du alle roten Jahresangaben durch ein Word-Feld, in dem du den Abstand zum Ausgangsjahr einfach addierst. Für 2019 bei einem Ausgangsjahr von 2013 also:
{ ={ DOCVARIABLE Ausgangsjahr} + 6}
(Geschweifte Klammern nicht eintippen, sondern Felder mit Strg+F9 erstellen)
Das Ausgangsjahr kann natürlich auch ein ASK-Feld sein.

Viele Grüße
derHöpp

Gerhard H
30.08.2019, 09:20
Hallo Oliver,

eine Frage vorab: Es ist doch egal, ob noch anders gefärbte Jahreszahlen im Dokument sind; geändert werden doch eh nur die roten? Oder warum betonst du das so mit den pinken Zahlen? Hab ich was falsch verstanden?

Wenn das bisherige Makro aber tut was es soll, aber auf mehrere Dateien angewendet werden soll, müssen diese halt nacheinander aufgerufen werden.

Kopiere dazu das folgende Opus in ein Modul deiner Normal.dotm und starte dann die Sub DateienAbklappern().
Dim fso As Object, suchOrdner As Object, datei As Object
Dim zielDoku As Document

Sub DateienAbklappern()
Dim pfad As String

'Ordner ansteuern
pfad = "C:\temp\" '**anpassen, letzten Backslash nicht vergessen!
Set fso = CreateObject(class:="scripting.fileSystemObject")
Set suchOrdner = fso.GetFolder(pfad)

'jede Word-Datei im Ordner öffnen
For Each datei In suchOrdner.Files
If fso.GetExtensionName(datei) Like "doc*" Then
Set zielDoku = Documents.Open(pfad & datei.Name)

'Bearbeitungsmakro aufrufen
RoteZahlenBearbeiten
End If
Next datei
End Sub

Private Sub RoteZahlenBearbeiten()
Dim suchBereich As Range, fundBereich As Range
Dim fundZahl As Variant

Set suchBereich = zielDoku.Range
With suchBereich.Find
.MatchWildcards = True

'Textstellen mit roten vierstelligen Zahlen suchen
.Text = "[0-9]{4}"
.Font.ColorIndex = wdRed

Do While .Execute

'auf gefundene Zahl 1 draufaddieren und ins Dokument zurückschreiben
Set fundBereich = suchBereich
fundZahl = CInt(fundBereich.Text) + 1
fundBereich.Text = fundZahl

'Rest-Suchbereich definieren
suchBereich.SetRange Start:=fundBereich.End, End:=ActiveDocument.Range.End
Loop
End With

'bearbeitetes Dokument speichern und schließen
zielDoku.Close savechanges:=True
End Sub

Es wird ein ziemliches Geflackere geben, was man vielleicht noch unterdrücken kann, oder eben einfach so lang wegschauen.

@Halweg und DerHöpp:
Ich versteh bei so einem Vorhaben euren Horror vor (zu viel) VBA nicht. Was ist euer Motiv?

halweg
30.08.2019, 09:40
@Gerhard: Auch für mich ist Alt-F11 inzwischen fast zum Reflex geworden. Nur hier im Forum bin ich zurückhaltender, weil es eben dazu führen kann, dass jemand "fremde" Makros nutzt, die er im Zweifelsfall nicht warten kann.

Im konkreten Fall scheint der Einsatz von Feldern einfach das bessere und naheliegendere Konzept zu sein. Damit müssen die Dokumente nicht immer wieder mit einem Makro (was vielleicht nicht jeder bedienen/warten kann) angepasst werden. Stattdessen erscheinen an den entsprechenden Stellen direkt die richtigen Jahreszahlen.

oliver74
02.09.2019, 14:38
Hallo und herzlichen Dank für eure Hilfen.
ich schaue mir die Variante mit den Feldern einmal intensiver an und werde mich einmal tiefer in Makros einarbeiten müssen. Da hakt es noch ziemlich.

Das Thema setze ich auf erledigt.

Vielen Dank!
Oliver