Fußzeile von Doks durchsuchen u. Dateiname auflist

Hallo zusammen,

brauche dringend Eure Hilfe.

  1. Es müssten verschiedene Word-Dateien (doc und dot) eines bestimmten Ordners einschl. der Unterordner nach einem bestimmten Eintrag in der Fußzeile durchsucht werden.

Wird der entsprechende Eintrag gefunden soll aus den ganzen gefundenen Dateinamen eine Liste erstellt werden.

  1. Als 2. Variante müsste die vorhandene Fußzeile komplett gelöscht und durch eine neue Fußzeile welche als AutoText vorliegt ersetzt werden.

Ich besitze leider nur geringe Kenntnisse in VB und wäre deshalb für eine Unterstützung sehr dankbar.

Viele Grüße und vielen Dank im voraus.
Franz

Dateien auflisten, Fußzeile ersetzen
Hallo Franz,

  1. Es müssten verschiedene Word-Dateien (doc und dot) eines
    bestimmten Ordners einschl. der Unterordner nach einem
    bestimmten Eintrag in der Fußzeile durchsucht werden.

Alt+F11, links in der Liste markierst du
Projekt(Dokumentname)
dann Einfügen—Modul
Dortrein den nachstehenden Code kopieren.
Über Extras—Verweise den Verweis auf Microsoft Scripting Runtime setzen.
Im Code erkennst du leicht zweimal den Eintrag:
C:\test
den mußt du jeweils durch dein Verzeichnis ersetzen.

Editor schließen.
In Word dann das Makro Dateilisten ausführen lassen mit Alt+F8…

Während es läuft kannst du es wenn es zu lange dauert mit Strg+Puse abbrechen/beenden, ggfs. mehrmals probieren.

Das Makro listet erstmal untereinander alle gefunden Docs und Dots auf
Gefundene Fußzeilen werden jeweils angezeigt.
Mich interessiert erst mal ob es durchläuft und ob es alles wie gewünscht anzeigt.

Gruß
Reinhard

Option Explicit
'
Sub Dateilisten()
' Achtung!
' --\> Microsoft Scripting Runtime - Verweis notwendig!
Dim Zei As Long, Datei
Application.ScreenUpdating = False
For Each Datei In GetFiles("C:\test", True, "\*.doc")
 Documents.Open Datei.Path
 With ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary)
 If .Range.Text vbCr Then
 MsgBox ActiveDocument.Name & Chr(10) & .Range.Text
 End If
 End With
 Documents(Datei.Name).Close savechanges:=False
 Selection.TypeText Text:=Datei.Path
 Selection.TypeParagraph
Next
For Each Datei In GetFiles("C:\test", True, "\*.dot")
 Documents.Open Datei.Path
 With ActiveDocument.Sections(1).Footers(wdHeaderFooterPrimary)
 If .Range.Text vbCr Then
 MsgBox ActiveDocument.Name & Chr(10) & .Range.Text
 End If
 End With
 Documents(Datei.Name).Close savechanges:=False
 Selection.TypeText Text:=Datei.Path
 Selection.TypeParagraph
Next
Application.ScreenUpdating = True
End Sub
'
Public Function GetFiles(FolderPath As String, scanSubDirectorys As Boolean, Optional \_
SearchPattern As String) As Collection
Dim objFs As Object 'As New FileSystemObject
Dim objRootFolder As Object 'As Folder
Dim objSubFolder As Object 'As Folder
Dim objFile As Object 'File
Dim HColl As New Collection
Set HColl = Nothing
Set objFs = CreateObject("Scripting.FileSystemObject")
If SearchPattern = "" Then SearchPattern = "\*"
On Error GoTo err01
Set objRootFolder = objFs.GetFolder(FolderPath)
err01:
If Err.Number 0 Then
 Set GetFiles = HColl
 Exit Function
End If
For Each objFile In objRootFolder.Files
 If objFile.Name Like SearchPattern Then
 HColl.Add objFile
 End If
Next
If scanSubDirectorys Then
 For Each objSubFolder In objRootFolder.SubFolders
 For Each objFile In GetFiles(objSubFolder.Path, scanSubDirectorys, SearchPattern)
 HColl.Add objFile
 Next
 Next
End If
Set GetFiles = HColl
End Function

Hallo Reinhard,

vielen Dank vorerst für Deine Mühe.

Ich kann erst am Montag (hatte heute einen Arzttermin) einen Testlauf durchführen.

Ich melde mich dann nochmals.

Ein schönes Wochenende wünscht Dir
Franz

Hallo Franz,

vielen Dank vorerst für Deine Mühe.

gerne.

Ich melde mich dann nochmals.

Das wäre gut. Ich erklär mal warum es wichtig ist daß DU den Code ausgiebig testest.

Sicher, ich habe auch Verzeichnisse wo Docs drin stehen, wie z.B. C:\test bei mir.
Aber, viele davon sind ExperimentierDateien mit Makros drin die beim Öffnen loslegen und Eigenleben entwickeln.

D.h., wenn ICH das bei mir teste läuft der Code nie durch, irgendeine andere Doc schafft es mit ihrem Öffnungsmakro das zu sabotieren, bis hin daß die Doc in der ich meinen Code gestartet habe im Nirwana verschwindet und ich sie erst mühsam wiederherstellen muß.

Bei dir vermute ich, daß du nur Makrofreie Docs hast, dann tritt das nicht auf.

Deshalb teste es zuerst mal so, daß du in den beiden MSG-Codezeilen einfach ein Hochkomma davor setzt, dann wird sie nicht angezeigt.

Dann das makro starten, nun müßten alle docs, dots aufgelistet werden.

Jetzt zu den Fußzeilen. Bei der Codeentwickulung habe ich festgestellt, daß Word irgendwie??? mehrere Fußzeilen „kennt“
Das „kenn“ ich wiederum nicht :smile:))
K.A. ob das „mehrere“ bezogen ist pro Druckseite, Anschnitt, Section oder sonstwas:frowning:

PS: Wenn ein Mitlesender mir das bitte mal kurz und verständlich erläutern könnte was das bedeutet daß Word mehere Fußzeilen kennt, dankeschön.

Insofern laße ich einstweilen über die Msgbox die Erste Fußzeile ausgeben, damit du prüfen kannst ob das die richtige ist.

Also teste mal und berichte, auf diesen Bericht bin ich angewiesen um den Code weiterzueuntwickeln.

Gruß
Reinhard

Hallo Reinhard,

Jetzt zu den Fußzeilen. Bei der Codeentwickulung habe ich festgestellt, daß Word irgendwie??? mehrere Fußzeilen „kennt“ K.A. ob das „mehrere“ bezogen ist pro Druckseite, Anschnitt, Section oder sonstwas:frowning:

Right.

Word kennt für jede Section drei Fußzeilen: ErsteSeite, Gerade, Ungerade (hab hier kein Word, daher kann ich die Literalkonstanten nicht nachschlagen). Aber es geht total lustig damit um.

  1. Nimm an, Du hättest ein einseitiges Dokument mit einem Abschnitt. Dann hakst Du bei Datei > SeiteEinrichten an „erste Seite anders“ und „gerade/ungerade Seite anders“. Wenn Du nicht am Dokumentende zwei neue Seiten erzwingst (so daß das Dokument dreiseitig wird), kannst Du in Word auf die Kopfzeilen nicht zugreifen. Du wirst stets nur die erste Kopfzeile (die ja meist anders ist als die Kopfzeilen vom Rest) sehen. In VBA kannst Du aber (glaub) auf die zwei „unsichtbaren“ Kopfzeilen zugreifen.

  2. Wenn Du erst die vorerwähnten Häkchen nicht gesetzt hast, hat das Dokument nur eine Kopfzeile. Wenn Du beim Bearbeiten die Häkchen setzst, wird diese Kopfzeile zur Kopfzeile Ungerade. Deshalb heißt die Literalkonstante auch „primary“.

  3. Word-VBA hat ja beim Document die StoryRanges. Vielleicht ist es einfacher, diese zu benutzen, weil die Auflistung (glaub) alle im Dokument vorhandenen Kopf- und Fußzeilen enthält.

Gruß

Markus

Hallo Reinhard,

die Dokumente dürften über keine Makros verfügen. Es wird allerdings beim Start von Word eine Global.dot geladen, in der einige wichtige Einstellungen enthalten sind. Kann ich aber umstellen.

Dass Word mehrere Kopf- und Fußzeilen kennt und man über StoryRange darauf zugreifen kann, habe ich auch irgendwo gelesen.

Ich habe auch in meinen alten VBA-Beispielen gesucht und ein Beispiel von Rene Probst gefunden,
der einen vorgegebenen Text in der Fußzeile durch
einen neuen Text ersetzt und das für alle Word-Dateien eines Verzeichnisses.

Allerdings liegt der auch auf meinen Bürorechner.
Ich poste diesen entweder heute oder morgen. Vielleicht komme ich auch heute noch dazu Deinen Code zu testen.

Einen schönen Sonntag wünscht
Franz

Hallo Reinhard,

hab mich jetzt doch aufgerafft und bin ins Büro gefahren.

Code funktioniert soweit, allerdings werden aus dem jeweiligen Verzeichnis nur die gefundenen dot-Dateien aufgelistet.

Für mein Beispiel müsste konkret nach der Zeichenfolge 09281/409-0
gesucht werden. Diese Zeichenfolge könnte allerdings nicht nur in der Fußzeile sondern auch im Text vorkommen.

Ich poste hier mal den Code den ich gefunden habe und „der eine Zeichenfolge in allen Dokumenten, welche sich im nominierten Verzeichnis befinden ersetzt. Der Code berücksichtigt alle Teile der Dokumente (Story Ranges).“

’ **** Anpassbare Werte ****
Private Const Verzeichnis = „C:\Eigene Dateien“
Private Const Filter = „*.doc“
Private Const UnterverzeichnisseDurchsuchen = 0
Private Const Suche = „Felix Muster“
Private Const ErsetzeMit = „Felix Muster“
’ **** Ende der Anpassung ****

Private Teil As Range

Sub SuchenErsetzenGanzesVerzeichnis()
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
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.ProtectionType = wdNoProtection Then
If oDoc.ReadOnly = False Then
StatusBar = „Durchsuche Dokument " + aDok + „.“
DoEvents
SuchenErsetzenSchleife
oDoc.Close SaveChanges:=wdSaveChanges
Else
oDoc.Close SaveChanges:=wdDoNotSaveChanges
End If
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

Das wäre wahrscheinlich der Code für meinen 2. Punkt, allerdings müsste hier nach der Zeichenfolge gesucht werden und diese wenn sich
die Fundstelle im Text befindet durch eine neue Zeichenfolge ersetzt werden (09281/409-100).Befindet sich die Zeichenfolge jedoch in der Fußzeile müsste das folgende Makro (habe ich so aufgezeichnet!) ausgeführt werden.

Sub AlteFußzeileErsetzen()

If ActiveWindow.View.SplitSpecial wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
ActivePane.View.Type = wdOutlineView Then
ActiveWindow.ActivePane.View.Type = wdPrintView
End If
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
If Selection.HeaderFooter.IsHeader = True Then
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
Else
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
End If
Selection.Extend
Selection.Extend
Selection.Extend
Selection.Delete Unit:=wdCharacter, Count:=1
Selection.TypeParagraph
Selection.TypeText Text:=„Fuß“
Selection.Range.InsertAutoText
Selection.Delete Unit:=wdCharacter, Count:=1

End Sub

Vielen Dank schon mal im voraus.

Noch einen schönen Sonntag wünscht
Franz

Danke für Aufklärung über Word Fußzeilen owT

Hallo Franz,

Code funktioniert soweit, allerdings werden aus dem jeweiligen
Verzeichnis nur die gefundenen dot-Dateien aufgelistet.

verstehe ich nicht, wenn du in Sub Dateilisten schaust, sind doch zwei identische For-each-Schleifen untereinander. Die erste geht alle Doc-Dateien durch, die zweite alle Doc-Dateien durch.

Setzte mal einen Haltepunkt vor die Codezeile des zweiten For-Each.
(Einfach links vom Code auf den grauen Trennbalken klicken, ein schwarzer Punkt erscheint. Auf den Punkt klicken entfernt ihn. Oder haltepunkt oben übers Menü setzen.)

Wenn der Code dann dort stoppt, schau mal ins Dokument, in dem Moment müßten alle gefundenen Docs aufgelistet sein.
Wenn nicht, haste keine oder irgendwas anderes liegt vor.

Für mein Beispiel müsste konkret nach der Zeichenfolge
09281/409-0
gesucht werden. Diese Zeichenfolge könnte allerdings nicht nur
in der Fußzeile sondern auch im Text vorkommen.

Also im Text soll jetzt auch ersetzt werden!?

Ich poste hier mal den Code den ich gefunden habe und „der
eine Zeichenfolge in allen Dokumenten, welche sich im
nominierten Verzeichnis befinden ersetzt. Der Code
berücksichtigt alle Teile der Dokumente (Story Ranges).“

Ich hab ihne nur kurz überflogen. Soll das später alles auch mit Word 2007/2010 laufen muß man ihn sowieso abändern. (FileSearch gibts da ich mehr)

Gruß
Reinhard

Guten Morgen Reinhard,

„verstehe ich nicht, wenn du in Sub Dateilisten schaust, sind doch zwei identische For-each-Schleifen untereinander. Die erste geht alle Doc-Dateien durch, die zweite alle Doc-Dateien durch.“

habe den Fehler gefunden (Schreibfehler von mir!)!

Code läuft durch.

„Also im Text soll jetzt auch ersetzt werden!?“

Im Text muss nicht ersetzt werden, das kriegen wir auch anders hin.

„Ich hab ihne nur kurz überflogen. Soll das später alles auch mit Word 2007/2010 laufen muß man ihn sowieso abändern. (FileSearch gibts da ich mehr)“.

In 2007/2010 muss es nicht laufen. Wir stellen gerade um (soll nächste Woche passieren) und ich könnte das jetzt noch auf den alten Rechner machen lassen.

Viele Grüße
Franz