2012-02-22 140 views
6

下面的代码试图粘贴所选择的范围(如rng传递)到工作表的末尾。 如果已经存在2行(A1,A2),它将起作用。Excel VBA中 - xlDown

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 

因此,如果A1和A2存在,并且如果您调用此方法100次,它会在它们之后插入100行。但是,如果没有行或只有A1,它只是覆盖A2。我能看到的Excel写在同一行(覆盖)

看来,东西用,如果有低于2行,不知道xlDown如何计算做。

任何帮助,将不胜感激。

回答

29

对不起,但我不同意迈克尔的答案。

完(xlDown)是VBA等效点击Ctrl + Down的。

尝试Ctrl + Down

  • 空柱
  • 与行1,2 2
  • 值在第1行的值,而是在列1中没有其他
  • 值和列,3,7,8,9,13,14和15

这会给你一个想法,所有不同的行,Ctrl + Down可能带你到。

Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0)并不一定带你到最后使用的行号加1

我很惊讶Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0)与空柱的工作。 Range("A1").End(xlDown)会将您带到工作表的最后一行,然后.Offset(1, 0)会尝试将您从工作表中移出。

考虑:

Dim RowLast As Long 

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
  • 如果A列是空的,RowLast将被设置为1。
  • 如果A1具有一个值,但没有其他的细胞具有的值,RowLast将被设置为1。
  • 如果A列中的单元格数量具有值,则RowLast将设置为具有值的底部行。
  • 如果您在最后一行有值,它将被忽略。
  • 如果您在最后两行中有值,RowLast将被设置为Rows.Count - 1。

我假设你没有在borrom行中的值。如果你,如果第1行留空一个空栏,然后不在乎:

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
Set NewRange = ws.Cells(RowLast + 1, "A") 

应该得到期望的结果,无论片WS的当前内容。

如果你在乎行1被留空,与Ctrl + DownCtrl + Up尝试会给你的价值观的不同组合的效果的理解。

+5

+1很好地解释它。事实上,我从未赞成使用“ws.Range(”A1“)。End(xlDown)”来设置范围。原因在于,如果两者之间存在空白单元,则不会给出(可以理解)正确的范围。 :) – 2012-02-23 03:34:23

+0

托尼,感谢您的帮助。它为我工作。关于第一部分,为什么我这样做,我是第18项http://support.microsoft.com/kb/291308。惊讶地看到没有简单的方法来做到这一点。感谢aga。 – bsr 2012-02-23 03:44:43

+0

@SiddharthRout ..如果该行为空,则最后一个单元格变得更糟。查找更好,但仍需要测试以确保感兴趣的数据范围不是空白。 ['查找'可以更容易](http://stackoverflow.com/q/4872512/641067)取决于需要什么 – brettdj 2012-02-24 23:56:33

1

的问题是,偏移行点到行,这不是系列的一部分。但是如果没有偏移量,您最终会看到该值的最后一行。因此,不要试图从顶端下来,我们应该从底部开始。

转到结束(下)两次:一次为这个范围的结束,再一次走出这个范围。然后去结束(上)一次,然后抵消1:

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 
+0

似乎不适合我,它只是创建A2,A3(和他的时间休息时写的A3)的条目。我会做一个测试文件并附上这个问题。谢谢你的帮助。 – bsr 2012-02-22 23:45:58