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.
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.
- 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. - 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. - 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 - 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. - 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
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.