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
+ Down
和Ctrl
+ 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