VBA切入范围正在跳过第二排

时间:2013-10-30 18:24:50

标签: excel vba excel-vba

For Each cell In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
cell.EntireRow.Cut Workbooks("Book2.xlsx").Worksheets("Sheet1").Cells(Rows.Count,1).End(xlUp).Offset(1, 0)
Next cell

快问题。这段代码循环遍历一个范围,并切割整行/将其粘贴到另一个工作簿/工作表上。

但是,它成功地剪切/粘贴了第一行。然后跳过第二行。然后按照预期继续切割/粘贴每一行(事实上,如果我设置断点,你可以看到它击中第一行,跳过第二行,然后运行正常并击中所有其他(H2,H4,H5等) 。)。如果我将方法更改为" COPY",它运行正常(H2,H3,H4等)。

注意:我可以使用' COPY'或其他一些解决方法。但真的只是想知道为什么' CUT'表现得这样。

更新:抱歉,我已将代码更新为CUT而不是COPY。是的,我明白我需要在目标表中有一个标题行。我唯一的问题是为什么第二行永远不会从源表中删除(但是当我用COPY替换CUT时它工作正常)。

2 个答案:

答案 0 :(得分:1)

这真的很有意思。我认为它可能是导致问题的for循环(即Next cell),但在测试中,结果也不是问题。我甚至把它放到do while循环中并得到了相同的结果。不得已(应该是第一个度假胜地:)),我去MDSN看看他们对Cut的看法;这是关键句子

  

切割范围必须由相邻的单元格组成。

虽然我认为你的代码符合这个条件,但是“相邻单元格”语句让我思考...是否因为你正在切割范围中的第一行而没有先前的行/单元格而跳过它?顺着这些路线,我尝试了这个有效的代码,并且仍在使用.Cut

Set myRange = Worksheets("Sheet1").Range("A1:A" & _
    Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, 1).End(xlUp).Row)
i = 2
Do While i <= myRange.Rows.Count
    myRange.Cells(i, 1).EntireRow.Cut _
        Worksheets("Sheet2").Cells(Worksheets("Sheet2"). _
             Rows.Count, 1).End(xlUp).Offset(1, 0)
    i = i + 1
Loop

我创建了一个范围,其中包含比原始行多一行,但是从同一点开始,现在是该范围的第二行。由于这有效,这让我相信在切割时,excel使用前一行来设置切割后当前行的指针。因为切割第一行时没有前一行,所以它会跳过,直到它能够这样做,这解释了为什么切割第一行没有返回所需的结果。

答案 1 :(得分:0)

我没有在你的代码中看到你要删除的行,所以我会假设你在复制之后也删除了这行。如果是这种情况,请注意当您删除行时,它下面的行会向上移动。这意味着如果cell.Row = 12并删除第12行,则下一次迭代将查看第13行,即使第12行现在具有第13行的内容。

通常情况下,这个迭代会向后循环一个循环(For i = 1 to 10 Step - 1)。However, you can't iterate backwards through a For Each statement

请改为尝试:

For i = 2 to Cells(Rows.count, 1).End(xlUp).Row Step - 1  
    'Put your code here  
    'Tip: use Cells(i,"H") to reference each cell in column H
Next i

我的问题是为什么你不能一次读/写该范围内的所有内容?如果需要复制该范围内的每一行,为什么不一次复制/粘贴所有内容?

Dim Rng as Range  
Set Rng = Range("H2:N" & Cells(Rows.count, 1).End(xlUp).Row)  
'Note I changed the second column reference. Modify this to whichever is the last column in your range.  
Rng.copy Workbooks("Blank1.xlsx").Worksheets("Sheet1").Cells(Rows.count,
1).End(xlUp).Offset(1, 0)
Rng.Clear