Excel vba - xlDown

时间:2012-02-22 23:05:45

标签: excel vba 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

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

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:34)

很抱歉,但我不同意Michael的回答。

结束(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
  • 如果列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")
无论纸张的当前内容如何,​​

都应该给出所需的结果。

如果您确实将第1行留空,请尝试Ctrl + DownCtrl + Up,以便了解不同组合的效果价值观。