VSTO – Word: Dokument aktualisieren

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