Cómo usar VBA para manipular tablas de Word
🔍 WiseChecker

Cómo usar VBA para manipular tablas de Word

Tiene un documento de Word con tablas que necesitan formato repetitivo, entrada de datos o cambios estructurales. Editar cada tabla manualmente es lento y propenso a errores. Visual Basic for Applications (VBA) le permite automatizar estas tareas de tablas con código. Este artículo explica cómo escribir y ejecutar macros de VBA para seleccionar, modificar, formatear y rellenar tablas de Word.

Puntos clave: Automatizar tablas de Word con VBA

  • Alt+F11 para abrir el editor de VBA: Este es el espacio de trabajo principal donde se escriben y ejecutan las macros para manipular tablas.
  • Tables(Index) para hacer referencia a una tabla específica: Use el número de índice o la colección ActiveDocument.Tables para apuntar a la tabla correcta en el documento.
  • Cell(Row, Column).Range.Text para leer o escribir el contenido de una celda: Esta propiedad permite obtener o establecer el texto dentro de cualquier celda de tabla mediante programación.

ADVERTISEMENT

Qué puede hacer VBA con las tablas de Word

VBA (Visual Basic for Applications) es el lenguaje de macros integrado en las aplicaciones de Microsoft Office. En Word, VBA puede acceder a todos los objetos de un documento, incluidas las tablas, las filas, las celdas y sus propiedades de formato. Puede escribir una macro para aplicar un formato coherente en decenas de tablas, extraer datos de celdas a variables o crear tablas nuevas desde cero.

Antes de escribir cualquier código de VBA, debe habilitar la pestaña Desarrollador en Word. Vaya a Archivo > Opciones > Personalizar cinta de opciones y marque la casilla Desarrollador en el panel derecho. Esta pestaña le da acceso al editor de VBA, a la grabación de macros y a la configuración de seguridad de macros. También debe configurar la seguridad de macros para habilitar todas las macros o firmar digitalmente el código. Vaya a Archivo > Opciones > Centro de confianza > Configuración del Centro de confianza > Configuración de macros y elija Habilitar todas las macros.

Comprender el modelo de objetos de Word para tablas

El modelo de objetos de Word organiza las tablas en una jerarquía. El objeto Document contiene una colección Tables. Cada objeto Table contiene una colección Rows y una colección Columns. Cada Row contiene Cells, y cada Cell tiene una propiedad Range que contiene el texto y el formato. Se navega por esta jerarquía con la notación de punto en VBA. Por ejemplo, ActiveDocument.Tables(1).Cell(2, 3).Range.Text hace referencia al texto de la tercera columna de la segunda fila de la primera tabla del documento activo.

Los números de índice de las tablas, filas y columnas empiezan en 1, no en 0. Esto es diferente de muchos lenguajes de programación. Verifique siempre qué tabla es el índice 1 comprobando el orden en que aparecen las tablas en el cuerpo del documento. Las tablas que están dentro de estructuras anidadas, como encabezados o cuadros de texto, no se incluyen en la colección ActiveDocument.Tables.

Escribir y ejecutar una macro de VBA para editar tablas de Word

Siga estos pasos para crear una macro que seleccione una tabla, cambie su formato y actualice el contenido de las celdas. La macro de ejemplo agregará un borde a la primera tabla, pondrá en negrita la fila de encabezado e insertará una fórmula de suma en la última columna.

  1. Abrir el editor de VBA
    Presione Alt+F11 en Word. El editor de VBA se abre en una ventana independiente. Si el Explorador de proyectos no está visible, presione Ctrl+R para mostrarlo.
  2. Insertar un nuevo módulo
    En el Explorador de proyectos, haga clic con el botón derecho en Normal o en el nombre del documento. Seleccione Insertar > Módulo. Aparece una ventana de código en blanco.
  3. Escribir el código de la macro
    En la ventana del módulo, escriba el siguiente código:
    Sub FormatAndUpdateTable()
        Dim tbl As Table
        Dim r As Integer
        Dim c As Integer
        
        ' Reference the first table in the document
        Set tbl = ActiveDocument.Tables(1)
        
        ' Apply a solid border to the entire table
        With tbl.Borders
            .InsideLineStyle = wdLineStyleSingle
            .OutsideLineStyle = wdLineStyleSingle
            .InsideLineWidth = wdLineWidth050pt
            .OutsideLineWidth = wdLineWidth075pt
        End With
        
        ' Bold the first row (header row)
        For c = 1 To tbl.Columns.Count
            tbl.Cell(1, c).Range.Bold = True
        Next c
        
        ' Insert a sum formula in the last column, skipping the header
        For r = 2 To tbl.Rows.Count
            tbl.Cell(r, tbl.Columns.Count).Range.Text = "=SUM(LEFT)"
        Next r
        
        MsgBox "Table formatting and formulas applied."
    End Sub
  4. Ejecutar la macro
    Coloque el cursor en cualquier parte dentro del código de la macro y presione F5. Como alternativa, cierre el editor, vaya a Desarrollador > Macros, seleccione FormatAndUpdateTable y haga clic en Ejecutar.
  5. Guardar la macro para usarla en el futuro
    Para mantener la macro disponible en todos los documentos, guárdela en la plantilla Normal.dotm. En el editor de VBA, arrastre el módulo a Normal en el Explorador de proyectos. Guarde Normal.dotm cuando se le solicite.

Leer datos de una tabla con VBA

Para extraer datos de una tabla, recorra cada celda y almacene el texto en una matriz o escríbalo en otro documento. La siguiente macro copia todos los valores de las celdas de la primera tabla en un documento nuevo como texto sin formato, una línea por celda.

Sub ExportTableToText()
    Dim tbl As Table
    Dim r As Integer
    Dim c As Integer
    Dim newDoc As Document
    
    Set tbl = ActiveDocument.Tables(1)
    Set newDoc = Documents.Add
    
    For r = 1 To tbl.Rows.Count
        For c = 1 To tbl.Columns.Count
            newDoc.Content.InsertAfter _
                tbl.Cell(r, c).Range.Text & vbCrLf
        Next c
    Next r
End Sub

Esta macro crea un documento nuevo en blanco y anexa el texto de cada celda seguido de un retorno de carro. La propiedad Range.Text incluye un carácter marcador de celda (ASCII 13 o 7) al final. Para quitarlo, use la función Replace de VBA: Replace(tbl.Cell(r, c).Range.Text, vbCr, “”) o Chr(7).

Crear una tabla nueva desde cero

Puede crear una tabla completamente con VBA. La siguiente macro agrega una tabla de 5 filas y 3 columnas en la posición del cursor, rellena la fila de encabezado con nombres de columna y establece el ancho de las columnas.

Sub CreateNewTable()
    Dim tbl As Table
    Dim rng As Range
    
    Set rng = Selection.Range
    Set tbl = ActiveDocument.Tables.Add(rng, 5, 3)
    
    ' Set column widths
    tbl.Columns(1).Width = InchesToPoints(1.5)
    tbl.Columns(2).Width = InchesToPoints(2)
    tbl.Columns(3).Width = InchesToPoints(1.5)
    
    ' Fill header row
    tbl.Cell(1, 1).Range.Text = "Product"
    tbl.Cell(1, 2).Range.Text = "Quantity"
    tbl.Cell(1, 3).Range.Text = "Price"
    
    ' Apply header formatting
    For c = 1 To 3
        tbl.Cell(1, c).Range.Bold = True
        tbl.Cell(1, c).Shading.BackgroundPatternColor = wdColorGray25
    Next c
End Sub

ADVERTISEMENT

Errores comunes de VBA con tablas y cómo evitarlos

Error en tiempo de ejecución 5941: El miembro solicitado de la colección no existe

Este error se produce cuando se hace referencia a un índice de tabla que no existe. Por ejemplo, ActiveDocument.Tables(2) falla si el documento solo tiene una tabla. Compruebe siempre la propiedad Tables.Count antes de acceder a un índice específico. Use una instrucción If: If ActiveDocument.Tables.Count >= 2 Then.

El texto del rango de una celda incluye caracteres adicionales

La propiedad Range.Text de una celda devuelve el texto visible más dos caracteres ocultos: una marca de celda (ASCII 7) y un marcador de fin de celda. Al comparar o exportar valores de celdas, elimine estos caracteres con la función Replace o use la siguiente función auxiliar:

Function CleanCellText(cell As Cell) As String
    Dim raw As String
    raw = cell.Range.Text
    ' Remove the last two characters (cell mark and end-of-cell mark)
    CleanCellText = Left(raw, Len(raw) - 2)
End Function

La macro no se ejecuta en todas las tablas del documento

Si la macro solo procesa la primera tabla, es probable que no esté recorriendo la colección Tables. Use un bucle For Each para procesar todas las tablas:

Dim tbl As Table
For Each tbl In ActiveDocument.Tables
    ' Your code here
Next tbl

Los bordes de la tabla no aparecen después de ejecutar la macro

La propiedad Borders se aplica a todo el objeto de tabla. Si establece InsideLineStyle pero no OutsideLineStyle, los bordes exteriores pueden permanecer invisibles. Establezca siempre InsideLineStyle y OutsideLineStyle, y configure las propiedades LineWidth correspondientes. Use wdLineStyleSingle para una línea sólida.

Métodos de VBA para manipular tablas: manual frente a automatizado

Tarea Método manual Método de VBA
Agregar una fila Haga clic con el botón derecho en una fila > Insertar > Insertar filas debajo tbl.Rows.Add o tbl.Rows(2).Select seguido de Selection.InsertRowsBelow
Eliminar una columna Seleccione la columna > Clic con el botón derecho > Eliminar columnas tbl.Columns(3).Delete
Combinar dos celdas Seleccione las celdas > Pestaña Presentación > Combinar celdas tbl.Cell(1,1).Merge tbl.Cell(1,2)
Establecer el color de fondo de una celda Seleccione la celda > Sombreado en la pestaña Diseño de tabla tbl.Cell(2,1).Shading.BackgroundPatternColor = wdColorLightBlue
Ordenar los datos de una tabla Seleccione la tabla > Pestaña Presentación > Ordenar tbl.Sort ExcludeHeader:=True, FieldNumber:=1

Las macros de VBA pueden realizar estas tareas en decenas de tablas en segundos. Los métodos manuales requieren clics repetitivos y son propensos a errores humanos.

Ya sabe cómo escribir macros de VBA que seleccionan, formatean, leen y crean tablas de Word. Empiece grabando una macro sencilla con Desarrollador > Grabar macro para ver el código generado y, después, modifíquelo para apuntar a índices y propiedades de tablas específicos. Para tareas avanzadas, como combinar celdas de forma condicional o exportar datos de tablas a Excel, combine el objeto de tabla con el modelo de objetos de Excel mediante enlace anticipado. Pruebe siempre las macros en una copia del documento para evitar la pérdida de datos.

ADVERTISEMENT