很抱歉,如果这很简单,这是我第一次尝试VBA。
所以我希望这个宏摆脱我不需要的行,并且对于每个实体它都有一个总字段(大约每20条记录左右)并且我制作了这个脚本:
Dim i As Integer
Dim LastRow As Integer
LastRow = Range("A65536").End(xlUp).Row
For i = 3 To LastRow
If Range("C" & i) = "Result" Then
Rows(i & ":" & i).Select
Selection.Delete Shift:=x1Up
End If
Next
这完美无缺!然后我尝试了类似的事情..我试图遍历数据集中的每一行(记录)然后如果某个字段不包含字符串“INVOICE”那么我不需要该行,我可以删除它。所以我刚刚添加到我当前的循环中(为什么循环两次?)所以现在它看起来像这样:
Dim i As Integer
Dim LastRow As Integer
LastRow = Range("A65536").End(xlUp).Row
For i = 3 To LastRow
If Range("C" & i) = "Result" Then
Rows(i & ":" & i).Select
Selection.Delete Shift:=x1Up
End If
If Not InStr(1, Range("Q" & i), "INVOICE") Then
Rows(i & ":" & i).Select
Selection.Delete Shift:=x1Up
End If
Next
据我所知,第二位随机开始删除没有押韵或理由的行。 Q字段不包含发票的行有时会保留,如果包含发票则相同。知道我做错了吗?
答案 0 :(得分:1)
您应该OR
您的条件,以便如果存在任何原因,该行将被删除。否则,因为您要删除预设范围内的行,所以最终会跳过比当前更多的行。目前看起来你每次删除一行都会跳过一行,所以你错过了任何连续的情况。蒂姆的建议是从最后一行开始工作。
For i = LastRow to 3 Step -1
If Range("C" & i) = "Result" OR Not InStr(1, Range("Q" & i), "INVOICE") Then
Rows(i & ":" i).Delete Shift:=x1Up
End If
Next i
答案 1 :(得分:0)
确实有两种方法:AutoFilter
和For Loop
。在这两者中,AutoFilter
要快得多,特别是对于大型数据集,但它通常需要非常好的设置。 For Loop
很简单,但它有很小的回报,特别是当您的数据开始达到100k行或更多行时。
此外,Not InStr(1, Range("Q" & i), "INVOICE")
似乎是最好的方式,但恕我直言,它不是。 InStr
会返回一个数字,因此如果您进行进一步比较(例如Not InStr(1, Range("Q" & i), "INVOICE") > 0
或仅仅InStr(1, Range("Q" & i), "INVOICE") = 0
)会更好。无论如何,我在下面的第二个代码中使用了前者。
以下是两种方法。它们在简单数据上进行测试。代码可能看起来有点笨重,但逻辑是合理的。其他内容也请参阅评论。
自动筛选方法:
Sub RemoveViaFilter()
Dim WS As Worksheet: Set WS = ThisWorkbook.Sheets("ModifyMe")
Dim LastRow As Long
Application.ScreenUpdating = False
With WS
'--For condition "Result"
.AutoFilterMode = False
LastRow = .Cells(Rows.Count, 1).End(xlUp).row '--Compatible if there are more rows.
With Range("A2:Q" & LastRow) '--Assuming your header is in Row 2 and records start at Row 3.
.AutoFilter Field:=3, Criteria1:="Result" '--Field:=3 is Column C if data starts at A
.Cells.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete '--Delete the visible ones.
End With
'--For condition "<>*INVOICE*"
.AutoFilterMode = False
LastRow = .Cells(Rows.Count, 1).End(xlUp).row
With Range("A2:Q" & LastRow)
.AutoFilter Field:=17, Criteria1:="<>*INVOICE*" '--Field:=17 is Column Q if data starts at A
.Cells.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
End With
.AutoFilterMode = False
End With
Application.ScreenUpdating = True
End Sub
For-loop方法:
Sub RemoveViaLoop()
Dim WS As Worksheet: Set WS = ThisWorkbook.Sheets("Sheet6")
Dim LastRow As Long: LastRow = WS.Cells(Rows.Count, 1).End(xlUp).row
Dim Iter As Long
Application.ScreenUpdating = False
With WS
For Iter = LastRow To 3 Step -1 '--Move through the rows from bottom to up by 1 step (row) at a time.
If .Range("C" & Iter) = "Result" Or Not InStr(1, .Range("Q" & Iter).Value, "Invoice") > 0 Then
.Rows(Iter).EntireRow.Delete
End If
Next Iter
End With
Application.ScreenUpdating = True
End Sub
如果有帮助,请告诉我们。