更好的复制和粘贴值的方法

时间:2017-01-13 03:41:47

标签: excel vba excel-vba

我正在处理一个模板,其中一部分要求我复制并粘贴多行值,这些值具有来自不同工作表的相同列数并将它们附加在一起(即复制值在工作表1中,粘贴在工作表10中,从工作表2复制值,粘贴到工作表10中,但在从工作表1复制的最后一行值之后,依此类推)。我通常使用

  

范围(选择,选择。结束(xlDown))。选择
  范围(精选,Selection.End(xlToRight))。选择

复制数据。

然后我使用do while语句查找目标表的最后一行(即表10)并将其粘贴到那里:

Range("A6").Select
Do While ActiveCell.Value <> ""             
ActiveCell.Offset(1, 0).Select
Loop

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

但如果其中一张源表只有一行,我就会遇到问题。它将行和所有空行复制到excel的底行之后,因此,excel因其大小而无法将其粘贴到目标工作表。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:0)

您可以使用它来获取源表格中的最后一行并选择单元格

Dim lr As Long
lr = Cells(Rows.Count, Selection.Column).End(xlUp).Row
Range(Selection, Cells(lr, Selection.Column)).Select

在您的目标表中也可以使用

Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select

但我强烈建议您不要在代码中使用。选择

答案 1 :(得分:0)

当把宏放到最后一行时,使用像activecell.end(xldown).select这样的东西,如果只有一行,则会选择最后一行。

我解决这个问题的一种方法是使用IF语句来检查第2行是否包含列中的数据:(从A1到A3的选择将与activecell.end(xldown).select一起使用)

Sub Example()
Range("A2").Select
If IsEmpty(ActiveCell.Value) then
'do this set of instructions
else
'do that set of instructions
end if
End Sub

在您的情况下,选择要复制到另一个工作表的未知行数可以使用类似于此的内容来完成:

Sub Example2()

Dim ws as worksheet
Set ws = ThisWorkbook.Sheets("Sheet10") 'change quotes to sheet 10 name if different

Dim i as integer
i = 1

While i = <=9
ThisWorkbook.sheets("sheet" & i).activate
Range("A2").Select
If IsEmpty(ActiveCell.Value) then
EndRow = "2"
Go To NoA2 'Go to will skip to NoA2 below
Else
ActiveCell.End(xlDown).Select
EndRow = activecell.row 'this will get the row number for later
End If
NoA2: 'skip will continue from here
ActiveCell.end(xlToRight).Select
EndCol = Split(ActiveCell(1).Address(1, 0), "$")(0) 'Get column letter
Range("A1:" EndCol & EndRow).Select
Selection.Copy
ws.activate
Range("A2").Select
If IsEmpty(ActiveCell.Value) then
ActiveCell.PasteSpecial Paste:=xlPasteValues
Else
Range("A1").Select
ActiveCell.End(xlDown).Select
ActiveCell.PasteSpecial Paste:=xlPasteValues
i = i+1
Wend

End Sub

两组代码都是未经测试的,但第二组代码应该根据工作表名称循环遍历每张工作表,并且#34; Sheet1&#34;,&#34; Sheet2&#34;等到表9

希望能帮到你