Hallo zusammen,
ich habe ein Frage und schaffe es scheinbar nicht, daraus eine gescheite Suchanfrage zu formulieren. Vielleicht kann mir jemand von Euch behilflich sein.
Aber von Vorne:
Ich möchte in WORD (Office 365 unter Windows) lange Texte "bereinigen". Zum Beispiel sollen zwischen Abkürzungen ein schmales umbruchgeschütztes Leerzeichen stehen, zwischen Firmennamen und der Gesellschaftsform ein geschütztes Leerzeichen und so weiter und so fort. Insgesamt umfasst meine Liste gut 50 verschiedene Suchen-und-Ersetzen Ideen. Da sind einige reine Textanweisungen, andere sind mit Platzhaltern.
Ich habe mir dazu zugegebenerweise etwas uninspiriert ein Makro aufgezeichnet. Das sieht so aus:
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " AG"
.Replacement.Text = "^sAG"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Den Codeschnippsel habe ich dann mit veränderten Werten gut 50 × hintereinander in meinem Modul stehen. Soweit ist das auch erstmal gut und zielführend, das Programm macht genau das, was es soll. Die Dauer der Ausführung ist im Grunde nicht messbar. Ein Testdokument mit gut 10.000 Wörtern war in ca. 2 Sekunden abgearbeitet.
Da mir der Code aber wirklich zu hässlich und vor allem aber zu unübersichtlich ist, habe ich den ganzen Block in eine Function gepackt, die so aussieht:
Sub SuchenUndErsetzen(strText As String, strReplace As String, strWildCards As Boolean)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = strText
.Replacement.Text = strReplace
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = strWildCards
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Diese rufe ich nun in einer eigenen Prozedur einfach 50 × hintereinander nach diesem Schema auf:
SuchenUndErsetzen "(<*[!(d|D)ie]) AG", "\1^sAG", True
Obwohl sich für mein bescheidenes Verständnis im Grunde nichts verändert hat, dauert die Ausführung dieser Variante bei gleichem Text weit über 3 Minuten.
Weiß jemand von Euch, an welcher Stelle ich kapitalen Bockmist veranstaltet habe? Obwohl mein Quick-and-Dirty Spaghetticode eigentlich klaglos läuft, hat mich doch die Neugierde gepackt.
In Voraus ein ganz großes Danke für jede Mithilfe.
Herzliche Grüße aus dem Rheinland
Peter
|