Beschreibung
Wenn Dokumente mit Inhaltsverzeichnis, Textmarken usw. in Word aktualisiert werden müssen, entdeckt man schnell, dass die einfache Lösung alles zu markieren (STRG-A) und anschließend zu aktualisieren (F9), nicht wirklich alles aktualisiert. Kopf- und Fußzeilen sind von dieser Methoden ausgeschlossen. Außerdem muss anschließend nach fehlerhaften Verweisquellen usw. gesucht werden. Das folgende Makro hilft in diesem Fall weiter. Das Dokument wird vollständig aktualisiert. Wird ein Fehler gefunden, bleibt der Cursor an der entsprechenden Stelle stehen, so dass man das Dokument korrigieren kann.
Das Makro ist in VB.NET geschrieben, kann aber leicht in VBA portiert werden. Bei Fragen, einfach die Kommentarfunktion benutzen.
Damit die Funktion funktioniert, wird darüber hinaus die Funktion fehlerhafte Verweisquellen finden benötigt.

Sourcecode
' Word-Objekt
Public objWord As Microsoft.Office.Interop.Word.Application = Globals.Ribbon_Class.Application
' Dokument aktualisieren und beim Auffinden von fehlerhafte Verweisequellen an der entsprechenden Stelle stehenbleiben
Sub DokumentAktualisieren()
If Len(objWord.ActiveDocument.Name) > 0 Then
Dim bState As Byte
' bState-Werte:
' 0: Initialisierung
' 1: Ansichteinstellungen
' 2: Kopf- und Fußzeilen aktualisieren
' 3: Verzeichnisse aktualisieren
' 4: Fehlerhafte Verweisquellen im Text suchen
' 5: Fehlerhafte Verweisquellen in Kopfzeile suchen
' 6: Fehlerhafte Verweisquellen in Fußzeile suchen
' 7: Wechsel auf letzte Seite
' 8: Keine Fehler gefunden
' 9: Fehler gefunden
' 10: Statemachine beenden
Dim bFoundError As Boolean
Dim iPage As Integer
Dim iCurViewType As Integer
Dim rCurPos As Word.Range
Dim bShowRevisionsAndComments As Boolean
Dim bRevisionsView As Byte
Dim bMaxState As Byte
bMaxState = 10
bState = 0
rCurPos = objWord.Selection.Range
While bState >= 0 And bState <= bMaxState
Select Case bState
Case 0
' Initialisierung
Try
' Variablen initialisieren
bFoundError = False
iPage = 1
' Bildschirmaktualisierung abschalten
objWord.Application.ScreenUpdating = False
' Aktuelle Postion zwischenspeichern
rCurPos = objWord.Selection.Range
' Aktuelle Einstellung der Anzeige von Änderungsmarkierungen zwischenspeichern
With objWord.ActiveWindow.View
bShowRevisionsAndComments = .ShowRevisionsAndComments
bRevisionsView = .RevisionsView
End With
' In Zustand "Ansichteinstellungen" wechseln
bState = 1
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' Funktion beenden und nicht in letzten Zustand springen, da die nötigen Variablen evtl. nicht initialisiert wurden
Exit Sub
End Try
Case 1
' Ansichteinstellungen
Try
With objWord.ActiveWindow
' Ansicht prüfen und gegebenenfalls wechseln (betrifft aufgesplittete Darstellung)
If .View.SplitSpecial <> wdPaneNone Then
.Panes(2).Close()
End If
With .ActivePane.View
' Ansicht zwischenspeichern
iCurViewType = .Type
If (.Type = wdNormalView Or _
.Type = wdOutlineView) Then
.Type = wdPrintView
End If
' Darstellung der Änderungsmarkierungen abschalten und auf Endgültige Darstellung wechseln
.ShowRevisionsAndComments = False
.RevisionsView = wdRevisionsViewFinal
End With
End With
' In Zustand "Kopf- und Fußzeilen aktualisieren" wechseln
bState = 2
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 2
' Kopf- und Fußzeilen aktualisieren
Try
With objWord.ActiveDocument
' Wechsel in die Druckvorschau und zurück um Kopf- und Fußzeilen zu aktualisieren
.PrintPreview()
.ClosePrintPreview()
End With
' In Zustand "Verzeichnisse aktualisieren" wechseln
bState = 3
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 3
' Verzeichnisse aktualisieren
Try
With objWord.Selection
' Gesamtes Dokument markieren und alle Felder aktualisieren
.WholeStory()
.Fields.Update()
End With
' Alle vorhandenen Verzeichnisse aktualisieren
' Inhaltsverzeichnis
Dim oTOC As Word.TableOfContents
For Each oTOC In objWord.ActiveDocument.TablesOfContents
oTOC.Update()
Next oTOC
' Abbildungsverzeichnis
Dim oTOF As Word.TableOfFigures
For Each oTOF In objWord.ActiveDocument.TablesOfFigures
oTOF.Update()
Next oTOF
' Rechtsgrundlagenverzeichnisse
Dim oTOA As Word.TableOfAuthorities
For Each oTOA In objWord.ActiveDocument.TablesOfAuthorities
oTOA.Update()
Next oTOA
' In Zustand "Fehlerhafte Verweisquellen im Text suchen" wechseln
bState = 4
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 4
' Fehlerhafte Verweisquellen im Text suchen
Try
With objWord.Selection
' Nach fehlerhaften Verweisquellen im Text suchen
' Wechsel auf erste Seite
.HomeKey(Unit:=wdStory)
' Nach fehlerhaften Verweisquellen im Text suchen
bFoundError = findFehlerhafteVerweisquellen()
End With
If bFoundError Then
' In Zustand "Fehler gefunden" wechseln
bState = 9
Else
' In Zustand "Fehlerhafte Verweisquellen in Kopfzeile suchen" wechseln
bState = 5
End If
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 5
' Fehlerhafte Verweisquellen in Kopfzeile suchen
Try
With objWord.Selection
' Nach Fehlern in der Kopf- und Fußzeile suchen
If iPage = 1 Then
' Wechsel auf erste Seite
.HomeKey(Unit:=wdStory)
Else
' Wechsel auf letzte Seite
.EndKey(Unit:=wdStory)
End If
Try
' In Kopfzeile wechseln
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
' Wenn Kopfzeile vorhanden, gesamten Kopfzeilentext markieren und nach Fehlern suchen
.WholeStory()
' Nach fehlerhaften Verweisquellen im Text suchen
bFoundError = findFehlerhafteVerweisquellen()
Catch ex As Exception
' In Zustand 6: "Fehlerhafte Verweisquellen in Fußzeile suchen" wechseln
bFoundError = False
End Try
End With
If bFoundError Then
' In Zustand "Fehler gefunden" wechseln
bState = 9
Else
' In Zustand "Fehlerhafte Verweisquellen in Fußzeile suchen" wechseln
bState = 6
End If
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 6
' Fehlerhafte Verweisquellen in Fußzeile suchen
Try
' In Fußzeile wechseln und nach Fehlern suchen
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
With objWord.Selection
' gesamten Fußzeilentext markieren und nach Fehlern suchen
.WholeStory()
' Nach fehlerhaften Verweisquellen im Text suchen
bFoundError = findFehlerhafteVerweisquellen()
End With
Catch ex As Exception
' In Zustand 7: "Wechsel auf letzte Seite" wechseln
bFoundError = False
End Try
If bFoundError Then
' In Zustand "Fehler gefunden" wechseln
bState = 9
Else
' In Zustand "Wechsel auf letzte Seite" wechseln
bState = 7
End If
Case 7
' Wechsel auf letzte Seite
Try
' wenn Position auf erster Seite, dann Wechsel auf letzte Seite
If iPage = 1 Then
iPage = 2
' Wechseln in das Dokument
objWord.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
' In Zustand "Fehlerhafte Verweisquellen in Kopfzeile suchen" wechseln
bState = 5
Else
' In Zustand "Keine Fehler gefunden" wechseln
bState = 8
End If
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 8
' Keine Fehler gefunden
Try
With objWord.ActiveWindow.ActivePane.View
' Wechseln in das Dokument
.SeekView = wdSeekMainDocument
' Wechsel auf erste Seite
objWord.Selection.HomeKey(Unit:=wdStory)
' Ansicht wiederherstellen
.Type = iCurViewType
' Aktuelle Postion wiederherstellen
rCurPos.Select()
End With
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
End Try
Case 9
' Fehler gefunden
Try
With objWord.ActiveWindow.ActivePane.View
' Ansicht wiederherstellen
.Type = iCurViewType
End With
Catch ex As Exception
MsgBox("Fehler in Zustand " & bState & ":" & vbNewLine & _
ex.Message, _
MsgBoxStyle.Critical, _
"Fehler")
End Try
' In Zustand "Statemachine beenden" wechseln
bState = bMaxState
Case bMaxState
' Statemachine beenden
' Einstellung der Anzeige von Änderungsmarkierungen wiederherstellen
With objWord.ActiveWindow.View
.ShowRevisionsAndComments = bShowRevisionsAndComments
.RevisionsView = bRevisionsView
End With
' Bildschirmaktualisierung einschalten
objWord.Application.ScreenUpdating = True
Exit While
End Select
End While
End If
End Sub