Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba EntireRow.Delete只是每隔一行删除一次_Vba_Excel - Fatal编程技术网

Vba EntireRow.Delete只是每隔一行删除一次

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

我有一个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).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)