Excel 如果满足两个条件,则删除行-在时间上更改,并在另一列中删除相同的值

Excel 如果满足两个条件,则删除行-在时间上更改,并在另一列中删除相同的值,excel,vba,timedelta,Excel,Vba,Timedelta,我正在尝试在excel vba中编写循环代码,以执行以下操作: 我有一个专栏,是一个很长的日期+时间。我有另一列有文本字符串 如果时间变化(上面的行-行)小于0:00:05并且字符串的值相同(上面的行与上面的行),我想删除整行 我遇到了IF条件的问题,特别是5秒的部分,它不喜欢它 For Lrow = Lastrow To Firstrow Step -1 'We check the values in the D column With .Cells(Lrow, "D")

我正在尝试在excel vba中编写循环代码,以执行以下操作:

我有一个专栏,是一个很长的日期+时间。我有另一列有文本字符串

如果时间变化(上面的行-行)小于0:00:05并且字符串的值相同(上面的行与上面的行),我想删除整行

我遇到了IF条件的问题,特别是5秒的部分,它不喜欢它

For Lrow = Lastrow To Firstrow Step -1

  'We check the values in the D column
   With .Cells(Lrow, "D")

      If Not IsError(.Value) Then

        If (Cells(i,"D") - Cells(i-1,"D")) > (0:00:05) AND (Cells.Value(i,"F") = 
        Cells.Value(i-1,"F")
        Then .EntireRow.Delete

      End If

  End With

Next Lrow
好的,上面的代码很糟糕。我将探索一种不同的策略。我想将F列与当前单元格和它下面的单元格进行比较。如果它们相同,则触发下一个子句-查看D中的当前单元格是否与下面的单元格相差<0:00:05秒,如果是,则删除(或在循环外存储要删除的信息)

如果F中的两个单元格不相同,则跳到下一个单元格


这更有意义吗?让我编写一个代码并将其发布到这里。

您的时间需要用数字表示,因为Excel中的日期计算为自给定日期起的天数(例如,今天是从1900年1月1日算起的41458天)。因此,将一天除以24得到一小时,然后除以12得到5分钟,例如:

已编辑

我在下面的注释中重新编写了代码,更改了其他因素以及时间比较

下面的代码举例说明了如何使该宏自动删除添加的新行。应将代码添加到正在进行更改的工作表中(而不是模块或工作簿)。如果不想采用自动方法,则可以添加一个选项以首先与用户进行检查,或者只需更改子对象并传入表示刚刚添加的行上的单元格的范围对象(如果需要此方面的帮助,请告知我):

Private子工作表\u更改(ByVal目标作为范围)
暗淡的新闻
暗淡的新日期
Dim prevStr
前一日期
暗间隔
newStr=范围(“D”和Target.Row).值
newDate=范围(“F”和Target.Row).值
prevStr=Range(“D”和Target.Row-1).Value
prevDate=范围(“F”和Target.Row-1).值
间隔=(1/24)/12'5分钟

如果newStr=prevStr和Abs(newDate-prevDate)您的时间需要用数字表示,因为Excel中的日期是从给定日期算起的天数(例如,今天是从1900年1月1日算起的41458天)。因此,将一天除以24得到一小时,然后除以12得到5分钟,例如:

已编辑

我在下面的注释中重新编写了代码,更改了其他因素以及时间比较

下面的代码举例说明了如何使该宏自动删除添加的新行。应将代码添加到正在进行更改的工作表中(而不是模块或工作簿)。如果不想采用自动方法,则可以添加一个选项以首先与用户进行检查,或者只需更改子对象并传入表示刚刚添加的行上的单元格的范围对象(如果需要此方面的帮助,请告知我):

Private子工作表\u更改(ByVal目标作为范围)
暗淡的新闻
暗淡的新日期
Dim prevStr
前一日期
暗间隔
newStr=范围(“D”和Target.Row).值
newDate=范围(“F”和Target.Row).值
prevStr=Range(“D”和Target.Row-1).Value
prevDate=范围(“F”和Target.Row-1).值
间隔=(1/24)/12'5分钟

如果newStr=prevStr和Abs(newDate-prevDate)我看到了各种问题,包括一些似乎不正确的指数。这里有一个改进的版本(循环现在正在向前推进,因为它看起来更清晰):


我看到了各种各样的问题,包括一些似乎不正确的指数。这里有一个改进的版本(循环现在正在向前推进,因为它看起来更清晰):


好的,在进一步挖掘之后,我找到了这个,并对它进行了修改

谢谢你的帮助,瓦罗卡巴斯和克里斯

Sub deleterows()
    Dim myrange, mycell As Range
    Dim myrow()
    Set myrange = Sheets("sheet5").Range("F2", Range("F" & Rows.Count).End(xlUp))
    For Each mycell In myrange
        If mycell.Value = mycell.Offset(-1, 0).Value Then
            If mycell.Offset(0, -2).Value - mycell.Offset(-1, -2).Value <= TimeValue("00:00:05") Then
                q = q + 1
                ReDim Preserve myrow(q)
                myrow(q) = mycell.Row
            End If
        End If
    Next mycell
    For i = q To 1 Step -1
        p = myrow(i)
        myrange(p - 1, 1).EntireRow.Delete
    Next i
End Sub
子删除行()
Dim myrange,mycell As Range
Dim myrow()
设置myrange=Sheets(“sheet5”)。范围(“F2”,范围(“F”和行数)。结束(xlUp))
对于myrange中的每个mycell
如果mycell.Value=mycell.Offset(-1,0).Value,则

如果mycell.Offset(0,-2).Value-mycell.Offset(-1,-2).ValueOK,那么在进一步挖掘之后,我找到了这个,并对它进行了修改以使其工作

谢谢你的帮助,瓦罗卡巴斯和克里斯

Sub deleterows()
    Dim myrange, mycell As Range
    Dim myrow()
    Set myrange = Sheets("sheet5").Range("F2", Range("F" & Rows.Count).End(xlUp))
    For Each mycell In myrange
        If mycell.Value = mycell.Offset(-1, 0).Value Then
            If mycell.Offset(0, -2).Value - mycell.Offset(-1, -2).Value <= TimeValue("00:00:05") Then
                q = q + 1
                ReDim Preserve myrow(q)
                myrow(q) = mycell.Row
            End If
        End If
    Next mycell
    For i = q To 1 Step -1
        p = myrow(i)
        myrange(p - 1, 1).EntireRow.Delete
    Next i
End Sub
子删除行()
Dim myrange,mycell As Range
Dim myrow()
设置myrange=Sheets(“sheet5”)。范围(“F2”,范围(“F”和行数)。结束(xlUp))
对于myrange中的每个mycell
如果mycell.Value=mycell.Offset(-1,0).Value,则

If mycell.Offset(0,-2).Value-mycell.Offset(-1,-2).Value我注意到的第一件事是您的计数器变量是
LRow
,但您在
If
语句中引用了
I
。。。不过,我并没有超出这个范围……John——捕捉得好——我甚至没有在顶部声明,但即使进行了编辑,它仍然不喜欢带单元格的IF行。我认为使用range可能是更好的选择。我注意到的第一件事是您的计数器变量是
LRow
,但您在
If
语句中引用了
I
。。。不过,我并没有超出这个范围……John——捕捉得好——我甚至没有在顶部声明,但即使进行了编辑,它仍然不喜欢带单元格的IF行。我认为使用range可能是一个更好的选择。VBA不喜欢Cells.Value命令,然后不喜欢If(Cells(I,“D”)-Cells(I-1,“D”)>(a)和(Cells(I,“F”)=Cells(I-1,“F”)),那么我想知道Cells.Value是否是一个实际的命令?有没有更好的方法改为使用Range?好的,所以我发现.Value必须在Cells()部分之后,但它仍然会给我运行时错误1
Sub deleterows()
    Dim myrange, mycell As Range
    Dim myrow()
    Set myrange = Sheets("sheet5").Range("F2", Range("F" & Rows.Count).End(xlUp))
    For Each mycell In myrange
        If mycell.Value = mycell.Offset(-1, 0).Value Then
            If mycell.Offset(0, -2).Value - mycell.Offset(-1, -2).Value <= TimeValue("00:00:05") Then
                q = q + 1
                ReDim Preserve myrow(q)
                myrow(q) = mycell.Row
            End If
        End If
    Next mycell
    For i = q To 1 Step -1
        p = myrow(i)
        myrange(p - 1, 1).EntireRow.Delete
    Next i
End Sub