Excel vba - xlDown

bsr*_*bsr 8 excel vba

下面的代码试图将所选范围(传递为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
Run Code Online (Sandbox Code Playgroud)

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

看来,如果xlDown如何计算,如果少于2行,则不确定.

任何帮助,将不胜感激.

Ton*_*ore 35

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

End(xlDown)是VBA相当于点击Ctrl+ Down.

尝试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
Run Code Online (Sandbox Code Playgroud)
  • 如果列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")
Run Code Online (Sandbox Code Playgroud)

无论纸张的当前内容如何,​​都应该给出所需的结果.

如果您确实将第1行留空,请尝试使用Ctrl+ DownCtrl+ Up来了解不同值组合的效果.

  • +1很好地解释它.事实上,我从未赞成使用"ws.Range("A1").End(xlDown)"来设置范围.原因是,如果中间有一个空白单元格,它不会给出(完全可以理解)正确的范围.:) (5认同)