【问题标题】:Excel VBA For Each skipping cellsExcel VBA For Each 跳过单元格
【发布时间】:2015-07-10 12:00:19
【问题描述】:

我在 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

我的 Sheet2 (Hoja2) 只有两列,第一列是从 A1 到 A20 的“BORRAR”,第二列只有数字,从 1 到 20。

如果我激活宏,它会删除除 2、4、6、8、10、12、14、16、18 和 20 之外的每一行。 如果我再次激活宏,它会删除除 4、8、12、16、20 之外的所有内容 如果我再次激活宏,它会删除除 8,16 之外的所有内容 以此类推。

为什么会这样?据我了解,如果第一列的单元格中包含“BORRAR”一词,我的宏会逐个检查,如果有,则会删除整行。为什么要删除 2,4,8...的倍数?

【问题讨论】:

  • 答案本身就有问题
  • 当您删除行时,您需要向后遍历行。尝试像For i = lastrow to 2 Step -1 这样的循环
  • 表示下一行占用了删除的行。但是索引被移动到核心内部的下一行单元格
  • 是的。非常感谢
  • 性能方面,这对 ms 来说很好。开发人员明智的做法并不好。

标签: vba excel


【解决方案1】:

这是因为您在行中前进并删除它们。

如果您删除第 2 行,则第 3 行将成为新的第 2 行,然后循环继续查看实际上是第 4 行的第 3 行 - 第 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

注意 - 我没有测试上面的代码,但它应该可以工作。

【讨论】:

    【解决方案2】:

    这意味着下一行占用的是已删除的行。但是索引被移动到核心内部的下一行单元格

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        相关资源
        最近更新 更多