Неправильный вопрос: я оставил этот ответ ниже, но его можно игнорировать. Обновленный ответ добавлен в начало:
Не сбрасывайте Date с x
- тогда, когда день в ячейке не совпадает с предыдущим днем строки, сбросьте p
на 0
For i = 2 to n
If Int(I) <> Int(cells(I,1).Value Then 'Order Date has changed day
p = 0 'Reset counter p to 0
End If
x = cells(i,1).Value 'to check the time
If (x mod 1) >= 0.875 'time as 21:00
'Continue as normal
Вы можете вызвать макрос в определенное время с помощью Application.OnTime
- однако, если вы закроете книгу, но оставите ее открытой в Excel, откроет книгу для запуска макроса, если вы не отключите OnTime
. Это становится ... грязным.
Лучшим решением было бы использование события Worksheet_Change
для запуска кода при изменении значений на рабочем листе:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Columns(1)) Is Nothing Then 'A Cell in Column A changed
Call EstimatedTimeWindow
End If
End Sub
Кроме того, быстрая настройка существующего кода: x = Cells(i, 1).Value Mod 1
даст вам время с более чистым кодом, оператор Hour
легче читать, чем 0,875, а оператор Switch
для p
сделает ваш код чище тоже:
For i = 2 to n
If Int(x) <> Int(Cells(i,1).Value) Then
p = 0
End If
x = Cells(i, 1).Value 'Since we take the Hour, no need to trim the date off first
If Hour(x) >= 9 Then
p = p + 1
Select Case (p\OrdersinHour) 'Same as Int(p/OrdersinHour)
Case 0:
Cells(i,2).value = "Estimated window time 21:00 - 22:00"
Case 1:
Cells(i,2).value = "Estimated window time 22:00 - 23:00"
Case 2:
Cells(i,2).value = "Estimated window time 23:00 - 20:00"
Case 3:
Cells(i,2).value = "Estimated window time 00:00 - 01:00"
End Select
End IF
Next