Как удалить строки в пределах временного интервала (формат даты и времени, но я хочу сохранить строки только между определенными часами) - PullRequest
0 голосов
/ 27 ноября 2018

У меня 55437 строк данных.

Screenshot of first few rows of data

Моя цель состоит в том, чтобы отфильтровать только расход с 1 до 19 часов.Как вы можете видеть из временных интервалов, каждая минута имеет 3 показания, поэтому выполнение этого вручную займет много времени.Есть ли способ использовать VBA для удаления всех строк не в указанный период времени?

Спасибо.

Так выглядит решение верхнего ответа после того, как я изменил 0,541666667 на 0,54166666:

This is what the top answer's solution looks like after I have changed 0.541666667 to 0.54166666

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Сначала вам нужно понять, как даты и время работают в Excel.

Хотя ваш столбец, кажется, заполнен только отметками времени (из-за выбранного вами формата), ячейка фактически сопровождается датой,Если вы посмотрите на Formula Bar на вашей фотографии, вы также можете увидеть дату.

Все даты могут быть преобразованы в соответствующий номер.Отношения между ними: Date.Time = Integer.Decimal.Каждое целое число уникально для календарного дня (вы можете найти отправную точку, преобразовав 0 в дату).Поскольку время не является уникальным (то есть часы берут 13:00 каждый день), десятичное число повторяется в одно и то же время каждый день.Простое преобразование в десятичное / время noon = .50


С учетом сказанного мы можем решить вашу проблему путем

  1. Отбросить целое число (дата)
  2. Преобразуйте 1:00 PM & 7:00 PM в их десятичный аналог (примерно .541667 & .791667 соответственно)
  3. Переберите все строки и извлеките десятичную дробь.Если извлеченная десятичная дробь не находится между пороговыми значениями, определенными на шаге 2, перейдите к шагу 4.
  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
0 голосов
/ 27 ноября 2018

В формате даты и времени ваши первые 2 символа - это час.13: 00-18: 59 с 13:00 до 18:59.Так что просто используйте =LEFT() для извлечения часа, затем удалите строку, если час находится между этими двумя числами.Должно выглядеть примерно так:

Sub TimeDelete()
rowcount = Cells(Cells.Rows.Count, "b").End(xlUp).Row
For Each n In Range("B1:b" & rowcount)
    n = Left(n, 2)
        If n >=13 And <=18 Then EntireRow.Delete
        Else
        End If
Next n
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...