我正在尝试宏根据某些条件删除 excel 中的行。
条件是,如果Notes
列(列H
(中的单元格=Stock
或Custom
则从今天起3天后删除具有截止日期(列G
(的每一行。
我还想删除不包含STOCK
ORFABRIC
但从今天起 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