Corregir el error de variable de objeto no establecida en VBA de Word en eventos de documento
🔍 WiseChecker

Corregir el error de variable de objeto no establecida en VBA de Word en eventos de documento

Cuando ejecutas código VBA en Word que responde a eventos de documento como Abrir, Cerrar o BeforeSave, es posible que veas el error 91: Variable de objeto o variable de bloque With no establecida. Este error detiene tu macro y puede ser confuso porque el código parece correcto. La causa casi siempre es que una referencia a un objeto, como un objeto Document, Range o Application, no se ha asignado antes de que el código intente usarlo. Este artículo explica las razones específicas por las que ocurre este error en VBA controlado por eventos y proporciona pasos claros para corregir cada escenario.

Puntos clave: Corregir el error 91 en eventos de documento de Word VBA

  • Establece obj = Nothing antes de asignar una nueva referencia de objeto: Evita el error al reutilizar una variable a nivel de módulo en varios procedimientos de evento.
  • Usa la referencia correcta al objeto de documento mediante Application.Documents(1) o ThisDocument: Asegura que el objeto exista antes de llamar a cualquier método o propiedad.
  • Comprueba si hay Nothing antes de usar una variable de objeto en una instrucción If: Evita el error cuando el objeto podría no haberse creado debido a una ruta de código condicional.

ADVERTISEMENT

Por qué Word VBA lanza el error 91 en eventos de documento

El error 91 ocurre cuando tu código VBA intenta usar una variable de objeto que no tiene una referencia asignada. En el contexto de eventos de documento, esto suele ocurrir porque la variable de objeto se declaró pero nunca se estableció a un objeto válido. Los escenarios comunes incluyen:

  • Usar una variable a nivel de módulo que contiene una referencia a un objeto Document, pero el documento se cerró antes de que se ejecute el código del evento.
  • Llamar a un método en un objeto Range o Selection que ya no es válido porque el contenido del documento cambió.
  • Escribir código en el módulo ThisDocument que asume que ActiveDocument es el mismo que el documento donde se dispara el evento.
  • Olvidar usar la palabra clave Set al asignar un objeto a una variable.

La causa raíz es que VBA no puede acceder a un objeto nulo. Cuando se ejecuta un procedimiento de evento, el documento puede no estar completamente inicializado o puede haber sido destruido. Comprender estos desencadenantes te ayuda a escribir código defensivo que verifique la validez del objeto antes de usarlo.

Cómo los eventos de documento desencadenan el error

Word dispara eventos de documento desde el módulo de código ThisDocument. Por ejemplo, el evento Document_Open se ejecuta cuando se abre un documento. Si declaras una variable a nivel de módulo como Dim doc As Document y luego intentas usar doc dentro de Document_Open sin asignarla primero, VBA lanza el error 91. De manera similar, si estableces doc = ActiveDocument pero el documento activo no es el que se abrió, la referencia puede ser inválida.

Otro desencadenante común es el evento Document_BeforeClose. Si tu código intenta acceder al contenido del documento después de que el cierre haya comenzado, el objeto del documento puede ya estar establecido en Nothing. Por eso es esencial verificar si hay Nothing en cada procedimiento de evento que use variables de objeto.

Pasos para corregir el error de variable de objeto no establecida

Los siguientes métodos abordan las causas más comunes del error 91 en eventos de documento. Aplícalos en el orden mostrado. Si el error persiste después de un método, pasa al siguiente.

Método 1: Establecer explícitamente las variables de objeto dentro de cada procedimiento de evento

  1. Abre el editor de VBA
    Presiona Alt+F11 en Word para abrir el editor de Visual Basic para Aplicaciones. En el Explorador de proyectos, haz doble clic en ThisDocument para abrir su ventana de código.
  2. Localiza el procedimiento de evento que desencadena el error
    Por ejemplo, si el error ocurre al abrir el documento, busca el procedimiento Document_Open(). Si no existe, créalo seleccionando Document en la lista desplegable Objeto y Open en la lista desplegable Procedimiento.
  3. Declara y establece la variable de objeto dentro del procedimiento de evento
    En lugar de usar una variable a nivel de módulo, declara una variable local y asígnala con Set. Por ejemplo:
    Private Sub Document_Open()
    Dim doc As Document
    Set doc = ThisDocument
    MsgBox doc.Name
    End Sub

    Usar ThisDocument asegura que haces referencia al documento que contiene el código, no a un documento activo arbitrario.
  4. Prueba el código
    Cierra y vuelve a abrir el documento para activar el evento. Si el error desaparece, la corrección está completa. Si no, continúa con el Método 2.

Método 2: Verificar si hay Nothing antes de usar una variable de objeto

  1. Identifica la línea que lanza el error 91
    Cuando ocurra el error, haz clic en Depurar en el cuadro de diálogo de error. El editor de VBA resalta la línea problemática. Anota la variable de objeto que se está usando.
  2. Agrega una verificación condicional antes de la línea
    Inserta una instrucción If que verifique que el objeto no sea Nothing. Por ejemplo, si la variable es rng, agrega:
    If Not rng Is Nothing Then
    rng.Text = "Hello"
    End If

    Si el objeto podría ser Nothing, tu código omite la operación en lugar de fallar.
  3. Aplica la verificación a cada variable de objeto en el procedimiento de evento
    Revisa todo el procedimiento y envuelve cada uso de objeto en una verificación similar. Para variables a nivel de módulo que persisten entre eventos, también verifícalas al inicio de cada evento.
  4. Prueba el documento
    Activa el evento nuevamente. El error no debería aparecer. Si aún ocurre, continúa con el Método 3.

Método 3: Usar la colección Application.Documents en lugar de ActiveDocument

  1. Reemplaza las referencias a ActiveDocument
    En tu procedimiento de evento, cambia cada aparición de ActiveDocument por ThisDocument o por un documento específico de la colección Application.Documents. Por ejemplo:
    Set doc = Application.Documents(1)
    Esto es confiable cuando conoces el índice del documento.
  2. Recorre todos los documentos abiertos si es necesario
    Si necesitas encontrar un documento por nombre, usa un bucle For Each:
    Dim doc As Document
    For Each doc In Application.Documents
    If doc.Name = "Report.docx" Then
    ' perform actions
    End If
    Next doc

    Esto evita el error cuando el documento objetivo no está activo.
  3. Prueba la corrección
    Guarda el documento, ciérralo y vuelve a abrirlo. El evento debería ejecutarse sin errores.

ADVERTISEMENT

Si Word VBA aún lanza el error 91 después de la corrección principal

El error ocurre solo en Document_BeforeClose

El evento Document_BeforeClose se dispara mientras el documento se está cerrando. En ese punto, algunas referencias a objetos pueden ya ser inválidas. Para corregirlo, usa siempre ThisDocument en lugar de una variable que podría haberse establecido antes. Además, evita referenciar otros documentos abiertos dentro de BeforeClose a menos que primero verifiques que existen.

El error ocurre al ejecutar código desde una plantilla

Si tu código de evento está en una plantilla global (Normal.dotm o un complemento), el objeto ThisDocument se refiere a la plantilla, no al documento. Usa ActiveDocument cuando el código deba actuar sobre el documento que está abierto actualmente. Sin embargo, verifica que ActiveDocument no sea Nothing antes de usarlo. Agrega esta línea al inicio de tu procedimiento de evento:
If ActiveDocument Is Nothing Then Exit Sub

El error ocurre de forma intermitente en macros de larga duración

Cuando una macro se ejecuta durante mucho tiempo, el usuario puede cerrar el documento mientras la macro aún se está ejecutando. Esto hace que las referencias a objetos se vuelvan inválidas. Para prevenirlo, usa un manejo de errores que capture el error 91 y salga correctamente. Agrega esta estructura alrededor de tu código de evento:
On Error Resume Next
Set doc = ThisDocument
If doc Is Nothing Then Exit Sub
On Error GoTo 0

Causas del error 91 de VBA en eventos de documento vs código a nivel de módulo

Elemento Código de evento de documento Código de módulo estándar
Fuente de referencia de objeto ThisDocument, ActiveDocument o Application.Documents Cualquier objeto creado o pasado como parámetro
Causa común del error 91 El evento se dispara antes de que el documento esté completamente inicializado o después de que se destruya Variable declarada pero nunca asignada con Set
Mejor práctica para evitar el error Usa siempre ThisDocument dentro del procedimiento de evento y verifica si hay Nothing Establece la variable inmediatamente después de la declaración y valida antes de usar
Alcance de la variable A menudo a nivel de módulo, lo que causa referencias obsoletas entre eventos Generalmente local, lo que reduce el riesgo de referencias obsoletas
Dificultad de depuración Mayor porque los eventos se disparan automáticamente y pueden no ser repetibles Menor porque controlas cuándo se ejecuta el código

Al comprender estas diferencias, puedes escribir código de evento que sea robusto contra errores de referencia de objeto. La clave es siempre asignar variables de objeto dentro del procedimiento de evento, nunca depender de una variable a nivel de módulo que pueda haberse borrado, y siempre verificar si hay Nothing antes de usar cualquier objeto.

ADVERTISEMENT