删除基于注释和日期单元格的行



我正在尝试宏根据某些条件删除 excel 中的行。

条件是,如果Notes列(列H(中的单元格=StockCustom则从今天起3天后删除具有截止日期(列G(的每一行。

我还想删除不包含STOCKORFABRIC但从今天起 2 周后具有截止日期的行。

谁能帮我解决这个问题?

即使您知道通过 VBA 的方式,删除正在迭代的行也可能很棘手。诀窍是你必须从底部开始,然后一路向上,否则你删除你所在的行,立即将你发送到下一行,然后你迭代......到下一行。所以你跳过行,除非你倒退。

您的子例程将如下所示:

Dim deleteRows()
Dim lastRow As Long
'get the last row
lastRow = Sheet1.Range("H1").End(xlDown).Row
'iterate from the last row to the first row
Dim i As Long
For i = lastRow To 1 Step -1
'test this row we are on for your first condition
If (Sheet1.Range("H" & i).Value = "Stock" Or Sheet1.Range("H" & i).Value = "Custom") _
And Sheet1.Range("G" & i).Value > Now() + 3 Then
Sheet1.Rows(i).Delete
'test for second condition
ElseIf Sheet1.Range("H" & i).Value <> "STOCK" And Sheet1.Range("H" & i).Value <> "FABRIC" _
And Sheet1.Range("G" & i).Value > Now() + 20 Then
Sheet1.Rows(i).Delete
End If
'on to the next row up
Next i
End Sub

显然,您必须进行一些调整,但这就是要点。

这是对@JNevill解决方案的轻微修改,不需要您倒退。这样做的原因是宏不会逐个删除行,而是将要删除的行添加到Union行中,然后在最后一次性删除它们。

这也将更快,因为您只有 1 个删除实例,而不是每个满足条件 1 个实例。速度取决于要删除的行数:要删除的行越多,此方法的好处就越大


Option Explicit
Sub DeleteMe()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim i As Long, DeleteMe As Range
For i = 2 To ws.Range("A" & ws.Rows.Count).End(xlUp).Row
If ws.Range("H" & i) = "Stock" Or ws.Range("H" & i) = "custom" And ws.Range("G" & i) > Now() + 3 Then
If DeleteMe Is Nothing Then
Set DeleteMe = ws.Range("H" & i)
Else
Set DeleteMe = Union(DeleteMe, ws.Range("H" & i))
End If
ElseIf ws.Range("H" & i) <> "Stock" And ws.Range("H" & i) <> "Fabric" & ws.Range("G" & i) < Now() + 14 Then
If DeleteMe Is Nothing Then
Set DeleteMe = ws.Range("H" & i)
Else
Set DeleteMe = Union(DeleteMe, ws.Range("H" & i))
End If
End If
Next i
If Not DeleteMe Is Nothing Then DeleteMe.EntireRow.Delete
End Sub

最新更新