【问题标题】:VBA For Loop STUCKVBA For 循环卡住
【发布时间】:2017-10-11 17:11:09
【问题描述】:

我有一个遍历所有行的 For 循环(它还合并插入的行)......我遇到的障碍是在遍历我正在插入的行的行时,它把它扔掉了。

例子:

在 A 之后添加 5 行,而不是转到 B,而是转到 A 下添加的行之一。

初步外观

  • 一个
  • C
  • D

First Pass 在 A 下添加 5 个空白行。

第二遍继续在 A 之后添加更多空间,而不是跳到 B。

For Each x In wksProd.Range("A3", "A" & iRow)
If x <> "0" Then
    Rows(x.Row).EntireRow.Offset(1).Resize(5).Insert
    With Range(x.Address, ConvertToLetter(x.Column) & x.Row + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    With Range(ConvertToLetter(x.Column + 1) & x.Row, ConvertToLetter(x.Column + 1) & x.Row + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    <-- some other formatting code here -->
End If
Next x

【问题讨论】:

  • 你能在第一行试试For Each x In wksProd.Range("A3:A" &amp; iRow)吗?
  • 还是一样的结果。当它回到 x 时,它没有考虑到循环开始时 +5 行不存在。
  • 只是为了说清楚。您想在每个字母下添加五行吗?

标签: vba loops for-loop insert


【解决方案1】:

您在工作表 wksProd 上循环,但针对的工作表恰好是 ActiveSheet

我使用*stars* 突出显示了对活动工作表的隐式引用:

For Each x In wksProd.Range("A3", "A" & iRow)
If x <> "0" Then
    *Rows*(x.Row).EntireRow.Offset(1).Resize(5).Insert
    With *Range*(x.Address, ConvertToLetter(x.Column) & x.Row + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    With *Range*(ConvertToLetter(x.Column + 1) & x.Row, ConvertToLetter(x.Column + 1) & x.Row + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    <-- some other formatting code here -->
End If
Next x

而且你可能还有更多。确保您正在使用wksProd - 它可能是也可能不是活动工作表。如果不是,那么您将在错误的工作表中插入行。如果是这样,那么您就是在在迭代时修改集合 - 这绝不是一个好主意。

Rows(x.Row).EntireRow.Offset(1).Resize(5).Insert

【讨论】:

  • 我把 wksProd 放在你提到的每一个前面。仍然有同样的问题。它转到单元格 A3 并在 A3 之后插入 5 行。当它到达 x 的循环以进入下一个 x 时,它将进入 A4(而不是 A3 + 5)我如何在每个循环中增加 x?
  • @c3nixon 那是“在迭代时修改集合”部分让你感到困惑。您无法更改 For Each 循环迭代对象集合的方式,因此您需要更改控制流 - 例如使用 For 循环并指定 Step 5,但随后知道使用 For 循环迭代对象集合会减慢代码速度。
  • 啊......所以我完全误解了你的说法......现在开始工作了!生病发布作为答案 - 感谢 Mat 的帮助!
【解决方案2】:

Thx Mat's Mug -- 这解决了它(使用 For with Step vs For Each。

    For x = 3 To ((iRow + 2) * 5) Step 6
    wksProd.Rows(x).EntireRow.Offset(1).Resize(5).Insert
    With wksProd.Range("A" & x, "A" & x + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    With wksProd.Range("B" & x, "B" & x + 5)
        .Merge
        .VerticalAlignment = xlCenter
    End With
    <-- some other formatting code here -->
Next x

【讨论】: