Предполагая, что:
Последняя строка относится к сегодняшней дате
У вас достаточно строк журнала для каждого дня
Ваша строка 1 является заголовком, строка 2 содержит данные
Следующие данные могут быть примерами записей для вашей проблемы
NotInteresting |DateGoesHere |NotInteresting |Time |Logon_Name
1 | |This |13:06:24 |Adam Jones
2 | |column |16:40:56 |Bill Bao
3 | |is |03:02:30 |Joe Bloggs
4 | |not |08:41:02 |Jhon Doe
5 | |interesting |19:30:36 |Iam Igor
6 | |but |04:06:52 |Pinco Pallino
7 | |I |13:49:59 |Romolo Remo
8 | |know |17:08:04 |Harry Potter
9 | |that |18:26:52 |Jane Doe
10 | |last |21:27:36 |Adam Jones
11 | |row |06:09:42 |Joe Bloggs
12 | |date |07:00:02 |Iam Igor
13 | |is today |12:40:08 |Pinco Pallino
и ожидаемого результат:
NotInteresting |DateGoesHere |NotInteresting |Time |Logon_Name
1 | 29/04/2020 |This |13:06:24 |Adam Jones
2 | 29/04/2020 |column |16:40:56 |Bill Bao
3 | 30/04/2020 |is |03:02:30 |Joe Bloggs
4 | 30/04/2020 |not |08:41:02 |Jhon Doe
5 | 30/04/2020 |interesting |19:30:36 |Iam Igor
6 | 01/05/2020 |but |04:06:52 |Pinco Pallino
7 | 01/05/2020 |I |13:49:59 |Romolo Remo
8 | 01/05/2020 |know |17:08:04 |Harry Potter
9 | 01/05/2020 |that |18:26:52 |Jane Doe
10 | 01/05/2020 |last |21:27:36 |Adam Jones
11 | 02/05/2020 |row |06:09:42 |Joe Bloggs
12 | 02/05/2020 |date |07:00:02 |Iam Igor
13 | 02/05/2020 |is today |12:40:08 |Pinco Pallino
Имейте в виду, что выполнение (как и вы):
If WS1.Cells(lRow, 4).Value > WS1.Cells(lRow, 4).Offset(-1, 0).Value + TimeSerial(12, 0, 0) Then
strDate = strDate - 1
WS1.Cells(lRow, 4).Offset(0, -2).Value = strDate
Else
WS1.Cells(lRow, 4).Offset(0, -2).Value = strDate
End If
- это то же самое, что:
If WS1.Cells(lRow, 4).Value > WS1.Cells(lRow, 4).Offset(-1, 0).Value + TimeSerial(12, 0, 0) Then
strDate = strDate - 1
End If
WS1.Cells(lRow, 4).Offset(0, -2).Value = strDate
Кроме того, вы должны подумать, о чем вы думаете, когда понимаете, что если в ячейке содержится 06:09:42, а в верхней - 21:27:36, то вы говорите о двух разных днях? Это потому, что верхняя ячейка больше, чем нижняя, но верхняя должна быть временной меткой (дата + время) меньше нижней.
Итак, условие if
должно быть примерно таким:
If WS1.Cells(lRow, 4).Value < WS1.Cells(lRow, 4).Offset(-1, 0).Value Then
strDate = strDate - 1
End If
И полный код будет:
Sub DateStamp()
Dim WS1 As Worksheet
Dim lRow As Long
Set WS1 = ThisWorkbook.Sheets("Sheet1")
lRow = WS1.Cells(Rows.Count, 4).End(xlUp).Row
strDate = Date
Do Until lRow = 2
WS1.Cells(lRow, 4).Offset(0, -2).Value = strDate
'If upper cell has a time bigger than the one in the current cell
'Than we are talking of two different days. Maybe is the day before.
If WS1.Cells(lRow, 4).Value < WS1.Cells(lRow, 4).Offset(-1, 0).Value Then
strDate = strDate - 1
End If
lRow = lRow - 1
Loop
End Sub
Этот код не будет заполнять первую строку данных (номер строки 2
). Чтобы сделать это, вы должны изменить Until
условие Do
l oop, чтобы включить номер строки 2
, а в случае номера строки 2
не проверять предыдущую строку (это не не содержит действительного времени).
Sub DateStamp()
Dim WS1 As Worksheet
Dim lRow As Long
Set WS1 = ThisWorkbook.Sheets("Sheet1")
lRow = WS1.Cells(Rows.Count, 4).End(xlUp).Row
strDate = Date
Do Until lRow < 2 'It stops when lRow is strictly less than 2. Include lRow = 2
WS1.Cells(lRow, 4).Offset(0, -2).Value = strDate
'Doesn't run for lRow = 2
If lRow > 2 Then
If WS1.Cells(lRow, 4).Value < WS1.Cells(lRow, 4).Offset(-1, 0).Value Then
strDate = strDate - 1
End If
End If
lRow = lRow - 1
Loop
End Sub
Ps. В этих случаях вы можете избежать использования смещений
WS1.Cells(lRow, 4).Offset(0, -2)
WS1.Cells(lRow, 4).Offset(-1, 0)
, заменив их на
WS1.Cells(lRow, 2)
WS1.Cells(lRow-1, 4)