Macro para eliminar registros duplicados de un listado en Excel, a partir de un criterio especifico.

Le agradezco el tiempo que se tomen para resolver este problema.

Se necesita una macro que lea la columna H y reconozca fila por fila, 1 por 1, si se repite la información, en caso que coincida (supongamos la celda H10, H11 y H12) compare la información de la columna J de estas mismas filas(J10, J11y J12), en ella se encontraran revisiones (0, 1, 2, 3 ... Hasta la RZ) y deje únicamente la ultima revisión, eliminando las otras filas. Ejemplo:

                            Columna H                                                                Columna J

10                     A7714-AB-STR-0053-001                                                1

11                     A7714-AB-STR-0053-001                                                2

12                     A7714-AB-STR-0053-001                                                3

La macro deberá reconocer que las filas 10, 11 y 12 tienen el mismo contenido en la columna H, pero difieren en la columna J, eliminara las filas 10 y 11, dejando únicamente el valor más alto de la columna J, en este caso el 3 ( que vendría siendo la ultima revisión que se le hizo a ese documento).

Los valores de la columna J van de cero ( 0 ) hasta RZ, que es lo más alto. ( Ejemp. 0-1-2-3-4-5... RZ) RZ son las únicas letras que aparecerán en la columna J, el demás contenido, son números.

Espero haberme dado a entender y cualquier duda o comentario, estoy a sus ordenes. También les puedo enviar el archivo, de ser necesario.

Respuesta
1

¿La columna i esta vacía o tiene datos?

Tiene datos, pero esos no me interesan por este momento!!! 

Gracias.

La pregunta es relevante porque si la columna i esta vacía la macro que se ocupa es diferente a la que se ocuparía si la columna i tuviera datos, como tu caso es el segundo la macro que ocupas es esta (Después de la imagen)

Sub cortar_filas()
Dim unicos As New Collection
Set datos = Range("g10").CurrentRegion

With datos
filas = .Rows.Count: Columnas = .Columns.Count
.Sort key1:=Range(.Columns(2).Address), order1:=xlAscending, _
key2:=Range(.Columns(4).Address), order1:=xlDescending
For i = 1 To filas
codigo = .Cells(i, 2)
On Error Resume Next
unicos.Add codigo, CStr(codigo)
On Error GoTo 0
Next i
For j = 1 To unicos.Count
codigo = unicos.Item(j)
fila = WorksheetFunction.Match(codigo, .Columns(2), 0)
cuenta = WorksheetFunction.CountIf(.Columns(2), codigo)
If cuenta > 1 Then
Set registros = .Rows(fila).Resize(cuenta - 1)
With registros
.EntireColumn.AutoFit
.EntireRow.Delete
End With
End If
Next j
End With
End Sub

Si elimina las filas, pero al final solo me esta arrojando esto

Y solo eso... a que se deberá!?

Saludos.

Ya vi que sucedió... corrió bien en otro intento que hice, muy similar a tu ejemplo, pero una ultima modificación, la macro podrá reconocer tanto 1, 2, 3... rz como 01,02, 03 ... rz!? Ahí es donde esta el error.

Por lo demás, esta corriendo perfectamente!

Gracias!

Dejame te explico un poco que hace la macro.

Primero ordena la información por la columna H (ascendente) y luego por la columna i(descendente), después crea una lista (que tu no ves) de valores únicos de los valores repetidos de la columna H y con esa lista busca y cuenta cada uno de los elementos repetidos y resta el ultimo elemento el del numero más alto o RZ (que según yo) es la ultima revisión y borra los demás, ¿puedes ampliar la respuesta?, ¿Qué tiene que hacer con los datos de la columna i si son datos únicos? ¿O acaso hay también hay repetidos?

Hola james, si hay números repetidos en esta columna, porque lo que va a buscar la macro es, el numero de revisiones que hay para cada registro de la columna H, osea, en la columna H, encuentr a un registro " A7722-STR-001" supongamos... en la columna I, va a encontrar que a lo mejor para este registro, exiten revisiones 1, 2, 3 y rz. obviamente la macro solo dejara la revisión rz, eso si lo hace bien, cuando pase al siguiente registro, supongamos "A7722-STR-002".. también va a encontrar revisiones 1,2,3... y a lo mejor también una rz. este criterio aplica para cada uno de los registros que se encuentren en la columna H...

Te pido una disculpa por contestarte hasta este momento, tuve un inconveniente y salí casi toda la tarde de hoy, pero agradezco mucho tu trabajo y tu tiempo.

Saludos.

La macro sectoriza la información por código quedando como lo ves en la pantalla, por lo que la macro en automático descarta los 1,2,3,4,.. rz de los otros colores y los considera únicos para ese sector o color.

Le hice unos cambios a la macro, ya que la ordenación que inicialmente programe esta dando problemas haciendo que se borre lo que no debe, te incluyo la macro abajo de la pantalla. Ahora primero ordena por la columna H(ascendente) y luego cuando crea los sectores cada sector es ordenado descendentemente para dejar en primer lugar la revisión más reciente y luego hace un borrado al mismo tiempo de todos los sectores de las revisiones anteriores. (Nota no olvides evaluar mi respuesta).

la macro es esta:

Sub corta_borra()
Dim unicos As New Collection

Set datos = Range("g10").CurrentRegion

With datos
filas = .Rows.Count
.Sort key1:=Range(.Columns(2).Address), order1:=xlAscending
For i = 1 To filas
codigo = .Cells(i, 2)
On Error Resume Next
unicos.Add codigo, CStr(codigo)
On Error GoTo 0
Next i
For j = 1 To unicos.Count
codigo = unicos.Item(j)
cuenta = WorksheetFunction.CountIf(.Columns(2), codigo)
fila = WorksheetFunction.Match(codigo, .Columns(2), 0)
Set codigos = .Rows(fila).Resize(cuenta)
codigos.Sort key1:=Range(codigos.Columns(4).Address), order1:=xlDescending
Next j
.RemoveDuplicates Columns:=2, Header:=xlNo
End With
End Sub

1 respuesta más de otro experto

Respuesta
1

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas