Cómo usar VBA para agregar marcadores mediante programación
🔍 WiseChecker

Cómo usar VBA para agregar marcadores mediante programación

Necesita agregar marcadores a un documento de Word sin hacer clic en la pestaña Insertar cada vez. Los marcadores le permiten marcar ubicaciones o rangos de texto específicos para poder saltar a ellos, hacer referencias cruzadas o actualizarlos con códigos de campo. Este artículo explica cómo usar VBA para agregar marcadores mediante programación, cubriendo los objetos esenciales, los métodos y los errores comunes. Al final podrá escribir una macro que inserte un marcador, lo nombre correctamente y verifique que se haya creado.

Puntos clave: Agregar marcadores con VBA

  • ActiveDocument.Bookmarks.Add Name:=”MyBookmark”, Range:=Selection.Range: Crea un marcador en la posición actual del cursor o en el texto seleccionado.
  • Los nombres de marcador no pueden contener espacios ni comenzar con un número: Use guiones bajos o camelCase para evitar el error en tiempo de ejecución 5941.
  • Verifique si un marcador existe antes de agregarlo: Use un bucle For Each o una función auxiliar para evitar errores por nombres duplicados.
  • Use objetos Range en lugar de Selection: Mayor velocidad de ejecución y sin parpadeo de pantalla al agregar marcadores mediante programación.
  • Los marcadores sobreviven al guardado y cierre: Persisten como parte del documento a menos que se eliminen explícitamente.

ADVERTISEMENT

Descripción del modelo de objetos Bookmark de VBA

En VBA de Word, un marcador se representa mediante el objeto Bookmark. Todos los marcadores de un documento pertenecen a la colección Bookmarks, a la que se accede mediante ActiveDocument.Bookmarks. La colección admite agregar, eliminar y contar marcadores. Cada marcador tiene una propiedad Name (una cadena) y una propiedad Range que devuelve el objeto Range que abarca el marcador.

Un marcador puede abarcar un solo punto (rango contraído) o un bloque de texto. Al agregar un marcador, se proporciona un nombre y un objeto Range. Si se omite el parámetro Range, Word agrega el marcador en el punto de inserción. El nombre debe ser único dentro del documento; los nombres duplicados provocan el error en tiempo de ejecución 5941.

Nombres de marcador válidos

Los nombres de marcador siguen estas reglas:

  • Deben comenzar con una letra o un guion bajo
  • Pueden contener letras, dígitos y guiones bajos
  • No pueden contener espacios, guiones ni signos de puntuación
  • La longitud máxima es de 40 caracteres
  • No distinguen mayúsculas de minúsculas: “MyBM” y “mybm” se tratan como el mismo nombre

Si se infringen estas reglas, el método Add genera un error. Use una rutina de validación o depure la entrada del usuario antes de llamar a Add.

Pasos para agregar un marcador con VBA

Estos pasos suponen que tiene abierto el Editor de Visual Basic (Alt+F11) y un módulo insertado. Puede escribir la macro en cualquier módulo o en el panel de código ThisDocument.

  1. Abra el Editor de VBA
    Presione Alt+F11 en Word para abrir el Editor de Visual Basic. En el Explorador de proyectos, expanda el proyecto que contiene el documento de destino. Haga clic con el botón derecho en cualquier módulo o en el objeto ThisDocument y elija Insertar > Módulo para crear un nuevo módulo de código.
  2. Declare una variable Range y asígnela
    Use un objeto Range para definir dónde va el marcador. Por ejemplo:
    Dim rng As Range
    Set rng = ActiveDocument.Range(Start:=0, End:=100)

    Esto crea un rango que abarca los primeros 100 caracteres. Para usar la selección actual, use Set rng = Selection.Range.
  3. Llame al método Bookmarks.Add
    Escriba la línea que crea el marcador:
    ActiveDocument.Bookmarks.Add Name:="SectionA", Range:=rng
    El parámetro Name es obligatorio. El parámetro Range es opcional; si se omite, el marcador se coloca en el punto de inserción.
  4. Compruebe que el marcador se haya agregado
    Use el método Exists para verificarlo:
    If ActiveDocument.Bookmarks.Exists("SectionA") Then
    MsgBox "Bookmark created."
    End If

    Esto evita errores si intenta acceder a un marcador que no existe.
  5. Maneje nombres duplicados
    Antes de agregar un marcador, compruebe si el nombre ya existe. Elimine primero el marcador antiguo o genere un nombre único:
    Dim bmName As String
    bmName = "MyBM"
    If ActiveDocument.Bookmarks.Exists(bmName) Then
    ActiveDocument.Bookmarks(bmName).Delete
    End If
    ActiveDocument.Bookmarks.Add Name:=bmName, Range:=rng

Macro de ejemplo completa

Coloque esta macro en un módulo estándar. Agrega un marcador llamado “StartOfDoc” al principio del documento activo.

Sub AddBookmarkAtStart()
    Dim rng As Range
    Set rng = ActiveDocument.Range(Start:=0, End:=0)  ' collapsed range at position 0
    
    If ActiveDocument.Bookmarks.Exists("StartOfDoc") Then
        ActiveDocument.Bookmarks("StartOfDoc").Delete
    End If
    
    ActiveDocument.Bookmarks.Add Name:="StartOfDoc", Range:=rng
    MsgBox "Bookmark 'StartOfDoc' added at the start of the document."
End Sub

ADVERTISEMENT

Problemas comunes al agregar marcadores con VBA

“Error en tiempo de ejecución 5941: El nombre del marcador no es válido”

Este error se produce cuando el nombre contiene un espacio, comienza con un dígito o supera los 40 caracteres. También ocurre si intenta agregar un marcador con un nombre que ya existe. Solución: depure los nombres con una función que reemplace los espacios por guiones bajos y los trunque a 40 caracteres. Compruebe siempre Exists antes de agregar.

El marcador desaparece después de guardar y volver a abrir

Esto ocurre cuando el marcador se coloca dentro de un párrafo que se elimina o cuando el documento se guarda en un formato que no admite marcadores (como texto sin formato .txt). Solución: asegúrese de guardar como .docx o .docm. Compruebe también que el objeto Range apunte a una ubicación estable. Los marcadores anclados a contenido que se elimina se pierden de forma silenciosa.

El marcador abarca el texto incorrecto

El objeto Range que se pasa a Add define la extensión del marcador. Si usa un rango contraído (inicio = fin), el marcador señala un punto. Si usa un rango con una longitud mayor que cero, el marcador abarca ese texto. Solución: verifique las propiedades Start y End de su Range antes de llamar a Add. Use Debug.Print rng.Start, rng.End en la ventana Inmediato para inspeccionar.

Métodos de marcador de VBA: Add vs Delete vs Exists

Método Sintaxis Comportamiento
Add Bookmarks.Add Name, Range Crea un nuevo marcador. Devuelve un objeto Bookmark. Genera un error si el nombre no es válido o está duplicado
Delete Bookmarks(name).Delete Elimina el marcador pero conserva el texto. Genera un error si el marcador no existe
Exists Bookmarks.Exists(name) Devuelve True si existe un marcador con ese nombre, False en caso contrario. No genera error si falta

ADVERTISEMENT

Trabajar con Range vs Selection

Al agregar un marcador, puede usar Selection.Range o un objeto Range que defina directamente. Ambos funcionan, pero Range es más rápido y no mueve el cursor. Selection requiere que el usuario tenga el punto de inserción en el lugar correcto. Para la automatización programática, use siempre objetos Range explícitos.

Para marcar un párrafo específico, use la colección Paragraphs:

Sub BookmarkFirstParagraph()
    Dim rng As Range
    Set rng = ActiveDocument.Paragraphs(1).Range
    rng.End = rng.End - 1  ' exclude paragraph mark
    ActiveDocument.Bookmarks.Add Name:="FirstPara", Range:=rng
End Sub

Conclusión

Ahora puede agregar marcadores mediante programación usando el método Bookmarks.Add con un nombre válido y un objeto Range. Compruebe siempre si existen marcadores con Exists antes de agregar para evitar errores en tiempo de ejecución. Use objetos Range explícitos en lugar de Selection para una automatización confiable. Para un uso avanzado, explore el método Bookmark.Select para saltar a un marcador o el método Fields.Add para insertar un campo de referencia cruzada que apunte a su nuevo marcador.

ADVERTISEMENT