сравнить 2 раза, и если после полуночи, отметьте это как следующий день - PullRequest
1 голос
/ 01 мая 2020

У меня есть файл журнала с 420 000 строк входов в систему, у меня есть отметка времени в столбце D и имя входа в столбец E. Теперь я не знаю, когда был запущен файл журнала, но я могу видеть, где сегодня вход в систему так хочется работать в обратном направлении через лист.

Итак, теперь вопрос, у меня есть сегодняшние входы в систему и последняя запись (работает в обратном направлении):

06:09:42 | Joe Bloggs

Затем тот, что над ним is:

21:27:36 | Adam Jones

Есть ли способ пройти через столбец A, и когда вы попадете в эту ситуацию, начните вводить дату предыдущих дней.

EDIT:

Это код, который у меня есть на данный момент, не знаю, является ли это лучшим способом сделать это:

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

        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

        lRow = lRow - 1

    Loop

End Sub

Этот код в настоящий момент не работает, так как любое время, близкое к полуночи, будет отметить его как следующий день

Пример записи example entries

Заранее спасибо

1 Ответ

1 голос
/ 02 мая 2020

Предполагая, что:

  1. Последняя строка относится к сегодняшней дате

  2. У вас достаточно строк журнала для каждого дня

  3. Ваша строка 1 является заголовком, строка 2 содержит данные

  4. Следующие данные могут быть примерами записей для вашей проблемы

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...