Definir ancho de columnas de tablas Word mediante código VBA

Liloj -  
yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   -
Sí, es posible. Aquí tienes un código VBA que ajusta las anchuras de las columnas para todos los cuadros de tabla en un documento de Word seleccionado, aplicando las medidas que indicas, y fusionando la primera fila de cada tabla:

Sub AjustarColumnasTablaSeleccionadas()
Dim tbl As Table
Dim i As Integer
Dim targetWidth(1 To 5) As Single
Dim firstRowMerged As Boolean

' Dimensiones en centímetros
' Convertir a puntos (1 cm = 28.3465 puntos)
targetWidth(1) = 1.7 * 28.3465
targetWidth(2) = 1.6 * 28.3465
targetWidth(3) = 1.0 * 28.3465
targetWidth(4) = 3.0 * 28.3465
targetWidth(5) = 1.8 * 28.3465

' Normalmente la primera fila no está fusionada; si se desea fusionar
' la primera fila de cada tabla, se ajusta en el bucle.

For Each tbl In ActiveDocument.Tables
' Asegurarse de que la tabla tiene al menos 5 columnas
If tbl.Columns.Count >= 5 Then
' Fusionar la primera fila entre las columnas 1 a 5 (si se desea)
With tbl.Rows(1)
.Cells(1).Merge MergeTo:=.Cells(5)
End With
' Establecer anchos de columna (columna 1 a 5)
For i = 1 To 5
tbl.Columns(i).Width = targetWidth(i)
Next i
End If
Next tbl
End Sub

Notas:
- El código fusiona la primera fila de cada tabla de la forma: celda(1) a celda(5) de la fila 1.
- Las anchuras se fijan en centímetros tal como indicas: 1,7 cm, 1,6 cm, 1 cm, 3 cm y 1,8 cm.
- El valor de conversión a puntos se usa para establecer el ancho; Word maneja puntos internamente.
- Si no quieres fusionar la primera fila, elimina la sección de Merge.

Para usar:
1) Abre Word, pulsa Alt+F11 para abrir el Editor de VBA.
2) Inserta un módulo nuevo y pega el código.
3) Cierra el editor y ejecuta la macro AjustarColumnasTablaSeleccionadas desde Macros.

Si necesitas que la macro opere solo en tablas seleccionadas o en rangos específicos, dímelo y te adapto el código.

7 respuestas

  1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   Embajador 1 588
     
    hola, creo que puedes descubrir fácilmente cómo hacer eso grabando, en Word, una macro mientras manipulas los anchos de columna.
    0
  2. Liloj
     
    Hola,
    Entonces lo intenté, pero con el grabador de macros en Word no logro seleccionar elemento tras elemento y hacer las manipulaciones; me parece que con el modo automático no se puede hacer lo que quiero :(

    Es por eso que busco un código en Visual Basic, pensaba que me las arreglaría ya que uso VBA con Excel con regularidad ... pero me quedo atascado :-S
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      ¿Has obtenido una macro? Allí verás código VBA del que podrás inspirarte para modificar tu código VBA en Excel.
      0
      1. Liloj > yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención  
         
        Sub Format_colonnes()
        ' Format tbl
        For Each colonne In ActiveDocument.Tables_
        .Columns(1).Width = CentimetersToPoints(1.7)
        .Columns(2).Width = CentimetersToPoints(1.6)
        .Columns(3).Width = CentimetersToPoints(1)
        .Columns(4).Width = CentimetersToPoints(3)
        .Columns(5).Width = CentimetersToPoints(1.8)
        Next

        End Sub
        0
      2. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588 > Liloj
         
        efectivamente, obtengo el mismo tipo de código cuando guardo una macro en Word.
        ¿por qué eso no te conviene?
        0
  3. Liloj
     
    Bien, no funciona, debo haberme equivocado en algún lugar, me da: error de compilación, referencia incorrecta o no calificada

    He estado dándole vueltas pero no logro entenderlo.
    0
  4. Liloj
     
    Lo siento por mi respuesta tardía, tenía urgencias que atender :-S
    Espero que mi uso de las etiquetas sea correcto.
    Sin línea indicada, es solo anotado error de compilación: se esperaba una función o variable
    Es la primera vez que veo este código de error, es lo que me hace pensar que probablemente me equivoqué en la sintaxis del código

    ¡Gracias de nuevo por tu ayuda!

    Sub Format_colonnes() ' ' Format tbl For Each colonne In ActiveDocument.Tables_ .Columns(1).Width = CentimetersToPoints(1.7) .Columns(2).Width = CentimetersToPoints(1.6) .Columns(3).Width = CentimetersToPoints(1) .Columns(4).Width = CentimetersToPoints(3) .Columns(5).Width = CentimetersToPoints(1.8) Next End Sub
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      debería haber una línea resaltada en el momento en que ocurre el error.
      probaría más bien:
      option explicit Sub Format_colonnes() ' ' Formato tbl dim tb as table For Each tb In ActiveDocument.Tables tb.Columns(1).Width = CentimetersToPoints(1.7) tb.Columns(2).Width = CentimetersToPoints(1.6) tb.Columns(3).Width = CentimetersToPoints(1) tb.Columns(4).Width = CentimetersToPoints(3) tb.Columns(5).Width = CentimetersToPoints(1.8) Next tb End Sub
      0
  5. Liloj
     
    esta vez sí tengo una línea subrayada... código de error '5992' en la línea siguiente:

    tb.Columns(1).Width = CentimetersToPoints(1.7)

    no logro entender...
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      ¿ningún mensaje que acompañe el error 5992?
      0
  6. Liloj
     
    No se pueden acceder a columnas individuales de esta colección porque la tabla tiene celdas de diferentes anchuras.
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      me parece claro: la tabla no tiene el mismo número de columnas en todas las filas.

      el código trabaja sobre todas las tablas del documento. si quieres trabajar sobre todas las tablas seleccionadas, intenta reemplazar
      ActiveDocument
      por
      selection
      .
      0
  7. Liloj
     
    Me equivoqué, mis primeras líneas estaban fusionadas :-s pero he solucionado fácilmente ese problema gracias a tu comentario.

    ¡Muchas gracias por tu ayuda!

    Tengo un pequeño problema más con VBA pero Excel, ¿debería abrir un nuevo hilo/post o continuar en este?

    ¡En cualquier caso, muchas gracias de nuevo!
    0
    1. yg_be Mensajes publicados 23437 Fecha de registro   Estado Colaborador Última intervención   1 588
       
      es preferible marcar esto como resuelto y abrir una nueva conversación.
      0