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