我在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 ...?
答案 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 To
或While
循环。