Word-Makro

Ein Bekannter hat in zahlreichen Verzeichissen Word-Dokumente, deren E-Mailadressen bzw Fax-Nummern alt sind und erneuert gehören.

Es handelt sich dabei um einige hundert DOKS. Händisch: zu vergessen…

Wie könnte so ein Makro aussehen?

Folgende Aufgaben stellen sich:

  1. Alle Word-Dokumente eines Verzeichnissen öffnen
  2. Suchbegriffe (max Mail und FaxNr) gegen aktuelle Daten ersetzen
  3. DOK speichern und schließen

Kleines Problem noch: die alten FaxNrn wurden unterschiedlich geschrieben (mit und ohne Leerzeichen, Schrägstrich etc)

Bitte - wenn möglich - schon ein fertiges Modul als Antwort, denn mit Word-Makros habe ich nix am Hut!

Vielen Dank!
Peter

hallo peter,

  1. woher kriegt word denn die aktuellen nummern und adressen?

  2. die dateien sind doch sicher nach gusto benannt, oder?

ich lasse mich gerne eines besseren belehren, aber ich behaupte, es gibt keine möglichkeit, eine zuverlässige zuordnung herzustellen.

daher mein rat: auf die sommerferien warten und eine ferienhilfe einstellen, die diese aufgabe „mit hirn“ erledigt.

gruß,
i.

Zu Deinen Fragen:

hallo peter,

  1. woher kriegt word denn die aktuellen nummern und adressen?

Es gibt EINE neue eMail-Adresse, die einfach hardcodiert wird, gleiches gilt für die FaxNr. Einzig beim SUCHEN muss nach unterschiedlichen Schreibweisen der FaxNr gesucht werden - sollte aber mit TRIM usw klappen

  1. die dateien sind doch sicher nach gusto benannt, oder?

Die Dateinamen enden alle mit *.DOC - das genügt!

ich lasse mich gerne eines besseren belehren, aber ich
behaupte, es gibt keine möglichkeit, eine zuverlässige
zuordnung herzustellen.

daher mein rat: auf die sommerferien warten und eine
ferienhilfe einstellen, die diese aufgabe „mit hirn“ erledigt.

Es geht sicher zu automatisieren - und für einen Kenner des Word-VBA auch gar nicht mal so schwer.

gruß,
i.

DANKE für Deine ANtwort!
Peter

Hallo, Peter!

  1. woher kriegt word denn die aktuellen nummern und adressen?

Es gibt EINE neue eMail-Adresse, die einfach hardcodiert wird,
gleiches gilt für die FaxNr. Einzig beim SUCHEN muss nach
unterschiedlichen Schreibweisen der FaxNr gesucht werden -
sollte aber mit TRIM usw klappen

Ah so. Also quasi so was wie die Daten in einer Kopfzeile. Du willst also „[email protected]“ in „[email protected]“ tauschen? Nicht suchen nach „E-Mail:“ und das folgende in „[email protected]“ ändern?

  1. die dateien sind doch sicher nach gusto benannt, oder?

Die Dateinamen enden alle mit *.DOC - das genügt!

Stimmt auch. Soll rekursiv in Unterverzeichnissen gesucht werden?

Es geht sicher zu automatisieren - und für einen Kenner des
Word-VBA auch gar nicht mal so schwer.

Wenn Du, wie ich vermute, einen Text durch einen anderen austauschen willst, sollte das in der Tat funktionieren; bei den Faxnummern sollte man versuchen, mit regulären Ausdrücken zu arbeiten, und das wirdein wenig komplizierter.

Gruß, Manfred

Hallo Peter,
ich hab so ein Makro, das in allen *.DOC in einem Verzeichnis
Strings ersetzen kann.
Aber ich hab das im Dienst und komme erst am Montag ran.

Ich schick mir jetzt selbst eine Erinnerungsmail an meine Dienst-Addy.

Frage: Liegen die Mailadressen als Hyperlink vor?

Dann weiss ich nämlich nicht ob das funktioniert.

Anmerkung: Ich hab das Makro seinerzeit gemacht um nach einer Wahl
den Namen des Oberbürgermeisters in allen Dokumentvorlagen auszutauschen.

Also bis Montag

Ullrich Sander

Das macht Hoffnung - super, da warte ich doch gerne :wink:

Ob Hyperlink oder nicht, kann ich nicht sagen. Aber dieses Problem könnte man im Vorfeld sicher auch noch beseitigen!

Super - freue mich schon - danke
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter,
ich habe ein Modul, mit dem ich mehrere Texte eines Verzeichnisses nach Einträgen sytematisch durchforsten kann bezüglich der variablen Fax-Nummer erweitert. Die Suche nach der Fax-Nummer beruht darauf, dass nach dem Text unmittelbar vor der Fax-Nummer gesucht wird. Die alte Nummer selber wird dann auf Basis zulässiger Zeichen ermittelt und ersetzt. Folgende Schreibweisen werden z.B. erkannt:

 +49 (1234) 123-4444
 +49 (0)1234 1234444
 (01234) 1212 - 4444
 01234 / 1212 – 4444

Sub eMail\_FaxNr\_ersetzen()
'
 Application.ScreenUpdating = False
 InputTitel = "e-mail-Adresse und Fax-Nummer ersetzen"

 '==============Nachfolgende Zeilen ggf. an eigene Bedürfnisse Anpassen=======
 InputPrompt = "Neue e-mail-Adresse"
 InputVorgabe = "[email protected]"
 emailNeu = InputBox(InputPrompt, InputTitel, InputVorgabe)
 If emailNeu = "" Then Exit Sub

 InputPrompt = "Alte e-mail-Adresse"
 InputVorgabe = "[email protected]"
 emailAlt = InputBox(InputPrompt, InputTitel, InputVorgabe)
 If emailAlt = "" Then Exit Sub

 InputPrompt = "Welches Wort steht immer unmittelbar vor der Fax-Nummer?" & Chr$(10)
 InputPrompt = InputPrompt & "z.B. 'Fax: '"
 InputVorgabe = "Fax"
 WortVorFaxNr = InputBox(InputPrompt, InputTitel, InputVorgabe)
 If WortVorFaxNr = "" Then Exit Sub

 InputPrompt = "Neue Fax-Nummer?"
 InputVorgabe = "+49 (1234) 222-4444"
 FaxNeu = InputBox(InputPrompt, InputTitel, InputVorgabe)
 If FaxNeu = "" Then Exit Sub
 '============== Ende ggf. anzupassender Zeilen =======

 InputPrompt = "Suchschema, das bei der Auswahl der Dokumente verwendet werden soll?"
 InputVorgabe = "\*.DOC"
 Schema = InputBox(InputPrompt, InputTitel, InputVorgabe)
 If Schema = "" Then Exit Sub

' Im nachfolgend angezeigten Dialog muß eine Datei in dem Verzeichnis geöffnet werden
 ' in dem sich die Dateien befinden, deren Daten geändert werden sollen.
 With Dialogs(wdDialogFileOpen)
 .Show
 If .Name = "" Then Exit Sub 'keine Datei ausgewählt
 End With
 Pfad = ActiveDocument.Path
 ActiveDocument.Close

' Anlegen der Datei für Fehlerreport bei Faxnummern
 Documents.Add Template:= \_
 "C:\Programme\Microsoft Office\Vorlagen\Normal.dot", NewTemplate:=False
 Selection.TypeText Text:= \_
 "Dateien mit Problemen bei Änderung der Faxnummer im Verzeichnis"
 Selection.TypeParagraph
 Selection.TypeText Text:=Pfad
 Selection.TypeParagraph
 Selection.TypeText Text:="Datei" & vbTab & "gefundene Faxnummer"
 Selection.TypeParagraph
 Selection.MoveUp Unit:=wdLine, Count:=1
 Selection.MoveDown Unit:=wdLine, Count:=2, Extend:=wdExtend
 Selection.ParagraphFormat.TabStops.ClearAll
 ActiveDocument.DefaultTabStop = CentimetersToPoints(1.25)
 Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(7), \_
 Alignment:=wdAlignTabLeft, Leader:=wdTabLeaderDots
 Selection.MoveRight Unit:=wdCharacter, Count:=1
 Fehlerdatei = ActiveDocument.Name
'
' Die Vorbereitungen sind abgeschlossen. 
' 
 Dokument = Dir(Pfad & "\" & Schema) ' Erstes Dokument abrufen.
 On Error GoTo FehlerOeffnen
 Do While Dokument "" ' Schleife beginnen.
 Documents.Open FileName:=Dokument
' Einstellung der Dokument-Ansicht für Suchen/Ersetzen setzen
 If ActiveWindow.View.SplitSpecial wdPaneNone Then
 ActiveWindow.Panes(2).Close
 End If
 If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. \_
 ActivePane.View.Type = wdOutlineView Or ActiveWindow.ActivePane.View.Type \_
 = wdMasterView Then
 ActiveWindow.ActivePane.View.Type = wdPageView
 End If
' Im Hauptdokument e-mail-Adresse ersetzen
 Selection.HomeKey Unit:=wdStory
 Selection.Find.ClearFormatting
 Selection.Find.Replacement.ClearFormatting
 With Selection.Find
 .Text = emailAlt
 .Replacement.Text = emailNeu
 .Forward = True
 .Wrap = wdFindContinue
 .Format = False
 .MatchCase = False
 .MatchWholeWord = False
 .MatchWildcards = False
 .MatchSoundsLike = False
 .MatchAllWordForms = False
 End With
 Selection.Find.Execute Replace:=wdReplaceAll
' In Kopf- und/oder Fusszeile e-mail-Adresse ersetzen
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
 Selection.Find.Execute Replace:=wdReplaceAll
 If Selection.HeaderFooter.IsHeader = True Then
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
 Else
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
 End If
 Selection.Find.Execute Replace:=wdReplaceAll
 ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
 Selection.HomeKey Unit:=wdStory
' Im Hauptdokument Fax-Nummer ersetzen
 With Selection.Find
 .Text = "Fax"
 .Replacement.Text = ""
 .Forward = True
 .Wrap = wdFindContinue
 .Format = False
 .MatchCase = False
 .MatchWholeWord = False
 .MatchWildcards = False
 .MatchSoundsLike = False
 .MatchAllWordForms = False
 End With
 Do Until Selection.Find.Execute = False
 Call FaxNrAltErmitteln(FaxNeu, Fehlerdatei)
 Loop
' In Kopf- und/oder Fusszeile Fax-Nr ersetzen
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
 Do Until Selection.Find.Execute = False
 Call FaxNrAltErmitteln(FaxNeu, Fehlerdatei)
 Loop
 If Selection.HeaderFooter.IsHeader = True Then
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
 Else
 ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
 End If
 Do Until Selection.Find.Execute = False
 Call FaxNrAltErmitteln(FaxNeu, Fehlerdatei)
 Loop
'Datei Speichern und Schließen
 ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
 Selection.HomeKey Unit:=wdStory
 ActiveDocument.Save
 ActiveDocument.Close
 GoTo NaechstesDokument
FehlerOeffnen:
 MsgBox ("Datei" & Dokument & " kann nicht geöffnet werden")
NaechstesDokument:
 Dokument = Dir ' Nächstes Dokument abrufen.
 Loop
 Application.ScreenUpdating = True
End Sub

Sub FaxNrAltErmitteln(FaxNeu, Fehlerdatei)
 I = 0
 Selection.MoveRight Unit:=wdCharacter, Count:=1
 Do
 Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
 I = I + 1
 If I 27 Then
 Faxalt = Selection.Text
 ' Sehr kurze oder überlange Fax-Nummer wurde ermittelt
 ' Dateiname wird in Fehlerdatei eingetragen
 Dokument = ActiveDocument.Name
 Application.Windows(Fehlerdatei).Activate
 Selection.TypeText Text:=Dokument & vbTab & Faxalt
 Selection.TypeParagraph
 Application.Windows(Dokument).Activate
 Else
 If Right(Selection.Text, 1) = " " Then
 Selection.TypeText Text:=Textlinks & FaxNeu & " "
 Else
 Selection.TypeText Text:=Textlinks & FaxNeu
 End If
 End If
End Sub

Das Makro am besten in einem Modul einer neu angelegten Datei speichern und mit einem Makro-Button im Dokument starten.

Gruß
Franz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Peter,
wie versprochen hier die Makros, die zusammen wirken.
bitte alles in ein Modul kopieren und die Einträge in
„Anpassbare Werte“ anpassen.

Ich habs gerade nochmal getestet, es funktioniert!

Wenn Du allerdings mit Passwort schreibgeschützte Dokumente hast
fragt das Makro natürlich nach dem Passwort. Dieses sollte man dann parat haben.

Anmerkung: Das Makro funktioniert auch in Kopf-Fußzeilen.

Viel Erfolg

Ullrich Sander

’ **** Anpassbare Werte ****
Private Const Verzeichnis = „C:\maly\md_R-n\md_R-n\Haus 12\Vorlagen\tmp“
Private Const Filter = „*.dot“
Private Const UnterverzeichnisseDurchsuchen = 1
Private Const Suche = „Ludwig Scholz“
Private Const ErsetzeMit = „Dr. Ulrich Maly“
’ **** Ende der Anpassung ****

Private Teil As Range

Sub maly()
Screenupdate = False
Dim oDoc As Document
tmp = UnterverzeichnisseDurchsuchen
If tmp = 1 Then UVD = True Else UVD = False
If Documents.Count > 0 Then Dokument = ActiveDocument.FullName
With Application.FileSearch
.LookIn = Verzeichnis
.FileName = Filter
.SearchSubFolders = UVD
.Execute SortBy:=msoSortByFileName
Anzahl = .FoundFiles.Count
Application.ScreenUpdating = False
For Each aDok In .FoundFiles
wasProtected = 0
If aDok Dokument Then
On Error Resume Next
Documents.Open aDok
Fehler = Err.Number

On Error GoTo 0
If Fehler = 0 Then
Set oDoc = ActiveDocument

If oDoc.ReadOnly = False Then
If oDoc.ProtectionType wdNoProtection Then
wasProtected = oDoc.ProtectionType
oDoc.Unprotect
End If
StatusBar = "Durchsuche Dokument " + aDok + „.“
DoEvents
SuchenErsetzenSchleife
If wasProtected wdNoProtection Then oDoc.Protect Type:=wasProtected, Noreset:=True
oDoc.Close SaveChanges:=wdSaveChanges
Else
oDoc.Close SaveChanges:=wdDoNotSaveChanges
End If

End If
End If
Next
End With
StatusBar = CStr(Anzahl) + " Dokumente durchsucht."
DoEvents
Application.ScreenUpdating = True
End Sub

Private Sub SuchenErsetzenSchleife()
Application.ScreenUpdating = False
For Each Teil In ActiveDocument.StoryRanges
SuchenErsetzen
While Not (Teil.NextStoryRange Is Nothing)
Set Teil = Teil.NextStoryRange
SuchenErsetzen
Wend
Next
End Sub

Private Sub SuchenErsetzen()
Teil.Find.Execute FindText:=Suche, _
ReplaceWith:=ErsetzeMit, _
MatchCase:=GrossUndKleinSchreibung, _
MatchWholeWord:=GanzesWort, _
MatchWildcards:=Jocker, _
Replace:=wdReplaceAll
End Sub

In einem Abschnitt meines Lösungsvorschlags hatte sich noch ein kleiner Bug eingeschlichen. Folgender Teil ist zu korrigieren:

' Im Hauptdokument Fax-Nummer ersetzen
 With Selection.Find
 .Text = WortVorFaxNr
 .Replacement.Text = ""
 .Forward = True
 .Wrap = wdFindContinue
 .Format = False
 .MatchCase = False
 .MatchWholeWord = False
 .MatchWildcards = False
 .MatchSoundsLike = False
 .MatchAllWordForms = False
 End With

Für das Arbument .Text wurd „Fax“ durch die variable WortVorFaxNr ersetzt.

Gruß
Franz

1 „Gefällt mir“

Hallo Peter,
ich denke Franz und ich warten auf eine Rückmeldung, ob es mit unseren Makros geklappt hat.

Ullrich Sander

Lieber Ullrich,

da ist dann was schief gegangen mit dem mailen. ich habe mich bei Franz und Dir sehr wohl bedankt - auch mit Sternderln!!! ALlerdings habe ich die eine oder andere Mail auch DIREKT an die private Mailadresse geschickt - vielleicht kam ich denn da unter den Spamfilter oder so.

ALSO NOCHMAL IN ALLER ÖFFENTLICHKEIT:
Bei beiden Experten ein herzliches Dankeschön. Ich habe mir nicht träumen lassen, so tolle Antworten/Lösungen in so kurzer Zeit via W-W-W zu erhalten.

Das hat mir (ich wusste es sowieso) und einer Kollegin von mir gezeigt, wie effektiv dieses Medium DANK SEINER EXPERTEN ist!

Eine Rückmeldung bezüglich positivem Einsatz steht noch aus, weil der EDV-Spezialist der Firma, wo das eingesetzt werden soll, dzt auf Urlaub ist. Ohne die wollen sie es nicht probieren.

Wenn es gelaufen ist, werde ich mich nochmals an Euch wenden und Euch informieren - aber nur mehr private Mailadresse - nicht via Forum.

Liebe Grüße
Peter

PS: Franz: Danke noch für das Korrekturposting!

Hallo Peter,
ich denke Franz und ich warten auf eine Rückmeldung, ob es mit
unseren Makros geklappt hat.

Ullrich Sander