¿Cómo eliminar filas duplicadas en tabla de Excel teniendo en cuenta algunas condiciones?

Estoy tratando de entender como hacer una macro en Excel que me elimine duplicados con condiciones especificas, a continuación muestro el ejemplo de lo que quiero hacer,

La tabla ejemplo que muestro a continuación es la tabla sin ningún proceso a resultado

Y la tabla ejemplo que muestro a continuación es la tabla con los resultados esperados a obtener

Las condiciones que quiero se procesen es esta tabla en una macro que elimine duplicados son estas

Hasta ahora tengo una muy buena macro que elimina duplicados, pero aun no he logrado modificarla para añadir estas condiciones en las líneas de código.

Les comparto la macro, es la siguiente:

Sub RepetidosVH()
    'Declaración del diccionario
    Dim dic As Scripting.Dictionary
    Set dic = New Scripting.Dictionary
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    Range("C3").Select
    Do While Not IsEmpty(ActiveCell)
        If dic.Exists(ActiveCell.Text) Then
            ActiveCell.EntireRow.Delete
        Else
            'En esta instrucción lo que interesa es almacenar el valor de la celda como key,
            'el dato equivalente al value no tiene importancia
            dic.Add ActiveCell.Text, "1"
            ActiveCell.Offset(1, 0).Select
        End If
    Loop
    'limpia los recursos utilizados
    dic.RemoveAll
    Set dic = Nothing
    Range("C3").Select
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

Les comparto el archivo de Excel donde esta el ejemplo que muestro anteriormente. https://drive.google.com/file/d/1KJkYZmBJP8zxgVrcS0NfxxnmZxV1xTr3/view?usp=sharing

1 respuesta

Respuesta
2

Tu macro no tienen ninguna de las 5 condiciones, solamente elimina duplicados y eso si están ordenados por color, como en tu ejemplo. Pero te preparo una nueva.

Revisando tus condiciones y tus ejemplos, me parece que no viene un ejemplo para esta condición:

**En la condición No. 3 en el caso de que el valor de COUNT_AREA sea igual en ambas filas duplicadas y este valor mayor a 9, solo se debe eliminar la fila asociada al valor 256 de la columna COLOR sin sumar la cantidad, quedando solo un registro único.

Puedes preparar un ejemplo para esa condición y el resultado esperado.

Hola, Dante Amor, agradezco tu interés por ayudarme con este post, en el siguiente link de Google Drive comparto el archivo Excel actualizado con la condición que me solicitas poner como ejemplo. https://drive.google.com/file/d/1iHRIkADwqeL6gU10dIEyEHp4378RAwFp/view?usp=sharing 

Prueba la siguiente macro, el resultado quedará a partir de la columna I.

Sub Eliminar_Duplicados_Con_Condiciones_v1()
  Dim a As Variant, b As Variant
  Dim dic1 As Scripting.Dictionary, dic2 As Scripting.Dictionary
  Dim sh1 As Worksheet
  Dim llave1 As String, llave2 As String, datos As String, datos2 As String
  Dim i As Long, j As Long, n As Double, m As Double
  Set dic1 = New Scripting.Dictionary
  Set dic2 = New Scripting.Dictionary
  Set sh1 = Sheets("VH")
  sh1.Range("I:N").ClearContents
  a = sh1.Range("B2", sh1.Range("G" & Rows.Count).End(3)).Value
  '1)COLOR 2)INTERNO_DE  3)CLASE_DEMA  4)COUNT_AREA  5)SUM_AREA  6)SUM_LENGTH
  For i = 1 To UBound(a, 1)
    llave1 = a(i, 2)
    llave2 = a(i, 1) & "|" & a(i, 2)
    datos = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
    If a(i, 1) <> 256 Then
      dic1(llave1) = datos
      dic2(llave2) = datos
    End If
  Next
  For i = 1 To UBound(a, 1)
    llave1 = a(i, 2)
    llave2 = a(i, 1) & "|" & a(i, 2)
    datos = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
    If a(i, 1) = 256 Then
      If dic1.Exists(llave1) Then
        Select Case a(i, 3)
        Case "PCC"
          'Nada
        Case "PCP", "PE"
          'Nada
        Case "PSP47A"
          '**En la condicion No. 1 en el caso de que la
          'CLASE_DEMA sea igual a PSP47A y el valor del SUM_AREA
          'asociado a la fila del COLOR 256 sea mayor al otro valor repetido,
          'no se deben eliminar ninguno de los dos valores.
          n = Split(dic1(llave1), "|")(4)
          If a(i, 5) > Split(dic1(llave1), "|")(4) Then
            dic2(llave2) = datos
          End If
        Case "RPA"
          'Si los valores de la columna INTERNO_DE estan duplicados 2 veces
          'y los valores de la columna CLASE_DEMA son igual a RPA,
          'se deben sumar las cantidades de la columna COUNT_AREA
          'y eliminar la fila asociada al valor 256 de la columna COLOR,
          'quedando solo un registro unico y consolidado.
            If Split(dic1(llave1), "|")(2) = "RPA" Then
              n = Split(dic1(llave1), "|")(3)
              If n = a(i, 4) And n > 9 Then
                '**En la condicion No. 3 en el caso de que el valor de
                'COUNT_AREA sea igual en ambas filas duplicadas y este valor
                'mayor a 9, solo se debe eliminar la fila asociada al valor 256
                'de la columna COLOR sin sumar la cantidad, quedando solo un registro unico.
                'Nada
              Else
                m = n + a(i, 4)
                datos2 = ""
                For j = 0 To 5
                  If j = 3 Then
                    datos2 = datos2 & m & "|"
                  Else
                    datos2 = datos2 & Split(dic1(llave1), "|")(j) & "|"
                  End If
                Next
                llave2 = Split(dic1(llave1), "|")(0) & "|" & Split(dic1(llave1), "|")(1)
                dic2(llave2) = Left(datos2, Len(datos2) - 1)
              End If
            End If
        Case "RV", "RE"
          '4. Si los valores de la columna INTERNO_DE estan duplicados 2 veces
          'y los valores de la columna CLASE_DEMA son igual a RV, RE,
          'se deben sumar las cantidades de la columna SUM_AREA
          'y eliminar la fila asociada al valor 256 de la columna COLOR,
          'quedando solo un registro unico y consolidado.
          Select Case Split(dic1(llave1), "|")(2)
            Case "RV", "RE"
            n = Split(dic1(llave1), "|")(4)
            m = n + a(i, 5)
            datos2 = ""
            For j = 0 To 5
              If j = 4 Then
                datos2 = datos2 & m & "|"
              Else
                datos2 = datos2 & Split(dic1(llave1), "|")(j) & "|"
              End If
            Next
            llave2 = Split(dic1(llave1), "|")(0) & "|" & Split(dic1(llave1), "|")(1)
            dic2(llave2) = Left(datos2, Len(datos2) - 1)
          End Select
        Case Else
          dic1(llave1) = datos
          dic2(llave2) = datos
        End Select
      Else
        dic1(llave1) = datos
        dic2(llave2) = datos
      End If
    End If
  Next
  Sh1. Range("I2"). Resize(dic2. Count).Value = Application. Transpose(dic2. Items)
  Sh1. Range("I2", sh1.Range("I" & Rows. Count).End(3)). TextToColumns sh1.Range("I2"), _
    XlDelimited, xlNone, False, False, False, False, False, True, "|"
End Sub

Hola Dante Amor, las líneas de la macro que me mandas funcionan muy bien, a excepción que en el resultado esperado no se proceso la condición anexa

En el siguiente link de Google Drive comparto el archivo Excel actualizado con la condición que menciono resaltada tanto en el resultado que la macro me arroja como en el resultado esperado donde se ve la diferencia.

https://drive.google.com/file/d/10lHvIEX6nXcecCcpogGSyaJdsZ0hrqJb/view?usp=sharing 

Nota: Seria posible que el resultado esperado quedara en el misma posición del rango B2:G, es decir, el lugar original de la tabla dado en la hoja VH.

Agradezco su gran colaboración y tiempo dedicado a este post. Saludos 

Prueba con esta:

Sub Eliminar_Duplicados_Con_Condiciones_v1()
  Dim a As Variant, b As Variant
  Dim dic1 As Scripting.Dictionary, dic2 As Scripting.Dictionary
  Dim sh1 As Worksheet
  Dim llave1 As String, llave2 As String, datos As String, datos2 As String
  Dim i As Long, j As Long, n As Double, m As Double
  '
  Set dic1 = New Scripting.Dictionary
  Set dic2 = New Scripting.Dictionary
  Set sh1 = Sheets("VH")
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  '
  a = sh1.Range("B3", sh1.Range("G" & Rows.Count).End(3)).Value
  sh1.Range("B3:G" & Rows.Count).ClearContents
  '1)COLOR 2)INTERNO_DE  3)CLASE_DEMA  4)COUNT_AREA  5)SUM_AREA  6)SUM_LENGTH
  For i = 1 To UBound(a, 1)
    llave1 = a(i, 2)
    llave2 = a(i, 1) & "|" & a(i, 2)
    datos = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
    If a(i, 1) <> 256 Then
      dic1(llave1) = datos
      dic2(llave2) = datos
    End If
  Next
  For i = 1 To UBound(a, 1)
    llave1 = a(i, 2)
    llave2 = a(i, 1) & "|" & a(i, 2)
    datos = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5) & "|" & a(i, 6)
    If a(i, 1) = 256 Then
      If dic1.Exists(llave1) Then
        Select Case a(i, 3)
        Case "PCC"
          'Nada
        Case "PCP", "PE"
          'Nada
        Case "PSP47A"
          '**En la condicion No. 1 en el caso de que la
          'CLASE_DEMA sea igual a PSP47A y el valor del SUM_AREA
          'asociado a la fila del COLOR 256 sea mayor al otro valor repetido,
          'no se deben eliminar ninguno de los dos valores.
          n = Split(dic1(llave1), "|")(4)
          If a(i, 5) > n Then
            dic2(llave2) = datos
          End If
        Case "RPA"
          'Si los valores de la columna INTERNO_DE estan duplicados 2 veces
          'y los valores de la columna CLASE_DEMA son igual a RPA,
          'se deben sumar las cantidades de la columna COUNT_AREA
          'y eliminar la fila asociada al valor 256 de la columna COLOR,
          'quedando solo un registro unico y consolidado.
            If Split(dic1(llave1), "|")(2) = "RPA" Then
              n = Split(dic1(llave1), "|")(3)
              If n = a(i, 4) And n > 9 Then
                '**En la condicion No. 3 en el caso de que el valor de
                'COUNT_AREA sea igual en ambas filas duplicadas y este valor
                'mayor a 9, solo se debe eliminar la fila asociada al valor 256
                'de la columna COLOR sin sumar la cantidad, quedando solo un registro unico.
                'Nada
              Else
                m = n + a(i, 4)
                datos2 = ""
                For j = 0 To 5
                  If j = 3 Then
                    datos2 = datos2 & m & "|"
                  Else
                    datos2 = datos2 & Split(dic1(llave1), "|")(j) & "|"
                  End If
                Next
                llave2 = Split(dic1(llave1), "|")(0) & "|" & Split(dic1(llave1), "|")(1)
                dic2(llave2) = Left(datos2, Len(datos2) - 1)
              End If
            End If
        Case "RV", "RE"
          '4. Si los valores de la columna INTERNO_DE estan duplicados 2 veces
          'y los valores de la columna CLASE_DEMA son igual a RV, RE,
          'se deben sumar las cantidades de la columna SUM_AREA
          'y eliminar la fila asociada al valor 256 de la columna COLOR,
          'quedando solo un registro unico y consolidado.
          Select Case Split(dic1(llave1), "|")(2)
            Case "RV", "RE"
            n = Split(dic1(llave1), "|")(4)
            m = n + a(i, 5)
            datos2 = ""
            For j = 0 To 5
              If j = 4 Then
                datos2 = datos2 & m & "|"
              Else
                datos2 = datos2 & Split(dic1(llave1), "|")(j) & "|"
              End If
            Next
            llave2 = Split(dic1(llave1), "|")(0) & "|" & Split(dic1(llave1), "|")(1)
            dic2(llave2) = Left(datos2, Len(datos2) - 1)
          End Select
        Case Else
          dic1(llave1) = datos
          dic2(llave2) = datos
        End Select
      Else
        dic1(llave1) = datos
        dic2(llave2) = datos
      End If
    End If
  Next
  Sh1. Range("B3"). Resize(dic2. Count).Value = Application. Transpose(dic2. Items)
  Sh1. Range("B3", sh1.Range("B" & Rows. Count).End(3)). TextToColumns sh1.Range("B3"), _
    XlDelimited, xlNone, False, False, False, False, False, True, "|"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas