Сначала вам нужно понять, как даты и время работают в Excel.
Хотя ваш столбец, кажется, заполнен только отметками времени (из-за выбранного вами формата), ячейка фактически сопровождается датой,Если вы посмотрите на Formula Bar
на вашей фотографии, вы также можете увидеть дату.
Все даты могут быть преобразованы в соответствующий номер.Отношения между ними: Date.Time
= Integer.Decimal
.Каждое целое число уникально для календарного дня (вы можете найти отправную точку, преобразовав 0
в дату).Поскольку время не является уникальным (то есть часы берут 13:00 каждый день), десятичное число повторяется в одно и то же время каждый день.Простое преобразование в десятичное / время noon = .50
С учетом сказанного мы можем решить вашу проблему путем
- Отбросить целое число (дата)
- Преобразуйте
1:00 PM
& 7:00 PM
в их десятичный аналог (примерно .541667
& .791667
соответственно) - Переберите все строки и извлеките десятичную дробь.Если извлеченная десятичная дробь не находится между пороговыми значениями, определенными на шаге 2, перейдите к шагу 4.
- Добавьте эту ячейку в
Union
(Коллекция ячеек) и удалите Union
(ненужные строки).в конце
Стоит отметить, что вы можете извлечь десятичное число (время) несколькими способами.Я использую функцию INT
, которая переводит все значения после десятичного числа в 0. Вы также можете использовать Split
ИЛИ кучу других методов (Mid
, Left
, Right
, Len
,Search
, Find
, и т. Д. )
Протестировано и отлично работает
Option Explicit
Sub ClockWorkOrange()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1") '<- Update
Dim LRow As Long, r As Range, myRange As Range, DeleteMe As Range
LRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
Set myRange = ws.Range("B3:B" & LRow)
For Each r In myRange
If (r.Value2 - Int(r.Value2)) < 0.541666667 Or (r.Value2 - Int(r.Value2)) > 0.791666667 Then
If Not DeleteMe Is Nothing Then
Set DeleteMe = Union(DeleteMe, r)
Else
Set DeleteMe = r
End If
End If
Next r
If Not DeleteMe Is Nothing Then DeleteMe.EntireRow.Delete
End Sub