如何删除时间范围内的行(日期和时间格式,但我只希望在某些小时之间保留行)

时间:2018-11-26 21:03:51

标签: excel vba

我有55437行数据。

Screenshot of first few rows of data

我的目标是仅过滤1pm至7pm之间的流量。从时间间隔可以看到,每分钟有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 :(得分:1)

首先,您需要了解日期和时间在excel中的工作方式。

尽管您的列似乎只用时间戳记填充(由于您选择的格式),但该单元格实际上带有日期。如果您查看照片中的Formula Bar,还可以看到日期。

所有日期都可以转换为相应的数字。两者之间的关系为Date.Time = Integer.Decimal。每个整数对于一个日历日都是唯一的(您可以通过将0转换为日期来找到起点)。由于时间不是唯一的(即时钟每天凌晨1:00),因此十进制数字会在每天的同一时间重复。一个简单的十进制/时间转换是noon = .50


话虽如此,我们可以通过以下方式解决您的问题

  1. 删除整数(日期)
  2. 1:00 PM7:00 PM转换为其十进制对应数(分别约为.541667.791667
  3. 浏览所有行并提取小数。如果提取的小数点不在步骤2中确定的阈值之间,请转到步骤4。
  4. 将该单元格添加到Union(单元格集合)中,并在末尾删除Union(不需要的行)

值得一提的是,您可以通过几种方式提取小数(时间)。我正在使用INT函数,该函数会将小数点后的所有值都变为0。您还可以使用Split或其他方法(MidLeftRightLenSearchFind


经过测试,工作正常

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

答案 1 :(得分:-1)

在日期和时间格式中,您的前2个字符为小时。 13:00-18:59是1:00 pm至6:59 pm。因此,只需使用=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