【问题标题】:Better way of copy and pasting values更好的复制和粘贴值的方法
【发布时间】:2017-05-28 09:06:03
【问题描述】:

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

范围(选择,Selection.End(xlDown)).Select
Range(Selection,Selection.End(xlToRight)).Select

复制数据。

然后我使用 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 由于其大小而无法将其粘贴到目标工作表。有更好的方法吗?

【问题讨论】:

  • Range(Selection, Cells(Rows.Count, Selection.Column).End(xlUp)).Select 将是选择初始行集的更好方法,但请阅读有关how to avoid using Select的答案
  • 您要复制的范围是什么样的? A 列通过什么?
  • A 到 N 列

标签: vba excel


【解决方案1】:

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

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

但我强烈建议不要在代码中使用 .Select

【讨论】:

  • 如果我不使用 .Select,使用什么代码会更好?
【解决方案2】:

当组合一个宏以转到最后一行时,如果只有一行,则使用诸如 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

两组代码都未经测试,但第二组代码应该通过根据工作表名称“Sheet1”、“Sheet2”等循环遍历每个工作表来完成您需要的操作,直到工作表 9

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多