Cómo Eliminar duplicados con base en criterio de otra celda?

Quiero generar una Macro que me permita hacer lo siguiente:

Estás serían mis instrucciones: Busca los valores repetidos en la columna A, si encuentra repetidos, ahora busca en la columna B, y si tiene el símbolo "#", elimina toda esa fila. Que se ejecute hasta haber recorrido todos los datos de la hoja de cálculo.

1 respuesta

Respuesta
1

Prueba con esta macro

Sub eliminar()
Dim unicos As New Collection
Set datos = Range("a1").CurrentRegion
With datos
    .Sort _
    key1:=Range(.Columns(1).Address), order1:=xlAscending, _
    key2:=Range(.Columns(2).Address), order1:=xlDescending
    For i = 1 To .Rows.Count
        On Error Resume Next
            unicos.Add .Cells(i, 1).Value, CStr(.Cells(i, 1).Value)
         On Error GoTo 0
    Next i
    For j = 1 To unicos.Count
        cuenta = WorksheetFunction.CountIfs(.Columns(1), unicos.Item(j), .Columns(2), "#")
        If cuenta > 1 Then
            fila = WorksheetFunction.Match(unicos.Item(j), Columns(1), 0)
            .Rows(fila).Resize(cuenta).EntireRow.Delete
        End If
    Next j
End With
End Sub

Hola James

Antes que nada, gracias por la pronta respuesta.

El código que me propones no hace exactamente lo que necesito. Lo explico nuevamente intentando ser más específico:

 Si en la columna A hay un valor repetido, ve a la columna B; y si en la columna B tiene el símbolo "#", entonces elimina toda la fila.

Como se puede ver en la imagen, la orden 100 está repetida, pero una NO tiene valor de fecha, por lo tanto ese valor debe ser eliminado. La orden 103 NO es repetida, por lo tanto ésta fila NO debe ser eliminada aunque no tenga fecha.

Espero haber sido más claro en lo que necesito.

Quedo al pendiente.

Este seria el resultado de la nueva macro, como ves elimino los repetidos con signo de # (100 y 104) respetando los que son únicos 103

La macro es esta

Sub eliminar()
Dim unicos As New Collection
Set datos = Range("a1").CurrentRegion
Set Funcion = WorksheetFunction
With datos
    .Sort _
    key1:=Range(.Columns(1).Address), order1:=xlAscending, _
    key2:=Range(.Columns(2).Address), order1:=xlDescending, Header:=xlYes
    For i = 2 To .Rows.Count
        On Error Resume Next
            unicos.Add .Cells(i, 1).Value, CStr(.Cells(i, 1).Value)
         On Error GoTo 0
    Next i
    For j = 1 To unicos.Count
    orden = unicos.Item(j)
    cuenta = Funcion.CountIf(.Columns(1), orden)
    fila = Funcion.Match(orden, .Columns(1), 0)
    If cuenta > 1 Then
        Set ordenes = .Rows(fila).Resize(cuenta)
        With ordenes
            cuenta2 = Funcion.CountIf(.Columns(2), "#")
            fila2 = Funcion.Match("#", .Columns(2), 0)
            .Rows(fila2).Resize(cuenta2).EntireRow.Delete
        End With
    End If
    Next j
End With
End Sub

¡Gracias! 

Hola James

La macro que me enviaste funciona a la perfección. Es justo lo que necesitaba.

Muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas