我在vba中有一个函数循环遍历一组数据并检查是否存在某些值,如果存在,则删除该行。它可以工作,但它不会删除所有值。我很确定这是因为循环的上限是范围的行数,每次删除都会变小。我该如何改变?任何帮助将不胜感激!
Function DeleteClients(rng1 As Range, rng2 As Range)
vData1 = rng1.Value
For i = 1 To rng2.Rows.Count
For j = LBound(vData1, 1) To UBound(vData1, 1)
If rng2.Cells(i, 1).Value = vData1(j, 1) Then
rng2.Cells(i, 1).EntireRow.Delete
Exit For
End If
Next j
Application.StatusBar = "Deleting out excluded clients... " & i & "/" & rng2.Rows.Count & " Records Processed " & Round((i / rng2.Rows.Count) * 100, 0) & " % Complete"
Next i
Application.StatusBar = False
End Function
答案 0 :(得分:0)
Kyle是正确的 - 从底部(rng2.Rows.Count)循环到顶部(1),步骤-1,这应该可以正常工作。
你做的是当你删除第5行时,旧的第6行是新的第5行,但是下一个循环是第6行 - 旧的第7行,所以你的旧第6行(新的第5行)永远不会被考虑。从下到上循环解决了这个问题,因为如果删除第5行,则要考虑的下一行是第4行,并且它没有移动。