Consecuencias del uso de Autoguardado en complementos y macros

Obtenga información sobre cómo funciona el Autoguardado en Excel, PowerPoint y Word y cómo puede afectar a los complementos o macros.

Información general sobre el Autoguardado

Cuando un archivo está hospedado en la nube (es decir, OneDrive, OneDrive para la Empresa o SharePoint Online), Autoguardado permite que las modificaciones del usuario se guarden automática y continuamente. Cuando el archivo se comparte con otros usuarios, los cambios se combinan en la versión del archivo de este usuario. Si Autoguardado está desactivado, es necesario guardar manualmente los cambios del usuario para que se conserven en la nube y para que este usuario reciba los cambios de otros.

Actualmente, Word, Excel y PowerPoint proporcionan un evento BeforeSave que permite a un programador ejecutar código después de que se seleccione la opción de guardar, pero antes de que se ejecute. Excel también proporciona un evento AfterSave que puede ejecutar código de macro o de complemento después de guardar.

Cuando Autoguardado está habilitado, estos eventos se activan automáticamente de forma periódica, sin intervención del usuario. Por este motivo, los complementos y macros que usan estos eventos pueden experimentar problemas cuando Autoguardado está activado.

En general, estos problemas se pueden evitar si el usuario decide deshabilitar Autoguardado. Puede hacerlo en nombre del usuario a través de la propiedad AutoSaveOn en Word, Excel y PowerPoint si está disponible (ver el siguiente ejemplo). También puede seguir algunos pasos como desarrollador para mitigar estos problemas y que los complementos y macros funcionen correctamente, incluso si Autoguardado está habilitado.

Ejemplo

Este ejemplo desactiva Autoguardado y notifica al usuario de que el libro no se guarda automáticamente.

Sub UseAutoSaveOn()
    ActiveWorkbook.AutoSaveOn = False
    MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub

Posibles problemas al guardar eventos y usar Autoguardado.

Puede que necesite solucionar uno o varios de los siguientes problemas relacionados con la interacción entre el guardado de eventos y Autoguardado:

  1. El código en eventos BeforeSave o AfterSave se ejecuta durante demasiado tiempo
  2. El código en eventos de guardado hace que aparezca un cuadro de diálogo modal
  3. El código en eventos de guardado borra la pila de deshacer (solo en Excel)
  4. El código en AfterSave desfasa el libro (solo en Excel)
  5. El código en BeforeSave cancela el guardado del archivo (al establecer el argumento Cancelar como verdadero)

Problema 1: El código en eventos BeforeSave o AfterSave se ejecuta durante demasiado tiempo

En general, Word, Excel y PowerPoint no responden a la interacción del usuario al ejecutar un código de complemento o de macro. Por lo tanto, si el código de un controlador de eventos BeforeSave o AfterSave tarda demasiado tiempo en ejecutarse, puede empeorar significativamente la experiencia del usuario.

Cuando Autoguardado está deshabilitado, este código solo se ejecuta cuando el usuario decide guardar explícitamente, por lo que un retraso no es tan evidente y puede evitarse por el usuario hasta que él o ella esté listo para guardar.

Cuando Autoguardado está habilitado, este código se ejecuta automáticamente de forma periódica, por lo que existe la posibilidad de interrumpir el usuario, especialmente si el código tarda mucho tiempo.

Escenario de ejemplo

Imagine un complemento que permite al usuario crear mapas personalizados basados en datos de un libro de Excel. Un complemento así puede tener código BeforeSave que serializa los mapas que el usuario ha creado y los almacena en el libro en una parte CustomXML. Este proceso puede tardar un segundo en completarse y Excel podría no responde mientras está ocurriendo.

Cuando Autoguardado está desactivado, el usuario puede decidir cuándo quiere guardar y, por lo tanto, aunque el complemento ralentice ligeramente el proceso de guardado, el usuario no lo nota.

Cuando Autoguardado está habilitado, el código BeforeSave se ejecuta automáticamente de forma periódica incluso si el usuario se encuentra en medio de algo (como escribir datos en una celda), lo que puede ser muy molesto.

Solución alternativa

Los complementos deberían intentar evitar operaciones de ejecución prolongada dentro de un evento de guardado. En este ejemplo, el desarrollador puede elegir guardar los mapas personalizados en el archivo a medida que el usuario los crea o modifica, en lugar de esperar el evento de guardado.

Problema 2: El código en eventos de guardado hace que aparezca un cuadro de diálogo modal

Cualquier código que se ejecuta en un evento de guardado que muestra la interfaz de usuario como un cuadro de diálogo modal, tiene el potencial de empeorar enormemente la experiencia del usuario cuando Autoguardado está activado. Como los eventos BeforeSave y AfterSave se ejecutan automáticamente de forma periódica, estos cuadros de diálogo pueden interrumpir el flujo de trabajo normal del usuario.

Escenario de ejemplo

Un complemento que valida un documento de Word antes de guardar para asegurarse de que se aplique la marca de la empresa puede desencadenar un cuadro de diálogo que avisa al usuario acerca de los problemas que se detectaron y ofrece una manera para corregirlos. Como el evento BeforeSave ahora se activa automáticamente y de forma continua, este cuadro de diálogo de validación puede aparecer de repente mientras el usuario está haciendo algo.

Soluciones alternativas

Considere la opción de eliminar cualquier código que necesite mostrar la interfaz de usuario a otras áreas de la aplicación. Por ejemplo, el usuario podría seleccionar un botón "validar" para desencadenar el proceso de validación, o puede activar el código de validación solo si el usuario intenta cambiar los datos existentes.

Si desea que el código de validación se active únicamente en el primer guardado de un documento, pero no en guardados posteriores o automáticos, considere la posibilidad de inspeccionar una propiedad, como Workbook.Path de Excel, antes de mostrar una interfaz de usuario durante BeforeSave o AfterSave. En Excel, la propiedad Workbook.Path debería estar en blanco si el libro todavía no tiene una ubicación de guardado.

Problema 3: El código en eventos de guardado borra la pila de deshacer (solo en Excel)

En general, si ejecuta ciertas instrucciones de VBA en Excel, se borrará la pila de deshacer. Por ejemplo, si se cambia el valor de una celda ejecutando ActiveCell.Value = "myValue", se borrará la pila de deshacer. Si existe tal código en el evento BeforeSave o AfterSave para una macro o un complemento, y Autoguardado está activado, un usuario de dicha macro o complemento a menudo no podrá deshacer acciones de usuario normales como esperaría.

Escenario de ejemplo

Un complemento puede tener código que se ejecute en respuesta al evento BeforeSave que inspeccione el documento y escriba valores en una tabla de "registro" en el libro. Cuando Autoguardado está activado, esto borrará la pila de deshacer periódicamente, lo que puede ser molesto para los usuarios.

Solución alternativa

Puede quitar el código que escribe en el libro en eventos BeforeSave o AfterSave. Por ejemplo, el complemento que se describe en el escenario de ejemplo se podría modificar para almacenar el registro de cambios en un archivo o una base de datos independientes.

Problema 4: El código en AfterSave desfasa el libro (solo en Excel)

Cuando Autoguardado está activado, los eventos BeforeSave y AfterSave solo se activarán si se ha producido un cambio en el libro desde la última vez que se activaron. Si el código del evento AfterSave "ensucia" el libro (es decir, realiza cambios adicionales), esto podría hacer que los eventos vuelvan a activarse por el mismo cambio y que sigan repitiéndose de forma indefinida. Esto podría desperdiciar recursos del sistema y afectar a la duración de la batería.

Solución alternativa

El código que ensucie el libro en AfterSave debería moverse a BeforeSave o a otra ubicación distinta (vea Problema 3). Esto no es recomendable actualmente, incluso sin Autoguardado, porque deja el libro en un estado de "modificado" permanente, lo que provoca que aparezca un mensaje al cerrar que pide al usuario guardar los cambios, aunque no haya realizado cambios adicionales. 

Problema 5: El código en BeforeSave cancela el guardado del archivo (al establecer el argumento Cancelar como Verdadero)

En la actualidad, es posible cancelar el guardado en el evento BeforeSave estableciendo Cancel como Verdadero:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Cancel = True
End Sub

Cuando Autoguardado está habilitado, la aplicación (es decir, Excel, Word o PowerPoint) desencadena la acción de guardar automáticamente de forma continua hasta que el archivo no tenga más cambios sin guardar. Cuando el usuario realiza un único cambio en el archivo, la aplicación intenta guardarlo.

Si el desarrollador decide cancelar el guardado tal como se describe anteriormente, la aplicación determina continuamente que hay cambios no guardados, lo que hace que el guardado se vuelva a intentar (en algún momento). Puesto que el mismo código de evento que cancela el primer guardado también cancelará este segundo intento, el proceso seguirá mientras que el archivo esté abierto, disminuyendo el rendimiento y la duración de la batería.

Escenario de ejemplo

Un complemento podría reemplazar completamente el código de guardado predeterminado de Word para que el archivo se guarde en una base de datos corporativa en lugar de en un disco o una ubicación de SharePoint. Dicho complemento cancelaría primero el intento de guardado antes de intentar guardar en otro lugar.

Solución alternativa

Estos complementos deberían asegurarse de que Autoguardado está desactivado estableciendo AutoSaveOn como Falso. Como un archivo debe estar ya guardado en una ubicación de OneDrive o SharePoint para que Autoguardado esté activado, Autoguardado ya debería estar desactivado o deshabilitado en la mayoría de las versiones de este escenario.

Vea también

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.