我正在尝试根据某些条件在Excel中删除宏。
条件是,如果Notes
列(H
列)中的单元格= Stock
或Custom
,则删除具有到期日期的每一行(列{ {1}})从今天起三天后。
我还想删除不包含G
或STOCK
但行距今天2周后的行。
有人可以帮我吗?
答案 0 :(得分: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
很明显,您必须进行一些调整,但这就是要害。
答案 1 :(得分:1)
这是@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