Хорошо, терпите меня, это было немного сложно.Вот код, который я использовал.У меня были выборочные данные в Sheet1
, а таблица назначения была в `Sheet2.
Важно, чтобы ваши данные были отсортированы по номеру записи, от наименьшего к наибольшему, а затем от даты окончания, от самой старой до самой новой.
Option Explicit
Sub Test()
Dim i As Long, j As Long, recordnumber As Long
Dim sht1 As Worksheet, sht2 As Worksheet
Dim lastdate As Date
Set sht1 = ThisWorkbook.Worksheets("Sheet1")
Set sht2 = ThisWorkbook.Worksheets("Sheet2")
j = 2
For i = 2 To sht1.Cells(sht1.Rows.Count, 1).End(xlUp).Row
If i = 2 Then
sht2.Range(sht2.Cells(j, 1), sht2.Cells(j, 4)).Value = _
sht1.Range(sht1.Cells(i, 1), sht1.Cells(i, 4)).Value
recordnumber = sht2.Cells(j, 1).Value
lastdate = sht2.Cells(j, 4).Value
End If
If i > 2 Then
'make a new line for new record
If sht1.Cells(i, 1).Value > recordnumber Then
j = j + 1
sht2.Range(sht2.Cells(j, 1), sht2.Cells(j, 4)).Value = _
sht1.Range(sht1.Cells(i, 1), sht1.Cells(i, 4)).Value
recordnumber = sht2.Cells(j, 1).Value
lastdate = sht2.Cells(j, 4).Value
'increase retest count
ElseIf sht1.Cells(i, 1).Value = sht2.Cells(j, 1).Value And _
sht1.Cells(i, 4).Value - sht2.Cells(j, 4).Value > 0 And _
sht1.Cells(i, 4).Value - sht2.Cells(j, 4).Value < 14 And _
sht1.Cells(i, 4).Value <> lastdate Then
sht2.Cells(j, 5).Value = sht2.Cells(j, 5).Value + 1
lastdate = sht1.Cells(i, 4).Value
'make new line for same record, new date 14 days out
ElseIf sht1.Cells(i, 1).Value = sht2.Cells(j, 1).Value And _
sht1.Cells(i, 4).Value - sht2.Cells(j, 4).Value > 14 Then
j = j + 1
sht2.Range(sht2.Cells(j, 1), sht2.Cells(j, 4)).Value = _
sht1.Range(sht1.Cells(i, 1), sht1.Cells(i, 4)).Value
recordnumber = sht2.Cells(j, 1).Value
lastdate = sht2.Cells(j, 4).Value
End If
End If
Next i
End Sub
Пример данных:
После результата на Sheet2
: