首页 文章

Excel VBA复制/粘贴范围从1个工作表到另一个,每次都在下一个目标列中粘贴相同的范围

提问于
浏览
0

我是Excel VBA的新手 .

我试图将一系列数据从一个工作表复制到同一工作簿中的另一个工作表 .

因此,在Sheet1中复制范围(“A2:B10”)然后在Sheet2中粘贴(“A2”) .

每次运行宏时,我都希望将(“Sheet 1”)中的值 . 范围(“A2:B10”)粘贴到连续列中,因此在本例中为Sheet 2中的“B2” .

谢谢你的帮助!

我有第一部分,但在第二部分挣扎:

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

2 回答

  • 1

    你的代码很奇怪

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

    您需要识别Sheet2的Row "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
    
  • 0

    这可以在不使用 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 将始终将第一列作为最后使用的列返回,无需关注是否使用 . 因此,你需要某种检查,以确定它是否为空: WorksheetFunction.CountA(.Columns(1)) > 0

相关问题