Excel vba – xlDown

下面的代码试图将选定范围(作为rng传递)粘贴到工作表的末尾。 如果已经存在2行(A1,A2),它就起作用。

 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写在同一行(覆盖)

显然,如果xlDown计算的行数less于2行,这个问题就不清楚了。

任何帮助,将不胜感激。

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

End(xlDown)是单击Ctrl + Down的VBA等效项。

尝试Ctrl + Down

  • 一个空的列
  • 第1行中有一个值,但没有其他值
  • 行1和2中的值
  • 第1,2,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") 

应该给出所需的结果,而不pipe当前的内容ws。

如果你关心的是第一行是空白的,用Ctrl + DownCtrl + Up可以让你理解不同的值组合的效果。

问题在于“偏移”行指向不在范围内的行。 但是,如果没有偏移量,您最终会看到该值的最后一行。 所以我们不要试图从顶端往下走,而应该从底部往上走。

结束(下)两次:一次为这个范围的结束,再一次摆脱这个范围。 然后去结束(上)一次,然后抵消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