jueves, 17 de enero de 2013

VBA: Descubriendo celdas combinadas.

Días atrás un lector me preguntaba por alguna manera de localizar las Celdas combinadas de una de nuestras hojas de Excel, entendiendo que eran varias y dentro de un informe dificil de localizar a simple vista.
Fue entonces cuando recordé dos propiedades del método Range en VBA que nos servirán para tal efecto:
Range.MergeCells
Range.MergeArea

La primera de ellas Range.MergeCells nos indicará si es True o False que el rango indicado contiene o no 'Celdas combinadas'. Esto nos vendría bien para repasar diferentes celdas y determinar si ésta pertenece o no a un conjunto combinado.
Mientras que Range.MergeArea devuelve el rango combinado que contiene la celda especificada (si la celda especificada no está en un rango combinado, la propiedad devolverá la celda especificada).

Ambas propiedades nos servirán para recorrer el rango a anailizar y determinar si correponde a una Celda combinada, y en caso afirmativo, obtener la dirección del rango combinado.

Comenzaremos nuestro ejemplo disponiendo en nuestra hoja de trabajo algunas Celdas combinadas:

VBA: Descubriendo celdas combinadas.


Generamos nuestra macro, que incorporamos a un módulo del Explorador de proyectos del Editor de VBA:

Sub IdentificaCeldasCombinadas()
'inhabilitamos el refresco de pantalla
Application.ScreenUpdating = False
'controlamos un posible error, pasando al siguiente registro
On Error Resume Next

'recorremos cada celda del rango utilizado en la hoja de cálculo activa.
For Each celda In ActiveSheet.UsedRange
    'verificamoss si dicha celda corresponde a una Celda combinada
    If celda.MergeCells = True Then
        'aglutinamos la dirección de la celda
        'para mostrala posteriormente en un MsgBox
        mensaje = mensaje & celda.Address & Chr(10)
        'Modificamos la celda
        With celda
            'eliminando cualquier Comentario anterior
            .ClearComments
            'Añadimos uno nuevo...
            .AddComment
            '...donde insertamos un texto con la dirección del Rango combinado
            .Comment.Text Text:="Excelforo:" & Chr(10) & celda.MergeArea.Address
            'además le cambiamos el color de fondo a amarillo.
            .Interior.Color = vbYellow
            
        End With
    End If
Next
'Mostramos todos los Comentarios...
Application.DisplayCommentIndicator = xlCommentAndIndicator
'Mostramos el mensaje final,
'con todas las referencias de las celdas combinadas (individualmente)
MsgBox mensaje
'activamos el refresco de pantalla
Application.ScreenUpdating = True
End Sub



Tras ejecutar nuestra macro de Excel sobre la Hoja anterior, vemos el resultado en la siguiente imagen:

VBA: Descubriendo celdas combinadas.


En la imagen podemos ver, por un lado, el Cuadro de mensaje generado (MsgBox) con un listado de todas las celdas implicadas en alguna de las Celdas combinadas; por otro lado, directamente en al Hoja de cálculo vemos como todas las Celdas combinadas han cambiado el color de fondo por el amarillo y además se ha insertado un Comentario donde se incluye la dirección del rango combinada.

5 comentarios:

  1. Que puedo hacer, dado que la ventana del MsgBox, cuadro de mensajes generado, tiene demasiadas líneas y no puedo verlo en la pantalla de mi PC. Como puedo hacer para que muestre un scroll o varias columnas, o lo puedes reemplazar po un listbox.
    Agradezco la atención que me puedas brindar
    Gracias
    Jorge

    ResponderEliminar
    Respuestas
    1. Hola Jorge,
      no creo sea posible hacerlo en un msgbox, pero sí empleando un TextBox dentro de un Userform... asegúrate de marcar la propiedad multiline.

      Saludos

      Eliminar
  2. Buen día, he revisado éste tema y es el que mas/menos necesito, sin embargo, ¿cómo puedo hacer para que el número de fila inicial y final se almacenen en dos variables?, explico un poco, supongamos que el rango que me arrojó fue el $A$7:$A$10 y lo que necesito es que el valor 7 y 10 se almacenen en una variable, A=7 y B=10. Espero que alguien me pueda ayudar. De antemano, gracias por su ayuda y tiempo. Saludos

    ResponderEliminar
    Respuestas
    1. Hola,
      puedes usar las propiedades de un rango:
      .TopLeftCell
      .BottomRightCell
      para recuperar la fila primera y última (y la primera y última columna) de un rango
      SAludos

      Eliminar
    2. Muchas gracias por la respuesta, lo intentare y comento. Saludos

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.