martes, 28 de junio de 2016

VBA: Listar celdas con mismo formato.

Al hilo del post anterior (Búscar en Excel por formato) desarrollaremos hoy un proceso equivalente con programación...
La ventaja de emplear macros es que podemos recuperar las posiciones de las celdas para cualquier acción posterior.


Partimos de la misma hoja que el ejemplo anterior:

VBA: Listar celdas con mismo formato.



La clave de esta búsqueda es la propiedad .FindFormat, que nos habilita la búsqueda por formato de celda...

Insertamos el siguiente código dentro de un módulo estándar del explorador de proyectos del Editor de VB:

Sub EncontrarFormato()
'limpiamos cualquier anterior búsqueda por formato
'y aplicamos el color de relleno a buscar (amarillo:= 65535)
With Application.FindFormat
    .Clear
    .Interior.Color = 65535
End With
'localizamos la primera coincidencia por color de relleno
Dim CeldaPrimeraCoincidencia As Range
'buscamos en el rango definido A1:H20 empezando por A1....
Set CeldaPrimeraCoincidencia = Range("A1:H20").Find(What:="", _
    After:=Range("A1"), _
    LookIn:=xlFormulas, _
    LookAt:=xlPart, _
    SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, _
    MatchCase:=False, _
    SearchFormat:=True)     'la clave es poner TRUE en SearchFormat...

'si encontramos algo, seguimos la búsqueda...
Set rIgualFormato = Nothing
If Not CeldaPrimeraCoincidencia Is Nothing Then
    Dim CeldaActual As Range
    Set CeldaActual = CeldaPrimeraCoincidencia
    'entramos en el bucle de búsqueda
    Do
        'componemos un rango con las celdas de igual formato
        If rIgualFormato Is Nothing Then
            Set rIgualFormato = CeldaActual
        Else
            Set rIgualFormato = Union(rIgualFormato, CeldaActual)
        End If

        'empezamos una nueva búsqueda del formato
        'a partir de la celda anterior..
        Set CeldaActual = Range("A1:H20").Find(What:="", _
            After:=CeldaActual, _
            LookIn:=xlFormulas, _
            LookAt:=xlPart, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, _
            MatchCase:=False, _
            SearchFormat:=True)
    Loop Until CeldaActual.Address = CeldaPrimeraCoincidencia.Address
End If

'sacamos un Mensaje con el listado de celdas...
MsgBox rIgualFormato.Address
'y las dejamos seleccionadas
rIgualFormato.Select

End Sub



Al emplear .FindFormat no podemos emplear la propiedad .Next habitual en búsquedas por contenido, motivo por el cual, debemos aplicar un segundo método .Find igual al primero.. que replicaría la acción de 'buscar siguiente'.

Al ejecutar nuestra macro obtenemos:

VBA: Listar celdas con mismo formato.

No hay comentarios:

Publicar un comentario en la entrada