martes, 10 de mayo de 2016

VBA: Listar valores repetidos en diferentes columnas.

Contestando la cuestión planteada por un lector respecto a la búsqueda de elementos repetidos dentro de un rango de celdas, distribuidos en varias columnas...
Tengo 4 columnas con nombres de personas y quiero extraer los nombres que se repiten 3 o más veces en todas las columnas…[]

Mi primera idea fue plantear la solución con funciones, pero la descarte por la complejidad de la fórmula. Por ese motivo emplee el siguiente código.


Para resolver nuestra cuestión en particular, insertamos el siguiente código dentro de un módulo estándar del explorador de proyectos del Editor de VB:

Sub Comparacion()
Dim Matriz() As String
Dim num As Long
'Creamos una colección con los elementos únicos
'para después proceder a su conteo y poder desestimar aquellos que no verifiquen
'las condiciones deseadas...
'(en nuestro caso, que se repitan más de tres veces)

Set Rng = Range("A1:D6")
'Generamos la colección
Set unicos = New Collection
'loop en todas las celdas y agregarlas a la coleccion
For Each celda In Rng
    'cuando encuentre un item repetido, daría un error
    'que salvamos con la instrucción On Error Resume Next
    On Error Resume Next
    'por tanto, nuestra coleccion solo agrega elementos no repetidos
    unicos.Add celda.Value, CStr(celda.Value)
    On Error GoTo 0
Next celda

'Preparamos una última matriz con los elementos repetidos
num = Int(unicos.Count)
ReDim Matriz(1 To num) As String
'y procedemos a la carga de la matriz
'de aquellos elementos repetidos más de tres veces
x = 1
For m = 1 To unicos.Count
    If WorksheetFunction.CountIf(Rng, unicos(m)) >= 3 Then
        Matriz(x) = unicos(m)
        x = x + 1
    End If
Next m

'Retornamos los elementos repetidos a la Hoja de cálculo
Range("F1:F" & num).Value = Application.Transpose(Matriz)
End Sub



La idea de la macro de Excel es sencilla, y ya empleada en alguna otra ocasión.
Identificamos una Collection con los nombres únicos de todo el rango, para a continuación ir realizando un conteo con la función COUNTIF (CONTAR.SI), y condicionar su aparición en nuestro listado final al número de veces que se repita.
Aquellos nombres repetidos más de tres veces los cargamos en una Array, desde donde finalmente lo llevamos a la hoja de cálculo.


En la imagen siguiente se ve el efecto final:

VBA: Listar valores repetidos en diferentes columnas.


No hay comentarios:

Publicar un comentario

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