repetidos - Eliminar filas con datos duplicados VBA
macro para evitar duplicados en excel (2)
Estoy luchando con algo que debería ser bastante sencillo, sin embargo, he leído al menos 15 métodos para hacerlo y parece que no puedo hacerlo funcionar.
Aquí hay un conjunto de datos de muestra:
9:30:01 584.7
9:30:01 590
9:30:01 595
9:30:02 584.51
9:30:03 584.62
9:30:04 584.44
9:30:05 584.05
Solo quiero una fila por segundo, así que de las primeras 3 filas, solo una necesita permanecer. No me importa si es el primero o el último, pero el código que he estado usando mantiene el último, 595 en este caso.
La forma en que lo hago es con un ciclo for que borra el contenido de la fila que tiene el mismo tiempo que la fila debajo de él. Luego clasifico todo el rango.
Me imagino que hay una manera más simple de simplemente eliminar la fila adicional desde el principio. Sin embargo, cuando uso delete en el rango, en lugar de borrar, no eliminará todas las filas duplicadas.
Aquí es lo que quiero que sean los datos:
9:30:01 595
9:30:02 584.51
9:30:03 584.62
9:30:04 584.44
9:30:05 584.05
Necesito que esto suceda para toda la hoja. La hora es la columna B y los valores son la columna C.
Aquí está el código que estoy usando,
LastRow = ActiveSheet.UsedRange.row - 1 + _
ActiveSheet.UsedRange.Rows.Count
For RowNum = 2 To LastRow
If (Range("B" & RowNum) = Range("B" & RowNum + 1)) Then
Range("B" & RowNum).EntireRow.Clear
End If
Next RowNum
Range("A2:C" & LastRow).Sort key1:=Range("B2:B" & LastRow), _
order1:=xlAscending, Header:=xlNo
Esto debería funcionar:
Sub jzz()
Dim i As Long
For i = 1 To Cells.SpecialCells(xlLastCell).Row ''loop from row 1 to last row
If Cells(i, 1) <> vbNullString Then ''check if something is in the cell
If Cells(i, 1) = Cells(i + 1, 1) Then ''check if cell is the same as next cell
Cells(i + 1, 1).EntireRow.Delete ''if so; delete
i = i - 1 ''go back one row
End If
End If
Next i
End Sub
Otra opción es ir de abajo hacia arriba, así:
Sub jzz()
Dim i As Long
For i = Cells.SpecialCells(xlLastCell).Row to 1 step -1''loop from last row to row 1
If Cells(i, 1) <> vbNullString Then ''check if something is in the cell
If Cells(i, 1) = Cells(i + 1, 1) Then ''check if cell is the same as next cell
Cells(i + 1, 1).EntireRow.Delete ''if so; delete
End If
End If
Next i
End Sub
lo que prefieres usar si es personal. Por favor, considere la respuesta de Teylyn también, en esta situación, es muy útil.
No bucle. Use RemoveDuplicates. Mucho más rápido que cualquier bucle. Una linea de codigo
Sub test()
ActiveSheet.Range("B:C").RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
Editar: capturas de pantalla
ANTES DE
DESPUÉS
Editar: no funciona en Excel 2011 para Mac (ve figura).