'Opción 1
Sub FiltrarSKUPorFecha(): Application.ScreenUpdating = False
Dim ultimaFila As Long, fila As Long
Dim diccionarioSKU As Object
Dim listaEliminar As Object
Dim fechaActual As String, fechaSiguiente As String
Dim f As Variant
With Sheets("Consolidado")
ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row
' Crear diccionarios para comparar SKU y almacenar filas a eliminar
Set diccionarioSKU = CreateObject("Scripting.Dictionary")
Set listaEliminar = CreateObject("Scripting.Dictionary")
' Recorrer desde la primera fila hasta la penúltima
For fila = 2 To ultimaFila - 1
fechaActual = .Cells(fila, 1).Value
fechaSiguiente = .Cells(fila + 1, 1).Value
' Solo comparar la fecha actual con la siguiente (inmediatamente superior)
If fechaActual <> fechaSiguiente Then
diccionarioSKU.RemoveAll ' Limpiar el diccionario antes de llenarlo
' Guardar los SKU de la fecha siguiente (solo de la siguiente)
For f = fila + 1 To ultimaFila
If .Cells(f, 1).Value <> fechaSiguiente Then Exit For
diccionarioSKU(.Cells(f, 2).Value) = 1
Next f
' Revisar los SKU de la fecha actual y marcar los que deben eliminarse
For f = fila To 2 Step -1
If .Cells(f, 1).Value <> fechaActual Then Exit For
' Solo eliminar si el SKU no está en la fecha siguiente
If Not diccionarioSKU.exists(.Cells(f, 2).Value) Then
listaEliminar(f) = 1 ' Marcar fila para eliminar después
End If
Next f
' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha
Exit For
End If
Next fila
' Eliminar las filas marcadas sin afectar el bucle principal
For Each f In listaEliminar.keys
.Rows(f).Delete
Next
End With
MsgBox "Completado correctamente.", vbInformation
End Sub
'Opción 2
Sub FiltrarSKUPorFecha1(): Application.ScreenUpdating = False
Dim ultimaFila As Long, fila As Long
Dim listaEliminar As Collection
Dim fechaActual As String, fechaSiguiente As String
Dim f As Variant, i As Long
Dim SKUExiste As Boolean
With Sheets("Consolidado")
ultimaFila = .Cells(.Rows.Count, 1).End(xlUp).Row
' Inicializar la colección para marcar las filas a eliminar
Set listaEliminar = New Collection
' Recorrer desde la primera fila hasta la penúltima
For fila = 2 To ultimaFila - 1
fechaActual = .Cells(fila, 1).Value
fechaSiguiente = .Cells(fila + 1, 1).Value
' Solo comparar la fecha actual con la siguiente (inmediatamente superior)
If fechaActual <> fechaSiguiente Then
' Revisar los SKU de la fecha actual y marcar los que deben eliminarse
For f = fila To 2 Step -1
If .Cells(f, 1).Value <> fechaActual Then Exit For
' Comprobar si el SKU está en la fecha siguiente
SKUExiste = False
For i = fila + 1 To ultimaFila
If .Cells(i, 1).Value <> fechaSiguiente Then Exit For
If .Cells(i, 2).Value = .Cells(f, 2).Value Then
SKUExiste = True
Exit For
End If
Next i
' Si el SKU no se encuentra en la fecha siguiente, marcar para eliminar
If Not SKUExiste Then
listaEliminar.Add f ' Marcar fila para eliminar después
End If
Next f
' Ya no es necesario seguir buscando después de comparar la primera y la siguiente fecha
Exit For
End If
Next fila
' Eliminar las filas marcadas sin afectar el bucle principal
For Each f In listaEliminar
.Rows(f).Delete
Next f
End With
MsgBox "Completado correctamente.", vbInformation
End Sub
TABLA ELIMINAR.xlsm