Copy/paste 范围从一个工作表到另一个工作表中的下一个可用列

Copy/paste range from one worksheet to next available column in another worksheet

我正在尝试将一个工作表中的一系列数据复制到同一工作簿中的另一个工作表中。

所以在 Sheet1 中复制范围 ("A2:B10"),然后在 Sheet2 中粘贴 ("A2")。

每次宏为 运行,我希望将 ("Sheet 1").Range("A2:B10") 中的值粘贴到连续的列中,因此在第二个 运行, 在 "B2" "C2" 在 Sheet 2.

我有第一部分,但第二部分很吃力:

Sub sbCopyRangeToAnotherSheet()
'Set range
Sheets("Sheet1").Range("A2:B10").Copy  Destination:=Sheets("Sheet2").Range("A2")
'Copy the data
Sheets("Sheet1").Range("A2:B10").Copy
'Activate the destination worksheet
Sheets("Sheet2").Activate
'Select the target range
Range("A2").Select
'Paste in the target destination
ActiveSheet.Paste

Application.CutCopyMode = False
End Sub

你的代码很奇怪

这一行Sheets("Sheet1").Range("A2:B10").Copy Destination:=Sheets("Sheet2").Range("A2")正在一行中复制和粘贴所有内容。因此,您 .copy .activate .select.paste 的后续行是多余的。你的第一行已经完成了所有这些。

您需要确定工作表 2 的第 "A" 行中最后使用的列。为此,您可以使用范围的 .End() 方法来查找行中第一个占用的单元格。然后将该单元格用作副本 Destination:

 Sub sbCopyRangeToAnotherSheet()

     'Declare a variable to hold the cell to which we will paste the data
     Dim pasteCell as Range

     'Set the variable to the first empty cell in Row 2
     Set pasteCell = Sheets("Sheet2").Range("IV2").end(xlToLeft).Offset(,1)

     'Copy and paste
     Sheets("Sheet1").Range("A2:B10").Copy  Destination:=pasteCell
End Sub

无需使用 ActiveSelect:

Option Explicit

Sub TestMe()

    Dim ws1         As Worksheet
    Dim ws2         As Worksheet        
    Dim source      As Range
    Dim target      As Range        
    Dim lastColumn  As Long

    Set ws1 = Worksheets(1)
    Set ws2 = Worksheets(2)

    With ws2
        lastColumn = .Cells(2, .Columns.Count).End(xlToLeft).Column
        If WorksheetFunction.CountA(.Columns(1)) > 0 Then
            lastColumn = lastColumn + 1
        End If
    End With

    Set source = ws1.Range("A2:A10")
    Set target = ws2.Cells(2, lastColumn)

    source.Copy destination:=target
    Application.CutCopyMode = False

End Sub

代码中最棘手的部分是开始在目标工作表的正确列上书写。如果工作表为空,则正确的列是第一列。在所有其他情况下,正确的列是最后一列 + 1。

查找最后使用的列的标准方法 - Range.End(xlToLeft).Column 总是 return 第一列作为最后使用的列,w/o 注意它是否被使用。因此,您需要进行某种检查,以了解它是否为空:WorksheetFunction.CountA(.Columns(1)) > 0