Tiene un documento de Word con marcadores que no son visibles en el cuadro de diálogo Marcadores predeterminado ni en el cuerpo del documento. Estos marcadores ocultos pueden residir en encabezados, pies de página, cuadros de texto, comentarios u otros rangos de historia. La colección estándar ActiveDocument.Bookmarks solo cubre la historia del documento principal. Para acceder a todos los marcadores, debe usar VBA para iterar por cada rango de historia del documento. Este artículo explica cómo escribir una macro de VBA que recorra todos los rangos de historia y recupere cada marcador, incluidos los que están en partes ocultas del documento.
Puntos clave: iterar todos los marcadores de Word en VBA
- Enumeración ActiveDocument.StoryRanges: Recorre los 11 tipos de historia, incluidos encabezados, pies de página y cuadros de texto, para acceder a los marcadores ocultos.
- Colección Range.Bookmarks: Cada rango de historia tiene su propia colección Bookmarks que puede contener marcadores invisibles en el documento principal.
- Constantes StoryType (wdMainTextStory, wdPrimaryHeaderStory, etc.): Identifique a qué rango de historia pertenece un marcador al iterar.
Por qué la iteración estándar de marcadores omite los marcadores ocultos
Word almacena el contenido en varios rangos de historia. El cuerpo del documento principal es una historia. Los encabezados, pies de página, notas al pie, notas al final, comentarios, cuadros de texto y otros contenedores son historias separadas. La propiedad ActiveDocument.Bookmarks devuelve solo los marcadores del rango de historia principal. Los marcadores colocados en un encabezado, pie de página o cuadro de texto no son visibles allí. Para encontrarlos, debe acceder a cada rango de historia individualmente.
Una causa común de marcadores faltantes es usar el cuadro de diálogo Insertar marcador mientras el punto de inserción está dentro de un encabezado o pie de página. Word crea el marcador en ese rango de historia, no en el documento principal. El marcador aún existe, pero está oculto en la lista estándar de marcadores. VBA puede alcanzarlo iterando todos los rangos de historia.
Otro escenario son los marcadores dentro de un lienzo de dibujo o un cuadro de texto anclado a un párrafo. Estos marcadores pertenecen al rango de historia del cuadro de texto, no al documento principal. Solo enumerando los rangos de historia puede capturarlos.
Escribir una macro de VBA para iterar todos los marcadores en todos los rangos de historia
Necesita una macro de VBA que recorra cada rango de historia del documento y luego recorra los marcadores de cada rango. La macro a continuación imprime los nombres de los marcadores y su tipo de historia en la ventana Inmediato. Puede modificarla para realizar otras acciones, como eliminar, contar o copiar marcadores.
Paso 1: Abrir el Editor de VBA e insertar un módulo
- Abrir el Editor de Visual Basic
Presione Alt + F11 en Word para abrir el editor de VBA. - Insertar un nuevo módulo
En el Explorador de proyectos, haga clic con el botón derecho en el nombre de su documento o en Normal.dotm, elija Insertar y luego Módulo. Aparece una ventana de código en blanco.
Paso 2: Pegar la macro para iterar todos los marcadores
- Copiar el código de la macro
Copie el siguiente código de VBA en el módulo:Sub ListAllBookmarksAllStories() Dim rngStory As Range Dim bmk As Bookmark Dim storyType As String For Each rngStory In ActiveDocument.StoryRanges Select Case rngStory.StoryType Case wdMainTextStory: storyType = "Main Document" Case wdPrimaryHeaderStory: storyType = "Primary Header" Case wdFirstPageHeaderStory: storyType = "First Page Header" Case wdEvenPagesHeaderStory: storyType = "Even Pages Header" Case wdPrimaryFooterStory: storyType = "Primary Footer" Case wdFirstPageFooterStory: storyType = "First Page Footer" Case wdEvenPagesFooterStory: storyType = "Even Pages Footer" Case wdFootnotesStory: storyType = "Footnotes" Case wdEndnotesStory: storyType = "Endnotes" Case wdCommentsStory: storyType = "Comments" Case wdTextFrameStory: storyType = "Text Boxes / Frames" Case Else: storyType = "Other" End Select For Each bmk In rngStory.Bookmarks Debug.Print storyType & ": " & bmk.Name Next bmk Next rngStory End Sub - Ejecutar la macro
Presione F5 o haga clic en Ejecutar en la barra de herramientas. Cambie a la ventana Inmediato (Ctrl + G) para ver la lista de todos los marcadores con su tipo de historia.
Paso 3: Modificar la macro para otras acciones
Para eliminar todos los marcadores en partes ocultas, reemplace la línea Debug.Print con bmk.Delete. Para contarlos, incremente una variable contadora. Para copiar los nombres de los marcadores a un nuevo documento, recójalos en una matriz de cadenas y escríbalos en un documento aparte.
Problemas comunes al iterar marcadores ocultos
La macro no muestra marcadores aunque sé que existen
La causa más probable es que el marcador esté dentro de un cuadro de texto vinculado o una forma agrupada. La colección StoryRanges de Word no incluye las cadenas de cuadros de texto vinculados más allá del primero. Para llegar a los marcadores en cuadros de texto vinculados, debe seguir la propiedad NextStoryRange del rango de historia del marco de texto. Agregue un bucle que compruebe rngStory.NextStoryRange hasta que devuelva Nothing.
Los marcadores en comentarios no aparecen en la lista
Los comentarios tienen su propio rango de historia wdCommentsStory. La macro anterior lo incluye. Si aún no ve los marcadores de comentarios, asegúrese de que el comentario no esté dentro de un contenedor anidado, como un cuadro de texto colocado en el comentario. Ejecute la macro de nuevo después de seleccionar el área del comentario y comprobar el tipo de historia en la ventana Inmediato.
La macro devuelve nombres de marcadores duplicados
Word permite que el mismo nombre de marcador exista en diferentes rangos de historia. El cuadro de diálogo Marcadores estándar solo muestra el marcador de la historia principal. Cuando itera todas las historias, obtiene cada aparición. Para deduplicar, use un objeto Collection o Dictionary para almacenar nombres y omitir duplicados.
Rangos de historia de Word frente al cuadro de diálogo Marcadores: qué captura cada uno
| Elemento | ActiveDocument.Bookmarks | Enumeración StoryRanges |
|---|---|---|
| Cuerpo del documento principal | Sí | Sí |
| Encabezados y pies de página (todos los tipos) | No | Sí |
| Notas al pie y notas al final | No | Sí |
| Comentarios | No | Sí |
| Cuadros de texto y marcos (primero de la cadena) | No | Sí |
| Cuadros de texto vinculados más allá del primero | No | No (requiere NextStoryRange) |
| Formas de lienzo de dibujo | No | No (use la colección CanvasShapes) |
El cuadro de diálogo Marcadores estándar solo devuelve la primera fila. La enumeración StoryRanges cubre la mayoría de las áreas ocultas, pero no los cuadros de texto vinculados más allá del primero ni las formas de lienzo de dibujo. Para esos, necesita código de VBA adicional que use las colecciones CanvasShapes o InlineShapes.
Ahora puede escribir una macro de VBA que itere todos los marcadores de un documento de Word, incluidos los que están en encabezados, pies de página, cuadros de texto, comentarios y otras partes ocultas. La clave es usar ActiveDocument.StoryRanges y comprobar la colección Bookmarks de cada rango. Para los cuadros de texto vinculados, amplíe el bucle con NextStoryRange. Como siguiente paso, modifique la macro para exportar todos los nombres de marcadores y sus tipos de historia a una tabla en un nuevo documento para su auditoría. Un consejo avanzado: use la constante wdTextFrameStory combinada con un bucle Do While en NextStoryRange para capturar marcadores en cuadros de texto encadenados que la enumeración básica omite.