删除行循环 vba
Delete row loop vba
我在 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
Kyle 是对的——从底部 (rng2.Rows.Count) 循环到顶部 (1),步骤 -1,这应该可以正常工作。
你在做什么,当你删除第 5 行时,旧的第 6 行是新的第 5 行,但下一个循环正在查看第 6 行——旧的第 7 行,所以你的旧的第 6 行(新第 5 行)永远不会被考虑。从下到上循环解决这个问题,因为如果删除第 5 行,下一行要考虑的是第 4 行,它没有移动。
我在 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
Kyle 是对的——从底部 (rng2.Rows.Count) 循环到顶部 (1),步骤 -1,这应该可以正常工作。
你在做什么,当你删除第 5 行时,旧的第 6 行是新的第 5 行,但下一个循环正在查看第 6 行——旧的第 7 行,所以你的旧的第 6 行(新第 5 行)永远不会被考虑。从下到上循环解决这个问题,因为如果删除第 5 行,下一行要考虑的是第 4 行,它没有移动。