Excel VBA For Each跳过单元格

时间:2015-07-10 12:00:19

标签: excel vba excel-vba

我在excel vba中编写一个简单的宏,如果第一个单元格有特定文本,则会删除整行。 这是迄今为止的代码:

Sub MyMacro()
    For Each MyCell In Worksheets("Hoja2").Range("A1:A20")
        If MyCell.Value = "BORRAR" Then
            MyCell.EntireRow.Delete
        End If
    Next
End Sub

My Sheet2(Hoja2)只有两列,第一列充满了#34; BORRAR"从A1到A20,第二列只有1到20的数字。

如果我激活宏,它会删除除2,4,6,8,10,12,14,16,18和20之外的所有行。 如果我再次激活宏,它将删除除4,8,12,16,20之外的所有内容 如果我再次激活宏,它将删除除8,16之外的所有内容 等等。

为什么会这样?据我所知,如果第一列的单元格中有单词" BORRAR"我的宏会逐一检查。在其中,如果是,则删除整行。为什么要删除多个2,4,8 ...?

3 个答案:

答案 0 :(得分:4)

这是因为您正在逐步推进行并删除它们。

如果删除第2行,则第3行成为新第2行,循环继续查看第3行,实际上是第4行 - 第3行已完全错过。

使用:

For x = 20 to 1 Step -1
     If Worksheets("Hoja2").Cells(x,1) = "BORRAR" then
        Worksheets("Hoja2").Cells(x,1).EntireRow.Delete
     End IF
Next x

注意 - 我还没有测试过上面的代码,但它应该可以运行。

答案 1 :(得分:0)

表示下一行占用已删除的行。但索引移动了一个在核心

内部获得下一个下一行单元格的索引

答案 2 :(得分:0)

问题的原因是for each循环检测到它循环的元素数量。然后它开始第一个,第二个,第三个等元素的操作。删除第一个元素时,第二个元素成为第一个元素,但循环继续使用新的第二个元素。您可以尝试使用Range("A20:A1")时效果更好。如果仍然不起作用,您必须使用For ToWhile循环。