根据注释和日期单元格删除行

时间:2018-09-20 18:49:51

标签: excel vba excel-vba

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

条件是,如果Notes列(H列)中的单元格= StockCustom,则删除具有到期日期的每一行(列{ {1}})从今天起三天后。

我还想删除不包含GSTOCK但行距今天2周后的行。

有人可以帮我吗?

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