Freigeben über


Arbeiten mit dem UndoRecord-Objekt

Wenn Endbenutzer in Word arbeiten, werden die Aktionen, die rückgängig gemacht werden können, in einer Warteschlange aufgezeichnet– dem "Rückgängig-Stapel", sodass Word die ausgeführte Aktion abrufen und rückgängig machen kann, wenn der Benutzer sich entscheidet, die Aktion rückgängig zu machen. Der Rückgängig-Stapel wird über die Word-Benutzeroberfläche im Menüband über die Schaltfläche Rückgängig angezeigt, wobei jede Aktion als diskreter Datensatz im Stapel aufgeführt wird. Die Automatisierung mit dem Word-Objektmodell schreibt auch diese "Rückgängig-Datensätze" in den Rückgängig-Stapel, aber das Arbeiten mit rückgängigen Stapeln mit kann problematisch sein.

Entwickler schreiben manchmal Code, der eine logische Aufgabe mithilfe einer Reihe von Aktionen ausführt, wobei jede Aktion als separater Eintrag im Rückgängig-Stapel aufgezeichnet wird. Obwohl der Endbenutzer jede Aktion separat rückgängig machen kann, ist es manchmal logisch, alle Schritte der Aufgabe als Einheit und nicht einzeln rückgängig zu machen.

Beispielsweise kann ein Entwickler Code schreiben, der die Aufgabe zum Einfügen von Dokumentmetadaten in die Fußzeile eines Word-Dokuments ausführt, wie im folgenden Codebeispiel gezeigt.

Sub AddDocMetadata() 
Dim rngFooter As Range 
 
    Set rngFooter = ActiveDocument.Sections(1) _ 
        .Footers(wdHeaderFooterPrimary).Range 
         
    With rngFooter 
        .Delete 
        .Fields.Add Range:=rngFooter, Type:=wdFieldFileName, Text:="\p" 
        .InsertAfter Text:=vbTab & vbTab 
        .Collapse Direction:=wdCollapseStart 
        .Fields.Add Range:=rngFooter, Type:=wdFieldAuthor 
    End With     
End Sub 

Die resultierenden Rückgängig-Datensätze werden im Rückgängig-Stapel für die aktionen angezeigt, die vom Code ausgeführt werden.

Mit mehreren Einträgen erweiterte Schaltfläche zum Rückgängigmachen.

Wenn der Endbenutzer dann ein Rollback oder Rückgängigmachen der Aufgabe "Metadaten einfügen" ausführen muss, muss jede aktion, die der Aufgabe zugeordnet ist, einzeln rückgängig machen (indem Sie STRG+Z drücken oder auf den Dropdownpfeil auf der Schaltfläche Rückgängig klicken und dann die Aktionen auswählen, die rückgängig werden sollen). In dieser Situation besteht die Möglichkeit, dass der Endbenutzer die Reihe von Aktionen, die der einzelnen Aufgabe zugeordnet sind, nur teilweise rückgängig machen kann, sodass das Dokument möglicherweise in einem unerwünschten Zustand bleibt.

Das Word-Objektmodell bietet eine Möglichkeit, dieses Problem zu vermeiden, indem Es Entwicklern die Möglichkeit bietet, eine Reihe einzelner Aktionen mit einem benutzerdefinierten Rückgängig-Datensatz zu verknüpfen, der dann verwendet werden kann, um die Aktionen als einzelne Einheit rückgängig zu machen. Ein benutzerdefinierter Rückgängig-Datensatz wird im Word-Objektmodell durch das UndoRecord-Objekt dargestellt.

Verwenden des UndoRecord-Objekts

Das UndoRecord-Objekt ist eine Eigenschaft des Application-Objekts in Word. Sie erstellen einen benutzerdefinierten Rückgängig-Datensatz mit den Methoden StartCustomRecord und EndCustomRecord des UndoRecord-Objekts . Sehen Sie sich das folgende Codebeispiel an, in dem das vorherige Beispiel geändert wird, um einen benutzerdefinierten Rückgängig-Datensatz einzuschließen.

Dim objUndo As UndoRecord 
 
Sub AddDocMetadata() 
Dim rngFooter As Range 
 
Set objUndo = Application.UndoRecord 
 
'Begin the custom undo record and provide a name for the record 
objUndo.StartCustomRecord ("Add Doc Metadata") 
     
 Set rngFooter = ActiveDocument.Sections(1) _ 
        .Footers(wdHeaderFooterPrimary).Range 
         
 With rngFooter 
        .Delete 
        .Fields.Add Range:=rngFooter, Type:=wdFieldFileName, Text:="\p" 
        .InsertAfter Text:=vbTab & vbTab 
        .Collapse Direction:=wdCollapseStart 
        .Fields.Add Range:=rngFooter, Type:=wdFieldAuthor 
 End With 
 
'End the custom undo record 
objUndo.EndCustomRecord 
     
End Sub 

Die StartCustomRecord-Methode beginnt mit der Aufzeichnung der Aktionen, die im benutzerdefinierten Rückgängig-Datensatz enthalten sind. Sie können dem benutzerdefinierten Undo-Datensatz einen Namen als Argument für die StartCustomRecord-Methode geben, dies ist jedoch optional. Wenn Sie keinen Namen angeben, verwendet Word den Visual Basic-Namen des ersten ausgeführten Befehls als Namen des Datensatzes. Der Name des benutzerdefinierten Rückgängig-Datensatzes ist die Zeichenfolge, die in der Benutzeroberfläche in der Dropdownliste neben der Schaltfläche Rückgängig angezeigt wird.

Die EndCustomRecord-Methode beendet die Aufzeichnung des benutzerdefinierten Rückgängig-Datensatzes. Alle Aktionen, die vom Code zwischen dem StartCustomRecord-Aufruf und dem EndCustomRecord-Aufruf ausgeführt werden, sind mit einem UndoRecord-Objekt verknüpft. Wenn Sie Code ausführen, der wie im vorherigen Codebeispiel einen benutzerdefinierten Rückgängig-Datensatz erstellt, wird der benutzerdefinierte Rückgängig-Datensatz im Rückgängig-Stapel als einzelner Eintrag aufgeführt.

Mit einem Eintrag erweiterte Schaltfläche zum Rückgängigmachen.

Elemente des UndoRecord-Objekts

In der folgenden Tabelle sind weitere wichtige Elemente von "UndoRecord" aufgeführt.

Name Membertyp Beschreibung
CustomRecordLevel Eigenschaft Gibt einen Wert vom Typ Long zurück, der die Anzahl der benutzerdefinierten Rückgängig-Aktionsaufrufen angibt, die derzeit aktiv sind. Schreibgeschützt.
CustomRecordName Eigenschaft Gibt einen Wert vom Typ String zurück, der den Eintrag angibt, der im Rückgängig-Stapel angezeigt wird, wenn alle benutzerdefinierten Rückgängig-Aktionen abgeschlossen wurden. Schreibgeschützt.
IsRecordingCustomRecord Eigenschaft Gibt einen Wert vom Typ Boolean zurück, der angibt, ob eine benutzerdefinierte Rückgängig-Aktion aufgezeichnet wird. Schreibgeschützt.

Bewährte Methoden

  • Schließen Sie jeden benutzerdefinierten Rückgängig-Datensatz mit einem Aufruf von EndCustomRecord. Word versucht zu bestimmen, wo der Datensatz beendet werden soll, aber er befindet sich möglicherweise nicht am gewünschten Punkt der Codeausführung.

  • Rufen Sie die Undo-Methode des Document-Objekts in der richtigen Reihenfolge auf, wenn Sie aus einem benutzerdefinierten Rückgängig-Datensatz aufrufen. Das Aufrufen der Undo-Methode in der falschen Reihenfolge innerhalb eines benutzerdefinierten Rückgängig-Datensatzes kann unerwünschte Auswirkungen auf die Codeausführung haben. Das folgende Codebeispiel zeigt, wie die Undo-Methode aus einem benutzerdefinierten Rückgängig-Datensatz aufgerufen wird.

Sub UndoInUndoRecord() 
   
  Set objUndo = Application.UndoRecord 
  
  objUndo.StartCustomRecord ("New Paragraph") 
  
  ActiveDocument.Content.InsertAfter Text:=" The end." 
  ActiveDocument.Undo 
  ActiveDocument.Content.InsertAfter Text:=" The end, again." 
  ActiveDocument.Content.InsertAfter Text:=" The last end." 
 
  objUndo.EndCustomRecord 
 
End Sub

Wenn dieser Code ausgeführt wird, wird jede Aktion im benutzerdefinierten Rückgängig-Datensatz vor dem Aufruf der Undo-Methode rückgängig machen. Jede Aktion im benutzerdefinierten Rückgängig-Datensatz nach dem Aufruf der Undo-Methode wird in den Rückgängig-Stapel eingefügt.

  • Vermeiden Sie das Wechseln von Dokumenten innerhalb eines benutzerdefinierten Rückgängig-Datensatzes. Im folgenden Codebeispiel wird innerhalb eines benutzerdefinierten Rückgängig-Datensatzes von einem Dokument zu einem anderen umgeschaltet.
Dim objUndo As UndoRecord 

Sub SwitchDocsInsideUndo() 
  Set objUndo = Application.UndoRecord objUndo.StartCustomRecord ("New Paragraph") 
  
  'Insert some text into the first document Documents(1).Content.InsertAfter "A new paragraph in doc1." 
  
  'Switch documents to the second document 
  'The custom undo record will terminate here Documents(2).Content.InsertAfter "A new paragraph in doc2." 
  
  objUndo.EndCustomRecord 
End Sub

Wenn dieser Code ausgeführt wird, beendet Word den benutzerdefinierten Rückgängig-Datensatz, wenn der Code beginnt, in das zweite Dokument zu schreiben. Wenn die Prozedur abgeschlossen ist, verfügt nur das erste Dokument über einen benutzerdefinierten Rückgängig-Datensatz mit dem Namen "Neuer Absatz".

  • Vermeiden Sie die Verwendung von Umbrüchen beim Ausführen von Code, der benutzerdefinierte Rückgängig-Datensätze im Debugmodus enthält. Wenn Code, der Rückgängig-Datensätze enthält, im Visual Basic-Editor im Debugmodus ausgeführt wird und der Code auf einen Haltepunkt stößt, beendet Word automatisch alle benutzerdefinierten Datensätze, die derzeit ausgeführt werden.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.