2017-08-25 93 views
1

我试图检查当前行中包含唯一ID(连续的几列)的单元格,并将它与其唯一ID上方的行进行比较。如果值相同,我想复制当前行并将此副本插入位于当前行上方两行的新行中。如果ID不一样,我不想做任何事情,并移动到工作表上的下一行。当IF语句为真时,“Next”不能在循环中工作

下面的代码运行没有错误,并且正常工作,直到找到ID匹配。代码根据我的需要复制和插入,但它的行为就像它在同一行再次启动“IF”语句(“下一个”不会分析下一行)。所以我最终得到无尽的副本并插入第一行,并在其上面有一个匹配的唯一ID。

Sub CopyAndInsert 
    Dim LastRow As Long 
    LastRow = Worksheets("Orders").Range("A" & Rows.Count).End(xlUp).Row 

    Set SelectionRNG = Worksheets("Orders").Range("A2:CX" & LastRow) 
    For Each rngrow In SelectionRNG.Rows 
     rngrow.Copy 
     If rngrow.Cells(1, 102) = rngrow.Cells(0, 102) Then 'checks if row CX is equal to the row above it (same column) 
      rngrow.Cells(2, 1).Offset(-2, 0).EntireRow.Insert 
     End If 
    Next 
End Sub 

请注意,如果行在唯一ID列(CX)中不匹配,则“下一个”按预期工作并继续到下一行。只有当ID匹配并插入复制的行时,才会发生不前进的问题。

在此先感谢您的帮助!

+3

因为你在那里插入行,并随后改变循环的初始范围。 – cyboashu

+1

插入或删除行时,最好从底部到顶部遍历列表。 –

+0

在if循环中写'Next'。在外面也是 –

回答

1

绑循环到一个变量,并手动增加1它跳过添加的行似乎工作:

Sub CopyAndInsert() 
Dim lastRow As Long, x As Long 
lastRow = Worksheets("Orders").Range("A" & Rows.Count).End(xlUp).Row 

For x = 3 To lastRow 
    If Cells(x, 102) = Cells(x - 1, 102) Then 
     Cells(x - 1, 1).EntireRow.Insert 
     Range("A" & x + 1 & ":" & "CX" & x + 1).Copy Cells(x - 1, 1) 
     x = x + 1 
    End If 
Next x 

End Sub 
+0

这是行不通的,但是抛出了我原来的问题中没有包含的代码。代码(如下所示)用于添加列CK中找到的“匹配”行的值,并将总和值放入新插入的“复制”行中。 (0,89)+ rngrow.Cells(1,89)' 我很难将我的rngRow格式化为您的“范围”格式 - 任何建议? – RugsKid

+1

在'x = x + 1'之前的行上放置'Cells(x-1,89).Formula = Cells(x,89).Value + Cells(x + 1,89).Value'应该诀窍 –

+0

我遇到了一个代码问题,如果数据有4行ID与行匹配,它最终会插入三个新行,但它应该只添加2.我不确定,但这可能是可以解决的从底部循环到顶部并在两条匹配线下面添加“复制”行 - 您怎么看? – RugsKid