Cómo escribir una macro de VBA de Word que recorra todas las tablas de un documento
🔍 WiseChecker

Cómo escribir una macro de VBA de Word que recorra todas las tablas de un documento

Tiene un documento de Word con muchas tablas y necesita aplicar un formato coherente, corregir la alineación o extraer datos de cada una. Editar cada tabla manualmente es lento y propenso a errores cuando tiene docenas o cientos de ellas. Una macro de VBA puede automatizar esta tarea recorriendo todas las tablas del documento y realizando la misma acción en cada una. Este artículo explica cómo escribir esa macro, abarcando los objetos esenciales, la estructura del bucle y los errores comunes que debe evitar.

Puntos clave: macro de VBA para recorrer todas las tablas de Word

  • Colección Tables y bucle For Each: Use ActiveDocument.Tables y For Each tbl In ActiveDocument.Tables para iterar sobre cada tabla del documento.
  • Objetos Cell y Range: Acceda a celdas individuales mediante tbl.Cell(Row, Column).Range y modifique el texto o el formato con el objeto Range.
  • Manejo de errores con On Error Resume Next: Evita que la macro se detenga si una tabla está vacía o tiene celdas combinadas que provocan un error en tiempo de ejecución.

ADVERTISEMENT

Comprender el modelo de objetos Table de Word en VBA

Word expone todas las tablas de un documento a través de la colección Tables. Cada tabla es un objeto Table que contiene una colección Rows y una colección Columns. El objeto Cell representa una celda y se accede a ella por índice de fila y columna. El objeto Range dentro de una celda contiene el texto y el formato que puede leer o modificar.

El bucle For Each es la forma más fiable de visitar cada tabla porque gestiona automáticamente el recuento de la colección. No necesita saber de antemano cuántas tablas existen. El bucle se ejecuta una vez por cada objeto de tabla de la colección Tables, independientemente de si las tablas están anidadas o situadas en encabezados y pies de página.

Requisitos previos para ejecutar macros de VBA

Antes de escribir la macro, asegúrese de que las macros estén habilitadas en Word. Vaya a Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Configuración de macros y seleccione Habilitar todas las macros o Habilitar macros de VBA. También necesita que la pestaña Desarrollador esté visible. Haga clic con el botón derecho en la cinta de opciones, seleccione Personalizar la cinta de opciones y marque la casilla Desarrollador en el panel derecho.

Escribir la macro principal para recorrer cada tabla

La siguiente macro recorre todas las tablas del documento activo y aplica una acción sencilla: pone en negrita la primera fila de cada tabla. Puede reemplazar el cuerpo del bucle por cualquier operación que necesite.

  1. Abrir el editor de VBA
    Pulse Alt + F11 en Word para abrir el editor de Visual Basic para Aplicaciones.
  2. Insertar un nuevo módulo
    En el panel Explorador de proyectos, haga clic con el botón derecho en Normal o en el nombre de su documento. Elija Insertar > Módulo. Aparece una ventana de código en blanco.
  3. Pegar el código de la macro
    Copie y pegue el siguiente código en la ventana del módulo:
    Sub BoldFirstRowOfAllTables()
        Dim tbl As Table
        Dim r As Integer
        Dim c As Integer
        
        On Error Resume Next
        
        For Each tbl In ActiveDocument.Tables
            ' Bold all cells in the first row
            For c = 1 To tbl.Columns.Count
                tbl.Cell(1, c).Range.Bold = True
            Next c
        Next tbl
        
        On Error GoTo 0
        
        MsgBox "Done. Processed " & ActiveDocument.Tables.Count & " tables."
    End Sub
  4. Ejecutar la macro
    Pulse F5 mientras el cursor está dentro de la macro, o vaya a la pestaña Desarrollador y haga clic en Macros. Seleccione BoldFirstRowOfAllTables y haga clic en Ejecutar.

La macro usa On Error Resume Next para omitir las tablas que provocan errores, como aquellas con celdas combinadas que hacen que Cell(1, c) no sea válido. Después del bucle, On Error GoTo 0 restaura el manejo de errores normal. El cuadro de mensaje muestra cuántas tablas se encontraron.

Modificar el bucle para realizar otras acciones

Puede reemplazar el bucle For c interno por cualquier operación de tabla. Algunos ejemplos comunes son:

  • Cambiar el color de fondo de la celda: tbl.Cell(r, c).Shading.BackgroundPatternColor = wdColorLightYellow
  • Establecer el ancho de columna: tbl.Columns(1).Width = InchesToPoints(2)
  • Quitar bordes: tbl.Borders.Enable = False
  • Alinear el texto en todas las celdas: tbl.Range.ParagraphFormat.Alignment = wdAlignParagraphCenter

Para recorrer cada celda de cada tabla, use un bucle For r y For c anidado sobre tbl.Rows.Count y tbl.Columns.Count.

ADVERTISEMENT

Problemas comunes al recorrer tablas

La macro se detiene con un error en tiempo de ejecución en una tabla específica

La causa más frecuente son las celdas combinadas. Cuando una celda abarca varias filas o columnas, el objeto Cell puede no existir en las coordenadas esperadas. La instrucción On Error Resume Next omite este error. Si necesita procesar celdas combinadas, use la colección tbl.Range.Cells en lugar de la indexación por fila y columna, pero tenga en cuenta que esta colección cuenta todas las celdas, incluidas las que forman parte de una combinación.

La macro no procesa las tablas de encabezados ni pies de página

ActiveDocument.Tables solo incluye las tablas del cuerpo principal del documento. Para incluir tablas en encabezados, pies de página, cuadros de texto o notas al pie, debe acceder a cada rango de historia. Una macro más avanzada recorrería ActiveDocument.StoryRanges y comprobaría la colección Tables de cada rango.

La macro se ejecuta lentamente en documentos con muchas tablas

Word actualiza la pantalla después de cada operación de forma predeterminada. Agregue Application.ScreenUpdating = False al inicio de la macro y Application.ScreenUpdating = True al final para acelerarla significativamente. También desactive el cálculo automático con Application.Calculation = wdCalculationManual si su macro modifica campos.

ActiveDocument.Tables vs Selection.Tables: diferencias de ámbito

Elemento ActiveDocument.Tables Selection.Tables
Ámbito Todas las tablas del cuerpo principal del documento activo Solo las tablas que intersecan la selección actual
Caso de uso Formato global o extracción de datos en todo el documento Acción dirigida a una o unas pocas tablas que el usuario ha resaltado
Riesgo de error Puede fallar en tablas de encabezados o cuadros de texto a menos que se incluyan los rangos de historia Requiere que el usuario seleccione las tablas manualmente antes de ejecutar la macro
Rendimiento Más lento en documentos con cientos de tablas Más rápido porque procesa solo el subconjunto seleccionado

Elija ActiveDocument.Tables cuando necesite aplicar un cambio a todas las tablas sin intervención manual. Use Selection.Tables cuando quiera que el usuario controle qué tablas se ven afectadas.

Ahora tiene una macro de VBA funcional que recorre todas las tablas de un documento de Word. Empiece probando la macro de ejemplo en una copia de su documento. Una vez que confirme que funciona, reemplace el bucle interno con su lógica específica de formato o extracción de datos. Para documentos con tablas en encabezados o pies de página, amplíe la macro para iterar a través de ActiveDocument.StoryRanges. Agregue Application.ScreenUpdating = False para acelerar el procesamiento cuando tenga más de 50 tablas.

ADVERTISEMENT