Macro excel eliminar duplicados

Necesitaría crear una macro que me eliminará los duplicados pero de manera que se quedara con aquel que tuviera un valor más elevado.

Es decir en la columna A, tengo el nombre personas y en la columna B su edad. Quiero que me ordene la columna A por sus nombres y elimine todos menos el que tenga la columna B mayor.

Alguien podría ayudarme.

1 respuesta

Respuesta
1

¿Los datos que se repiten son los nombres?

Hola Luis

Los que se repiten son los nombres (columna A), pero quiero solo conservar la columna B mayor con el mismo A.

Gracias de antemano

Hola de nuevo Luis,

He probado el siguiente código:

Sub Eliminar_Repetidos_Anteriores()

Dim Nombres As String, Conc As String, Repetidos As String, Fila As Long

Nombres = Range(Range("a1"), Range("a65500").End(xlUp)).Address

Conc = Range(Nombres).Offset(, 1).Address

With Range(Nombres)

If .Rows.Count = Evaluate("Sum(1/CountIf(" & Nombres & "," & Nombres & "))") Then Exit Sub For Fila = 1 To .Rows.Count

If Application.CountIf(Range(Nombres), .Cells(Fila)) > 1 _

And .Cells(Fila).Offset(, 1) < Evaluate("Max(If(" & Nombres & "=""" & .Cells(Fila) & """," & Conc & "))") Then

If Repetidos <> "" Then Repetidos = Repetidos & ","

Repetidos = Repetidos & .Cells(Fila).Address

End If

Next

End With

If Repetidos <> "" Then Range(Repetidos).EntireRow.Delete

End Sub

Si hago una prueba con pocas filas me da ok, pero cuando pongo más de 50 filas me da un error 1004 en tiempos de ejecución : Error en el método 'Range' de objeto'_Global'

Gracias de antemano

Isoterma

Te mando mi solución, sigue mi ejemplo:

Tenemos las columnas A y B, en la A están los nombres y muchos de ellos están repetidos y en la columna B están las edades. Ejecutando esta macro te dejará solo el nombre de cada grupo con más edad.

Sub prueba()
'Por luismondelo
Range("a1").CurrentRegion.Sort key1:=Range("a1"), order1:=xlAscending, key2:=Range("b1"), order2:=xlDescending, Header:=xlYes, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Range("a2").Select
Do While ActiveCell.Value <> ""
valor = ActiveCell.Value
fila = ActiveCell.Row
contarsi = Application.WorksheetFunction.CountIf(Columns(1), valor)
If contarsi > 1 Then
Range(Cells(fila + 1, 1), Cells(fila + contarsi - 1, 2)).Delete
End If
Do While ActiveCell.Value = valor
ActiveCell.Offset(1, 0).Select
Loop
Loop
End Sub

recuerda finalizar la consulta

Te mando un saludo

Aclaración: En mi ejemplo los datos empiezan desde A1 hacia abajo ocupando el rango A1:¿B? En la fila 1 está el encabezado

Hola Luis,

Gracias por la macro, y perdona por la tardanza, el periodo vacacional nos trastoca a todos. Ahora va genial, lo ordena sin error cuando hay sólo las dos columnas. Pero en hoja de cálculo tenemos otras columnas como en C dirección, D teléfono, etc... Y cuando éstas están presentes entonces la macro se descontrola y no funciona correctamente.

Perdona por no haberlo comentado antes, si se puede solucionar sería ya el remate total!!!

Gracias de nuevo

Isoterma

Entonces la macro queda así:

Sub prueba()
'Por luismondelo
Range("a1").CurrentRegion.Sort key1:=Range("a1"), order1:=xlAscending, key2:=Range("b1"), order2:=xlDescending, Header:=xlYes, ordercustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
columna = range("iv1").end(xltoleft).column
Range("a2").Select
Do While ActiveCell.Value <> ""
valor = ActiveCell.Value
fila = ActiveCell.Row
contarsi = Application.WorksheetFunction.CountIf(Columns(1), valor)
If contarsi > 1 Then
Range(Cells(fila + 1, 1), Cells(fila + contarsi - 1, columna)).Delete
End If
Do While ActiveCell.Value = valor
ActiveCell.Offset(1, 0).Select
Loop
Loop
End Sub

recuerda finalizar la consulta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas