miércoles, 23 de febrero de 2022

53 - Autoajuste de filas en celdas combinadas

Son muchas las situaciones que encontraremos al trabajar con celdas combinadas. Una de ellas es la de ajustar el alto de filas.

En entrada de Febrero 2018 ya se publicaron varias macros resolviendo situaciones de esta índole, explicadas en videos 1 y 3 de mi canal.

NOTA: al continuación del siguiente ejemplo agrego otro caso: combinar cualquier rango de columnas seleccionando la celda del título. 

Aquí vamos a ver otro modo de resolverlo que utilizaremos en el modelo desarrollado desde el evento WorkSheets_Change.

Cuando se trata de tablas de mucho contenido sería conveniente rellenarla primero y así tenemos más visibles todos los datos y luego ejecutar el evento Before_Doble_Click.


 La macro se ejecutará al doble clic de cualquier celda dentro de la tabla.


Como se trata de un evento de hoja se colocará en el Editor, en el objeto HOJA donde tengamos nuestra tabla de datos.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Row < 4 Then Exit Sub

x = Range("A1").CurrentRegion.Rows.Count

'alto normal de la fila

alto = 15

'se recorre la tabla de datos

For i = 4 To x

    resulta = 0

    'se evalúa cuántos saltos de renglón existen en texto

    Set D = Cells(i, 4): Set E = Cells(i, 5)

    'ancho de cada col

    anchotexto = Len(D)

    anchocol = D.ColumnWidth + E.ColumnWidth

    If anchotexto > anchocol Then

        'calculo

        dif = (anchotexto - anchocol) / anchocol

        If dif <= 1 Then

            resulta = 2

        Else

            resulta = dif + 2

        End If

        'se asigna el alto obtenido

        If resulta > 0 Then Range("A" & i).RowHeight = (alto * resulta)

    End If

Next i

[D3].Select

End Sub


NUEVO EJEMPLO:  Al seleccionar con doble clic una celda combinada, la macro ajustará las columnas ocupadas, en todas las filas.  NO se necesita indicar en la macro de cuáles columnas se trata. Para un ejemplo como el de la siguiente imagen, se puede ejecutar tanto para el rango D:E o también J:L.


  Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'si la celda seleccionada no está combinada se cancela
If Target.MergeCells = False Then Exit Sub  
'cant de col del rango seleccionado
canti = Target.Count                        
'primera col del target
colx = Target.Column                        
'obtener el ancho total de las col combinadas, por ej: J:L
    For a = colx To colx + canti - 1
        anchocol = anchocol + Cells(1, a).ColumnWidth
    Next a
'total de filas de la tabla 
x = Range("A1").CurrentRegion.Rows.Count    
'alto normal de la fila 
alto = 15                                   
'se recorren todas las filas ocupadas a partir de la fila 4....AJUSTAR
For i = 4 To x
    resulta = 0
    'se evalúa cuántos saltos de renglón existen en texto
    Set D = Cells(i, colx)
    'ancho de cada col 
    anchotexto = Len(D)                     
    If anchotexto > anchocol Then
        'calculo
        dif = (anchotexto - anchocol) / anchocol
        If dif <= 1.5 Then                     'si son muchas col probar con <= 1
            If dif <= 0.4 Then                 'ajustar según el tamaño de la fuente
                resulta = 1
            Else
                resulta = 2
            End If
        Else
            resulta = dif + 2
        End If
        'se asigna el alto obtenido
        If resulta > 0 Then
            Range("A" & i).RowHeight = (alto * resulta)
            'si las celdas aún no tienen ajuste de texto, se agrega ahora
            With Cells(i, colx)
                .HorizontalAlignment = xlLeft
                .VerticalAlignment = xlCenter
                .WrapText = True
            End With
         End If
    End If
Next i
[A4].Select      'AJUSTAR
End Sub

 

El libro con el primer ejemplo puede descargarse desde aquí

Acceso al VIDEO Nº 53 desde aquí.







 

3 comentarios:

  1. Respuestas
    1. Hola Fran. ¿Podrías enviarme tu hoja para que vea su formato y si copiaste la macro correcta?. Son muchas las situaciones posibles por eso fui publicando ejemplos en diferentes videos. Quizás estás tomando una macro que no es para el formato de tu hoja. Mis correos aparecen en mi perfil o en la sección Contactos de mi web. Sdos!

      Borrar
  2. Hay 2 detalles que debes tener en cuenta. En el 2do ejemplo hay un bucle para calcular el ancho total de la celda combinada, que será la suma de todos los anchos de las columnas que se ocupan, no solamente la A y la P. En el libro encontrarás un comentario iniciado con EM:
    El segundo detalle es que este código (*) contempla el formato normal de la hoja. Si vas a Opciones de Excel, General, verás la fuente predeterminada, y el tamaño en mi caso es de 12. Como aquí aplicas una fuente de 20, lo que me pareció apropiado es sumarle a la variable 'dify', la suma de los intervalos de 12 a 20, o sea 4 más: dify = Round(dif) + 5 
    Por último no olvidar el zoom que puede cambiar el modo en que se ve el texto en una celda.
    Las macros se basan en el formato normal de una hoja. Por eso dejo varias líneas con el texto 'ajustar'. Tendrás que ir viendo en cada modelo cómo aplicar algún ajuste.
    Si fuese una Función, habría que pasarle varios argumentos además del alto de fila y ancho de columna, como ser: Tipo y tamaño de la fuente, zoom de la pantalla, alineación, sangría, etc.
    Ojalá Excel la incluya en alguna versión o alguien se anime y desarrolle una función para esto ;)

    ResponderBorrar