Sub test()
Dim a, i As Long, dif, n As Long, flg As Boolean, dic As Object, TBC As Object
Set dic = CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
Set TBC = CreateObject("Scripting.Dictionary")
a = Sheets("Example 2 Before").Cells(1).CurrentRegion.Value: n = 1
For i = 2 To UBound(a, 1)
flg = a(i, 4) <> "TBC"
If Not flg Then
dif = Round(CDbl(a(i, 8)), 5)
Else
If a(i, 5) = Empty Then
dif = a(i, 8)
Else
dif = Round(Abs(CDbl(a(i, 8)) - CDbl(a(i, 5))), 5)
End If
End If
CheckData a, IIf(flg, dic, TBC), i, n, dif, flg
Next
Sheets.Add.Cells(1).Resize(n, UBound(a, 2)).Value = a
End Sub
Private Sub CheckData(a, dic As Object, i As Long, n As Long, dif, flg As Boolean)
Dim ii As Long, w, flg1 As Boolean
If flg Then
If Not dic.exists(a(i, 6)) Then
n = n + 1: dic(a(i, 6)) = Array(n, dif, a(i, 7))
For ii = 1 To UBound(a, 2)
a(n, ii) = a(i, ii)
Next
Else
w = dic(a(i, 6))
If IsDate(w(1)) Then
flg1 = w(1) < dif + ((w(1) = dif) * (w(2) > a(i, 7)))
Else
flg1 = (w(1) > dif) + ((w(1) = dif) * (w(2) > a(i, 7)))
End If
If flg1 Then
For ii = 1 To UBound(a, 2)
a(w(0), ii) = a(i, ii)
Next
w(1) = dif: w(2) = a(i, 7): dic(a(i, 6)) = w
End If
End If
Else
If Not dic.exists(a(i, 6)) Then
n = n + 1: dic(a(i, 6)) = Array(n, dif)
For ii = 1 To UBound(a, 2)
a(n, ii) = a(i, ii)
Next
Else
w = dic(a(i, 6))
If dif >= w(1) Then
For ii = 1 To UBound(a, 2)
a(w(0), ii) = a(i, ii)
Next
w(1) = dif: dic(a(i, 6)) = w
End If
End If
End If
End Sub
Bookmarks