TRABAJAR CON REGISTROS DUPLICADOS

Los registros duplicados son uno de esos elementos que conviene controlar bien cuando trabajando con bases de datos. El no tenerlos en cuenta ocasiona errores en las cifras que luego arrastraremos al resto de nuestro trabajo.

Personalmente ya tengo llevado algún susto por culpa de los duplicados en mis bases de datos, suelen aparecer porque cuando extraemos información de algún sistema, por motivos almacenamiento y datos históricos, se genera este tipo de datos.

Los registros duplicados los podemos encontrar o bien en un rango vertical (columnas) o bien en un rango horizontal (filas). Normalmente cuando hablamos de filas nos referimos a la repetición de varias filas y cuando hablamos de columnas nos referimos a celdas de ese rango, ejemplo: una columna con 500 números de documentos de identidad y necesitamos comprobar si alguno de ellos está repetido.

Para realizar un ejemplo, he creado una tabla usando números aleatorios y luego he repetido varias filas, de forma que así podamos ver cómo funcionan algunas macros:

TRABAJAR CON REGISTROS DUPLICADOS

Imaginad que queremos detectar y marcar en rojo los registros que se repiten en cada columna, para hacerlo podemos utilizar la siguiente macro:

Sub marcarduplicadoscolumnas()
Dim i As Double
'Definimos las columnas que queremos analizar y marcar elementos duplicados
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
'Definimos el rango de cada columnas, desde la celda 1 hasta el final de la hoja
Range(Cells(2, i), Cells(65536, i)).Select
'Indicamos para cada columna y rango seleccionado el mismo proceso mediante un bucle
'donde debe encontrar las celdas que se repitan en cada columna y marcarlas en rojo.
With Selection
'borramos formatos condicionales previos
.FormatConditions.Delete
'utilizamos el método FormatConditions.AddUniqueValues para detectar
'valores unicos o duplicados
.FormatConditions.AddUniqueValues
'seleccionamos y marcamos en rojo los valores duplicados
.FormatConditions(1).DupeUnique = xlDuplicate
.FormatConditions(1).Interior.Color = vbRed
End With
Next
End Sub

Este es el resultado:

TRABAJAR CON REGISTROS DUPLICADOS_1

Como podéis ver, la macro marca las celdas que se repiten en cada columna. Sin duda es un ejercicio interesante para comprobar si tenemos duplicados en nuestra base de datos, pero lo realmente importante es poder contar con un proceso que elimine aquellos registros que se repiten y solo deje los únicos, es decir que si, por ejemplo, el 172 se repite dos veces, tan solo quede una.

Con esta macro que os dejo se eliminan todos los duplicados de cada columna, aquí la tenéis:

Sub eliminarduplicadoscolumnas()
Dim i As Double
'Definimos las columnas que queremos analizar y marcar elementos duplicados
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
'Definimos el rango de cada columnas, desde la celda 1 hasta el final de la hoja
For i = 1 To fin
Range(Cells(1, i), Cells(65536, i).End(xlDown)).Select
'Indicamos para cada columna y rango seleccionado el mismo proceso mediante un bucle
'donde con el método .RemoveDuplicates elimnaremos las celdas repetidas en cada columna
With Selection
.RemoveDuplicates Columns:=1, Header:=xlYes
End With
Next
End Sub

Una vez aplicado el código, todos los registros duplicados en las columnas desaparecerán, así:

TRABAJAR CON REGISTROS DUPLICADOS_2

Siguiendo con este ejercicio, podemos considerar que también nos podemos encontrar con registros duplicados en filas. Utilizando la misma base de datos, podemos realizar una búsqueda mediante la siguiente macro:

Sub marcarduplicadosfilas()
Dim i As Double
'Definimos las fila que queremos analizar y marcar elementos duplicados
fin = Application.CountA(Worksheets("Hoja1").Range("A:A"))
For i = 2 To fin
'Definimos el rango de cada fila, desde la celda 1 hasta el final de la hoja
Range(Cells(i, 1), Cells(i, 256)).Select
'Indicamos para cada fila y rango seleccionado el mismo proceso mediante un bucle
'donde debe encontrar las celdas que se repitan en cada fila y marcarlas en azul.
With Selection
'borramos formatos condicionales previos
.FormatConditions.Delete
'utilizamos el método FormatConditions.AddUniqueValues para detectar
'valores unicos o duplicados
.FormatConditions.AddUniqueValues
'seleccionamos y marcamos en azul los valores duplicados
.FormatConditions(1).DupeUnique = xlDuplicate
.FormatConditions(1).Interior.Color = vbBlue
End With
Next
End Sub

Una vez que ejecutado el procedimiento, marcará de azul aquellas celdas que se encuentre duplicadas en la misma fila, así:

TRABAJAR CON REGISTROS DUPLICADOS_3

Ahora lo lógico sería contar con una macro que nos permita eliminar estos registros, pero al estar trabajando con filas, el proceso de eliminación no es igual, es decir, solo se pueden eliminar aquellas filas que se duplican, no las celdas individualmente. Para el caso que nos ocupa, la fila que se duplica y debería desaparecer sería la que contiene el valor “172”. Esta es la macro que debemos utilizar:

Sub eliminarfilasduplicadas()
'Seleccionar todo el rango rectangular de los datos
Worksheets("Hoja1").Range("A1").CurrentRegion.Select
'eliminamos solo aquellas filas completas que están duplicadas
'el método no permite eliminar celdas individuales por filas, solo por columnas
With Selection
.RemoveDuplicates Columns:=1, Header:=xlYes
End With
End Sub

Y el resultado es el siguiente:

TRABAJAR CON REGISTROS DUPLICADOS_4

La fila que estaba duplicada es eliminada por la macro y queda la fila única junto con las otras celdas que se repiten de forma independiente.

Acabamos de ver cuatro macros que son interesante y que se pueden complementar entre ellas. Para que podáis experimentar con cada una, os las dejo todas juntas en la misma hoja:

TRABAJAR CON REGISTROS DUPLICADOS_5

Además también os dejo una quinta macro para eliminar los formatos de color de fondo de las celdas, que resulta útil a la hora de realizar pruebas:

Sub borrarformatos()
'volvemos a realizar el mismo proceso que con las columnas pero
'solo para eliminar los formatos condicionales
Dim i As Double
fin = Application.CountA(Worksheets("Hoja1").Range("1:1"))
For i = 1 To fin
Range(Cells(2, i), Cells(65536, i)).Select
With Selection
.FormatConditions.Delete
End With
Next
End Sub

Y con estos acabamos con los ejercicios relacionados con los registros duplicados. Espero que os haya gustado y que lo podáis aplicar a vuestros procesos para comprobar y si procede limpiar de elementos duplicados la base de datos 🙂

Descarga el archivo de ejemplo pulsando en: TRABAJAR CON REGISTROS DUPLICADOS

Anuncios

¿Te ha gustado?. Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s