Macro Excel: En un listado importado de un archivo txt necesito borrar la fila de la primera ocurrencia duplicada

Mi listado muestra en la columna A los nombre de diferentes trabajadores, en la columna B muestra cantidades de productos que vendieron en el dia. Sucede que el procedimiento no permite modificar ninguna entrada y si el trabajador reportó mal su cantidad, tiene que volver a reportar la cantidad correcta, quedando dos reportes para el mismo trabajador. Necesitamos que la macro borre la fila completa de la primera vez que se reporto.

Carlos Tejada 47

Luis Martinez 99

Alberto Suarez 76

Luis Martinez 80

Necesitamos que la fila que muestra Luis Martinez y 99 sea borrada completamente.

1 Respuesta

Respuesta
1

Te anexo la macro.

Cambia en la macro "Hoja1" por el nombre de tu hoja con datos.

Crea una hoja llamada "Hoja2" y ejecuta la macro

Sub Macro1()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.ClearContents
    h1.Columns("A:B").Copy h2.Range("A1")
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    With h2.Range("C1:C" & u)
        .FormulaR1C1 = "=COUNTIF(RC[-2]:R5C1,RC[-2])"
        .Value = .Value
    End With
    For i = u To 1 Step -1
        If h2.Cells(i, "C") > 1 Then
            h1.Rows(i).Delete
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Hola Dante, disculpame pero no te explique bien el contenido de la hoja que es como sigue:

Filas 1 a 4 hay un encabezado, los datos para la macro empiezan desde la 5 hacia abajo.

Las columnas son:

C1: ID,   C2: Area,   C3: Nombre   C4-C8: otra informacion no relevante como Cantidad, etc.

Entonces el "Nombre" duplicado a buscar está en la columna C y empieza desde la fila 5.

Gracias.

Te anexo la macro actualizada

Sub Macro1()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.ClearContents
    h1.Columns("C:C").Copy h2.Range("A1")
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    With h2.Range("C1:C" & u)
        .FormulaR1C1 = "=COUNTIF(RC[-2]:R5C1,RC[-2])"
        .Value = .Value
    End With
    For i = u To 5 Step -1
        If h2.Cells(i, "C") > 1 Then
            h1.Rows(i).Delete
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta.

Dante, la macro borró las dos primeras filas con valores duplicados, desde el tercer duplicado está dejando la primera ocurrencia y borrando las posteriores y siempre debe quedar el ultimo valor duplicado. Te adjunto unas cuantas lineas del archivo txt para que lo verifiques.

C 9558.0 2463 .513 705544.7 2186901.2 526.6 0.4
C 9558.0 2463 .813 705549.8 2186900.1 526.6 0.2
C 9558.0 2464 .213 705555.0 2186899.0 526.7 0.2
C 9558.0 2464 .513 705559.5 2186898.0 526.8 0.2
C 9558.0 2464 .813 705564.7 2186896.8 526.9 0.2
C 9558.0 2465 .213 705569.6 2186895.8 527.0 0.2
C 9558.0 2465 .513 705574.3 2186894.8 527.1 0.1
C 9558.0 2465 .813 705579.3 2186893.8 527.2 0.1
C 9558.0 2466 .213 705584.7 2186892.7 527.3 0.5
C 9558.0 2466 .513 705589.3 2186891.8 527.4 0.2
C 9558.0 2466 .813 705594.1 2186890.8 527.5 0.1
C 9558.0 2467 .213 705599.2 2186889.7 527.5 0.3
C 9558.0 2467 .513 705604.4 2186888.6 527.6 0.7
C 9558.0 2467 .813 705609.2 2186887.6 527.7 0.5
C 9558.0 2468 .21 3 705614.0 2186886.5 527.7 0.6
C 9558.0 2468 .51 3 705618.3 2186885.7 527.6 0.1
C 9558.0 2468 .81 3 705623.5 2186884.6 527.6 0.2

Un consejo para las siguientes consultas, pon tu información real desde un principio.

Te anexo la macro actualizada:

Sub Macro1()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("Hoja1")
    Set h2 = Sheets("Hoja2")
    h2.Cells.ClearContents
    u1 = h1.Range("C" & Rows.Count).End(xlUp).Row
    h1.Range("C5:C" & u1).Copy h2.Range("C5")
    u = h2.Range("C" & Rows.Count).End(xlUp).Row
    With h2.Range("D5:D" & u)
        .FormulaR1C1 = "=COUNTIF(R5C3:RC[-1],RC[-1])"
        .Value = .Value
    End With
    For i = u To 5 Step -1
        If h2.Cells(i, "D") > 1 Then
            h1.Rows(i).Delete
        End If
    Next
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta.

Dante, mi explicación fue para que se entienda más fácil, pero tienes razón, en un próximo problema mencionaré tal y como es desde un principio.

La macro sigue dejando la primera ocurrencia y borrando las posteriores. Necesito por favor que deje la ultima ocurrencia y borre las anteriores.

La macro completa es como sigue:

Sub COG()
'
' COG Macro
'
' Keyboard Shortcut: Ctrl+Shift+C
'
Range("A5:H20006").Select
Selection.ClearContents
Range("A5").Select
name_f = Application.GetOpenFilename("Archivos de sps (*.*),*.*", , "Abrir Archivo COG", , False)
If name_f = False Then
Exit Sub
End If
Workbooks.OpenText Filename:= _
name_f, Origin:=437, StartRow:=29, DataType:=xlFixedWidth, FieldInfo:=Array( _
Array(0, 1), Array(3, 1), Array(17, 1), Array(24, 1), Array(28, 1), Array(38, 1), Array(49, _
1), Array(56, 1), Array(73, 1)), TrailingMinusNumbers:=True
Range(Selection, Selection.End(xlDown)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Copy
Windows("CR macros.xlsm").Activate
ActiveSheet.Paste
Application.ScreenUpdating = False
Set h1 = Sheets("COG")
Set h2 = Sheets("Hoja2")
h2.Cells.ClearContents
u1 = h1.Range("C" & Rows.Count).End(xlUp).Row
h1.Range("C5:C" & u1).Copy h2.Range("C5")
u = h2.Range("C" & Rows.Count).End(xlUp).Row
With h2.Range("D5:D" & u)
.FormulaR1C1 = "=COUNTIF(R5C3:RC[-1],RC[-1])"
.Value = .Value
End With
For i = u To 5 Step -1
If h2.Cells(i, "D") > 1 Then
h1.Rows(i).delete
End If
Next
Application.ScreenUpdating = True
MsgBox "Fin"
' Range("D2:E2").Select
End Sub

Gracias.

Luis

En mis pruebas funciona la macro.

Envíame tu archivo con el que estás probando. En una hoja de excel pon el resultado esperado.

Mi correo [email protected]

En el asunto del correo escribe "luis martinez"

Va la macro actualizada

Sub COG()
'
' COG Macro
'
' Keyboard Shortcut: Ctrl+Shift+C
'
    Range("A5:H20006").Select
    Selection.ClearContents
    Range("A5").Select
    name_f = Application.GetOpenFilename("Archivos de sps (*.*),*.*", , "Abrir Archivo COG", , False)
    If name_f = False Then
        Exit Sub
    End If
    Workbooks.OpenText Filename:= _
        name_f, Origin:=437, StartRow:=29, DataType:=xlFixedWidth, FieldInfo:=Array( _
        Array(0, 1), Array(3, 1), Array(17, 1), Array(24, 1), Array(28, 1), Array(38, 1), Array(49, _
        1), Array(56, 1), Array(73, 1)), TrailingMinusNumbers:=True
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Windows("CR macros.xlsm").Activate
    ActiveSheet.Paste
'Por.Dante Amor
    Application.ScreenUpdating = False
    Application.StatusBar = False
    Set h1 = Sheets("COG")
    Set h2 = Sheets("Hoja2")
    h2.Cells.ClearContents
    u1 = h1.Range("C" & Rows.Count).End(xlUp).Row
    h1.Range("C5:C" & u1).Copy h2.Range("C5")
    u = h2.Range("C" & Rows.Count).End(xlUp).Row
    With h2.Range("D5:D" & u)
        .FormulaR1C1 = "=IF(COUNTIF(R5C3:RC[-1],RC[-1])>1,2,1)"
        .Value = .Value
    End With
    n = 5
    For i = u To 5 Step -1
        Application.StatusBar = "Procesando registro : " & n & " de : " & u
        n = n + 1
        If h2.Cells(i, "D") > 1 Then
            h1.Rows(i).delete
        End If
    Next
    Application.StatusBar = False
    Application.ScreenUpdating = True
    MsgBox "Fin"
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta.

Dante,

Espero que hayas pasado un bonita Navidad. Te comento que un amigo examinó tu macro e hizo una modificacion en la formula y ahora los primeros duplicados son borrados, quedando el ultimo. Me dijo que hizo que el borrado sea de abajo hacia arriba.

Tu fórmula es la que sigue:

.FormulaR1C1 = "=IF(COUNTIF(R5C3:RC[-1],RC[-1])>1,2,1)"

La fórmula corregida:

.FormulaR1C1 = "=COUNTIF(R" & 5 + u & "C3:RC[-1],RC[-1])"

Saludos,

Luis Martinez

La última macro que te envié funciona para lo que solicitaste. No olvides valorar la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas