Trabajar con el objeto UndoRecord

A medida que los usuarios finales trabajan en Word, las acciones que realizan que se pueden deshacer se registran en una cola (la "pila de deshacer") para que, si el usuario decide invertir la acción, Word pueda recuperar la acción realizada y deshacerla. La pila de tareas por deshacer puede verse a través de la interfaz de usuario de Word en la cinta de opciones mediante el botón Deshacer, donde cada acción aparece como un registro discreto en la pila. La automatización mediante el modelo de objetos de Word también escribe estos "registros de deshacer" en la pila de deshacer, pero trabajar con la pila de deshacer mediante puede ser problemático.

A veces, los desarrolladores escriben código que realiza una tarea lógica mediante una serie de acciones, donde cada acción se registra como una entrada independiente en la pila de deshacer. Sin embargo, aunque el usuario final puede deshacer cada acción por separado, a veces es lógico deshacer todos los pasos de la tarea como una unidad y no individualmente.

Por ejemplo, un desarrollador podría escribir código que realice la tarea de insertar metadatos de documento en el pie de página de un documento de Word, como se muestra en el ejemplo de código siguiente.

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 

Los registros de deshacer resultantes aparecen en la pila de deshacer para las acciones realizadas por el código.

Botón Deshacer expandido con varias entradas

Si el usuario final necesita revertir o deshacer la tarea "insertar metadatos", cada acción asociada a la tarea debe deshacerse individualmente (presionando CTRL+Z o haciendo clic en la flecha desplegable del botón Deshacer y seleccionando las acciones que se van a deshacer). En esta situación, existe la posibilidad de que el usuario final solo deshaga parcialmente la serie de acciones asociadas a la tarea única, lo que posiblemente deje el documento en un estado no deseado.

El modelo de objetos de Word ofrece una manera de evitar este problema al proporcionar a los desarrolladores la capacidad de vincular una serie de acciones individuales a un registro de deshacer personalizado que, a continuación, se puede usar para deshacer las acciones como una sola unidad. El objeto UndoRecord representa un registro de deshacer personalizado en el modelo de objetos de Word.

Uso del objeto UndoRecord

El objeto UndoRecord es una propiedad del objeto Application en Word. Se crea un registro de deshacer personalizado mediante los métodos StartCustomRecord y EndCustomRecord del objeto UndoRecord . Considere el siguiente ejemplo de código que modifica el ejemplo anterior para incluir un registro de deshacer personalizado.

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 

El método StartCustomRecord comienza a registrar las acciones que se incluyen en el registro de deshacer personalizado. Puede asignar un nombre al registro de deshacer personalizado como argumento al método StartCustomRecord , pero esto es opcional. Si no especifica un nombre, Word usa el nombre de Visual Basic del primer comando ejecutado como nombre del registro. El nombre del registro de deshacer personalizado es la cadena que aparece en la interfaz de usuario de la lista desplegable situada junto al botón Deshacer .

El método EndCustomRecord deja de registrar el registro de deshacer personalizado. Todas las acciones realizadas por el código entre la llamada StartCustomRecord y la llamada a EndCustomRecord se vinculan a un objeto UndoRecord . Al ejecutar código que crea un registro de deshacer personalizado, como en el ejemplo de código anterior, el registro de deshacer personalizado aparece en la pila de deshacer como una sola entrada.

Botón Deshacer expandido con una entrada

UndoRecord (miembros de objeto)

En la tabla siguiente se enumeran otros miembros importantes de UndoRecord.

Nombre Tipo de miembro Descripción
CustomRecordLevel Propiedad Devuelve un valor de tipo Long que especifica el número de llamadas de acción de deshacer personalizadas actualmente activas. Solo lectura.
CustomRecordName Propiedad Devuelve una cadena que especifica la entrada que aparece en la pila de deshacer cuando todos personalizada deshacer acciones se haya completado. Solo lectura.
IsRecordingCustomRecord Propiedad Devuelve un valor Boolean que especifica si un personalizado deshacer la acción se graba. Solo lectura.

Procedimientos recomendados

  • Cierre cada registro de deshacer personalizado con una llamada a EndCustomRecord. Word intentará determinar dónde finalizar el registro, pero puede que no esté en el punto deseado de ejecución del código.

  • Llame al método Undo del objeto Document en el orden correcto al llamar desde un registro de deshacer personalizado. Llamar al método Undo en el orden incorrecto dentro de un registro de deshacer personalizado puede tener efectos no deseados en la ejecución del código. En el ejemplo de código siguiente se muestra el método Undo al que se llama desde dentro de un registro de deshacer personalizado.

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

Cuando se ejecuta este código, se deshace cada acción del registro de deshacer personalizado antes de la llamada al método Undo . Cada acción del registro de deshacer personalizado después de la llamada al método Undo se coloca en la pila de deshacer.

  • Evite cambiar documentos dentro de un registro de deshacer personalizado. En el ejemplo de código siguiente se cambia de un documento a otro dentro de un registro de deshacer personalizado.
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

Cuando se ejecuta este código, Word finaliza el registro de deshacer personalizado cuando el código comienza a escribir en el segundo documento. Cuando finalice el procedimiento, solo el primer documento tendrá un registro de deshacer personalizado con el nombre "Nuevo párrafo".

  • Evite usar saltos al ejecutar código que contiene registros de deshacer personalizados en modo de depuración. Cuando el código que contiene registros de deshacer se ejecuta en modo de depuración en el editor de Visual Basic y el código encuentra un punto de interrupción, Word finaliza automáticamente todos los registros personalizados que están actualmente en curso.

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.