20 octubre, 2021

EXTRAER REGISTROS ÚNICOS DE UN RANGO DE DATOS

Aunque normalmente no tengo mucho tiempo, a veces entro en algunos foros de Excel y contesto algunas de las preguntas que realizan los lectores. Esto es muy positivo, siempre encuentras nuevas ideas para desarrollar y hechas una mano a otras personas.

La última consulta que respondí iba sobre la posibilidad de extraer registros únicos pero no de una columna sino de un rango de datos. Es decir, seleccionar un rango de celdas y extraer los registros únicos.

Esta tarea se puede hacer de varias formas, en esta ocasión lo implementaré con matrices en VBA y finalmente aplicaremos quitar duplicados.

Como siempre vamos a usar un ejemplo: voy a pegar varias columnas (tres, por ejemplo) sobre las que seleccionaré el rango sobre el que extraer la información:

EXTRAER REGISTROS UNICOS DE UN RANGO DE DATOS1

A continuación debemos pegar la macro que realizará el trabajo:

Sub EXTRAER_UNICOS()
'Definimos variables
Dim i As Long, fin As Long
Dim rng As Range, celda As Range
Dim final As Long
Dim matriz() As Variant
'Desactivamos actualización de pantalla
Application.ScreenUpdating = False
'Trabajamos con la hoja activa
With ActiveSheet
'Limpiamos datos en la columna E
.Columns("E:E").ClearContents
'Capturamos selección y contamos registros
i = 1
Set rng = Selection
fin = rng.Count
'Redimensionamos la matriz
ReDim matriz(1 To fin)
'Con un loop grabamos los datos de cada celda
'y los pasamos a la columna E

For Each celda In rng
matriz(i) = celda.Value
i = i + 1
Next celda
For i = LBound(matriz) To UBound(matriz)
.Cells(i, 5) = matriz(i)
Next i
'Eliminamos duplicados de la columna E
final = .Cells(Rows.Count, "E").End(xlUp).Row
'Si no hay datos en la columna E salimos del proceso
If final = 1 Then Exit Sub
.Range("E1:E" & final).RemoveDuplicates Columns:=1, Header:=xlNo
'Ordenamos los datos, centrados y ascendentes
With .Columns("E:E")
.Select
.HorizontalAlignment = xlCenter
End With
.Sort.SortFields.Clear
.Sort.SortFields.Add Key:=Range("E1:E" & final), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With .Sort
.SetRange Range("E1:E" & final)
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.Apply
End With
.Range("E1").Select
End With
Application.ScreenUpdating = True
End Sub

Ahora que ya tenemos la macro, solo tenemos que seleccionar los datos y pulsar en el botón de comando. El resultado lo pasará a la columna «E» o «5» (podéis especificar el destino que mejor se adapte a vuestras necesidades indicándolo en el código).

Y ya tenemos los datos:

EXTRAER REGISTROS UNICOS DE UN RANGO DE DATOS2

Dado que estamos trabajando con matrices, debéis tener en cuenta que tienen ciertos límites (por ejemplo, si seleccionamos toda la hoja, mostrará un error).

Y eso es todo por hoy, espero que os sea de utilidad. Por supuesto, en este ejemplo obtenemos los datos de una selección, pero se podría definir un rango perfectamente.

Descarga el archivo de ejemplo pulsando en: EXTRAER REGISTROS ÚNICOS DE UN RANGO DE DATOS

Comparte este post

12 comentario en “EXTRAER REGISTROS ÚNICOS DE UN RANGO DE DATOS

  1. Estupendo aporte. Una duda, qué parte del código he de cambiar, si quiero que los datos se copien a partir de la celda E2.
    Muchísimas gracias.

  2. Además, selecciones lo que selecciones, el resultado siempre es el mismo: del 1 al 24; es decir, al ejecutar la macro siempre da como números repetidos del número 1 al 24, ordenados de menor a mayor; aunque en la selección no existan números repetidos.

    1. Hola Miguel Ángel, perdona:

      Modifica las siguientes líneas en las que se indica E1 por E2

      .Sort.SortFields.Add Key:=Range("E2:E" & final), _

      .SetRange Range("E2:E" & final)

      Y en la que te comenté antes por:

      .Cells(i + 2, 5) = matriz(i)

      En la respuesta anterior te contesté por el móvil. Ahora lo he probado. La macro muestra números sin duplicados según lo que ordenes. No siempre muestra numeros del 1 al 24, depende el rango que selecciones.

      Saludos

  3. Realizadas las modificaciones que propones, efectivamente ahora copia a partir de la celda E2; pero me sigue copiando del 1 al 24, seleccione lo que seleccione. No lo entiendo, porque me dices que lo has comprobado y a ti te funciona correctamente. El archivo con el que trabajas es el mismo que el del ejemplo de la descarga?
    En cualquier caso, muchas gracias por tus amables respuestas

  4. Hola Miguel Ángel:

    Sí, es el mismo ejemplo de la descarga, por ejemplo si seleccionas 5 numeros te salen del 1 al 24? Si seleccionas todos los números te salen todos menos el 3 y el 6 que no existen, el resto de duplicados desaparecen.

    Y si seleccionas las celdas que quieras con repetidos te lo elimina y deja solo uno. Funciona correctamente.

    Saludos.

  5. Entendido, Segu; pero si lo que quisiera fuese que que de una selección de celdas cualquiera eliminara todos los repetidos que encuentre y en el listado no los incluyera, se podría hacer?
    Ejemplo: Seleccionamos A2:C3, como el único número repetido de esta selección sería el 1, que en el listado resultante lo eliminase; con lo cual su resultado sería: 2, 15, 17 y 19. Se podría adaptar este código, para conseguir esto con cualquier selección?

    1. Sí se podría, pero no sirve esta macro, hay que crear otro procedimiento distinto. En estos momentos tengo poco tiempo por estar con otras consultas, cuando puedo trato de resolverlo. Saludos.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies