【问题标题】:VBA - Decrement a for loop within an ifVBA - 在 if 中减少 for 循环
【发布时间】:2017-07-22 01:24:47
【问题描述】:

我正在运行一个宏来清理工作簿中的空行,并且由于 For 循环的运行方式,它会丢失连续的空行,因为它例如:

  • 检查第 14 行
  • 删除第 14 行,因为空白
  • 第 15 行上移成为第 14 行
  • For 循环移至第 15 行,缺少新的第 14 行

我的(可能有缺陷的)解决方案是在删除将 for 循环递减一步的行之后添加一个步骤,以便它可以连续捕获。

我试过了:

For i = 1 To 2000
    If IsEmpty(Cells(i, 6)) = True Then
        Rows(i).EntireRow.Delete
        i = i - 1
    End If
Next i

这似乎无限循环。我还尝试了 i -= 1、--i 等,但由于预期的表达式而失败。 i = --i atleast 运行,但在删除空行方面似乎不起作用。

有什么建议吗?如果遗漏了一些明显的东西,请提前道歉。

【问题讨论】:

    标签: excel vba if-statement for-loop


    【解决方案1】:

    删除时确实应该后退一步,所以从 2000 开始,一直到 1,以确保没有跳过任何行。

    For i = 2000 To 1 step -1
        If IsEmpty(Cells(i, 6)) = True Then
            Rows(i).EntireRow.Delete
        End If
    Next i
    

    【讨论】:

    • 是的!我认为这是最佳做法
    • 是的,这是我与同事讨论后最终做的,而且效果很好。非常感谢!
    【解决方案2】:

    尝试反向运行它,因此从 2000 年开始(使用您的示例,或者我认为 Worksheet.Rows.Count)并返回到 1。这样您在删除时就不需要摆弄循环索引一行。

    所以:

    For i = 2000 to 1 step -1
        If IsEmpty(Cells(i, 6)) = True Then
            Rows(i).EntireRow.Delete
        End If
    Next i
    

    您当前的代码循环的原因是第 2000 行是空白的,所以它会删除它并将您的循环计数设置回 1999,然后它再次尝试第 2000 行,它是空白的,依此类推。

    【讨论】:

    • 啊哈,我想知道究竟是什么导致了循环,这是有道理的!
    • 我对原因的逻辑是正确的,但数字可能不是。它真的是当它到达你的内容的结尾时。所以它可能会低得多。
    • 查看我的数据后修复,是的,它可能在大约 1500 年代左右遇到它。因果相同,只是位置不同!非常感谢您的帮助。
    • 如果您觉得我的回答有用,请投票。
    • 我有,但不幸的是我仍然低于 15 代表,所以在我超过 15 之前不会显示!
    猜你喜欢
    • 2021-07-30
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多