在if then循环中插入行

时间:2017-02-23 14:29:16

标签: vba

我想创建一个循环,在“J”列中搜索条件“1”,然后在找到它时,在该列上方插入一行。

这是我到目前为止所做的:

Sub MySub()

Dim r As Long, endRow As Long

endRow = 50 ' loop through 50 rows
For r = 1 To endRow 'Loop through tab and search for my criteria
    If Cells(r, Columns("J").Column).Value = "1" Then 'Found
        'Select the current row
        Rows(r).Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
Next r

End Sub

这会在它找到的第一个“1”上方创建50个新行,而我无法弄清楚如何修复它,因此它只会创建1行,而不是它找到的所有“1”。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:4)

尝试下面的代码,它不需要SelectSelection

而不是使用Cells(r, Columns("J").Column),您可以使用Range("J" & r),更容易看到"

此外,实现了向后循环For r = endRow To 1 Step -1

<强>代码

Sub MySub()

Dim r As Long, endRow As Long

endRow = 50 ' loop through 50 rows
For r = endRow To 1 Step -1  'Loop BACKWARDS tab and search for my criteria
    If Range("J" & r).Value = "1" Then 'Found
        Rows(r).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    End If
Next r

End Sub

答案 1 :(得分:0)

只需在Shai的回答中添加一个解释,以便您了解正在发生的事情以及为什么循环向后工作。

你需要向后循环,因为当你找到&#34; 1&#34;在列J中的值并插入一行,您插入的行将所有其他数据向下推一行,这样您就可以反复敲击同一行,并且每次都触发该条件。

例如,假设r = 1且单元格J1 =&#34; 1&#34;所以你插入一行。这会导致单元格J1中的值被下推到第2行,因为刚刚插入的空白行现在位于第1行。因此,对于循环的下一次迭代,r = 2,您现在再次评估您刚才的值评估过去曾在单元格J1中。因此,您插入一个新行,现在该值再次向下推到第3行。因此,在下一个循环迭代中,r = 3,您将再次评估该相同的值。你将继续这样做,直到你到达循环的上限。这就是为什么你要获得50个新行。

向后循环(即 - 从第50行循环到第1行而不是从第1行循环到第50行)解决了这个问题,因为现在当您插入新行时,您刚检查的列J中的值会被推下但是循环向上移动。

因此,例如,在循环的第一次迭代中,r = 50,如果单元格J50 =&#34; 1&#34;然后你插入一行。再次,行被推下来,现在以前在单元格J50中的值现在在单元格J51中。但是,现在你可以向后迭代这些行了。你的下一个循环迭代将是r = 49。第49行将是您刚刚插入的空行,因此单元格J49将不符合您的条件。所以你将进入循环的下一次迭代,r = 48。

我建议在你的循环上设置一个断点,然后使用F8一次单步执行代码,看看这两个循环是否发生了这种情况。