Vba EntireRow.Delete只是每隔一行删除一次
我有一个for循环,它遍历一个表中的所有值,应该删除表示“否”的每一行,但它只是删除其他每一行。我放了一个数字为1-30的专栏,我清楚地看到11、13、15、17、19、21等说不,但没有被删除。为什么它只是每隔一行删除一行 编辑-向后循环也有同样的问题Vba EntireRow.Delete只是每隔一行删除一次,vba,excel,Vba,Excel,我有一个for循环,它遍历一个表中的所有值,应该删除表示“否”的每一行,但它只是删除其他每一行。我放了一个数字为1-30的专栏,我清楚地看到11、13、15、17、19、21等说不,但没有被删除。为什么它只是每隔一行删除一行 编辑-向后循环也有同样的问题 currRow = 1 currCell = Cells(currRow, 21).Value For i = 1 To 30 If currCell = "no" Then Rows(currRow).EntireR
currRow = 1
currCell = Cells(currRow, 21).Value
For i = 1 To 30
If currCell = "no" Then
Rows(currRow).EntireRow.Delete
End If
currRow = currRow + 1
currCell = Cells(currRow, 21).Value
Next i
您可以后退并删除行。另外,您的
For…Next
语句中的方法已关闭
如果currCell=“no”,您说的是,但是currCell
在您检查行i
之前不会更新
完全去掉这个变量
另外,还要去掉currRow
变量
Dim i As Long, ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
For i = 30 To 1 Step -1
If ws.Cells(i, 21).Value = "no" Then
ws.Rows(i).EntireRow.Delete
End If
Next
你不必倒退。创建一个特殊范围对象以跟踪要删除的行,然后一次将其全部删除:
Dim i As Long, ws As Worksheet, delRng As Range
Set ws = ThisWorkbook.Worksheets(1)
For i = 1 To 30
If ws.Cells(i, 21).Value = "no" Then
If delRng Is Nothing Then
Set delRng = ws.Rows(i)
Else
Set delRng = Union(delRng, ws.Rows(i))
End If
End If
Next
If Not delRng Is Nothing Then delRng.Delete
对于i=30到1步骤-1,您需要使用反向循环,这已经被询问和回答了大约一百万次。然而,我不想费心去寻找一个例子,所以我只想回答。从下到上,或者如果删除,不要增加i。请看,删除一行也会将它下面的所有行向上拉,因此第10行将成为第9行,当我从9到10时,它将被跳过。从下到上的循环将起作用,但这是你能做的最低效的事情。使用Union
将要删除的所有行合并到一个范围中,然后执行一个myUnionedRange.EntireRow.delete
调用。还要注意,If currCell=“no”
将在单元格(currRow,21)中出现类型不匹配。Value
包含错误值(假设currCell
是变量,隐式或非隐式)。错误无法与字符串或数字文字相比较。有趣的是,如果我查看他的代码,那么For
循环中的所有变量都是常量,因此行(currRow)。EntireRow.Delete
相当于行(1).EntireRow.Delete
所以应该删除连续的30行。我错过了什么?啊……对不起。他糟糕的缩进让我措手不及。@PaulOgilvie是的,这让我措手不及well@K.Davis我在一些测试数据上运行了你的第二个代码,不起作用,你能检查一下吗?@GMalc59我不小心有行(21)
而不是行(i)
。