VBA复制粘贴范围

7
我想复制一个范围并将其粘贴到另一个电子表格中。下面的代码可以复制,但无法粘贴:
Sub Normalize()

    Dim Ticker As Range
    Sheets("Sheet1").Activate
    Set Ticker = Range(Cells(2, 1), Cells(65, 1))
    Ticker.Copy
    
    Sheets("Sheet2").Select
    Cells(1, 1).Activate
    Ticker.PasteSpecial xlPasteAll
    
End Sub

如何将复制的内容粘贴到另一个工作表中?

2
"Ticker.PasteSpecial" 将粘贴回您复制的同一范围。 - Tim Williams
谢谢!但是我如何将范围复制并粘贴到不同的工作表中? - user1700890
4个回答

31

要字面意义地修正你的示例,你可以使用这个:

Sub Normalize()


    Dim Ticker As Range
    Sheets("Sheet1").Activate
    Set Ticker = Range(Cells(2, 1), Cells(65, 1))
    Ticker.Copy

    Sheets("Sheet2").Select
    Cells(1, 1).PasteSpecial xlPasteAll



End Sub
使其略微改进的方法是摆脱选择和激活:
Sub Normalize()
    With Sheets("Sheet1")
        .Range(.Cells(2, 1), .Cells(65, 1)).Copy Sheets("Sheet2").Cells(1, 1)
    End With
End Sub

但是使用剪贴板会耗费时间和资源,所以最好的方法是避免复制和粘贴,直接将值设置为您想要的值。

Sub Normalize()
Dim CopyFrom As Range

Set CopyFrom = Sheets("Sheet1").Range("A2", [A65])
Sheets("Sheet2").Range("A1").Resize(CopyFrom.Rows.Count).Value = CopyFrom.Value

End Sub

你可以使用任何想要定义范围的方式来定义CopyFrom,比如使用Range("A2:A65")Range("A2",[A65])Range("A2", "A65")都是有效的输入。如果A2:A65永远不会改变,代码还可以进一步简化为:

Sub Normalize()

Sheets("Sheet2").Range("A1:A65").Value = Sheets("Sheet1").Range("A2:A66").Value

End Sub

我添加了“复制自”区域和 Resize 属性,以使其稍微更具动态性,以防将来您想使用其他区域。


这只会获取数值而不是格式...我猜用户想要粘贴格式?icker.PasteSpecial xlPasteAll - Siddharth Rout
@user1700890 没有错误?是因为你想要像Sid说的那样格式化吗? - user2140261
不,我不在乎格式,代码的最后一部分既没有产生错误也没有产生结果。如果我是Sheet2,它将生成错误:1004 应用程序定义或对象定义错误,并且会突出显示行 Set CopyFrom = Sheets("Sheet1").Range("A2", [A65])。 - user1700890
@user1700890:我测试了上面@user2140261的第二段代码,它对我有效 :) - Siddharth Rout
1
您可以通过将.Value更改为.Value(11)来包含格式,如此处所述。 - scottyc
显示剩余3条评论

1

当我尝试复制粘贴Excel范围及其大小和单元格组时,我想到了以下解决方案。它可能对我的问题有点太具体,但是:

'** '将表格从一个位置复制到另一个位置 'TargetRange:新的LayoutTable放置位置 'typee:如果是安装布局表(1)或包装布局表(2) '**

Sub CopyLayout(TargetRange As Range, typee As Integer)
    Application.ScreenUpdating = False
        Dim ncolumn As Integer
        Dim nrow As Integer

        SheetLayout.Activate
    If (typee = 1) Then 'is installation
        Range("installationlayout").Copy Destination:=TargetRange '@SHEET2 TEM DE PASSAR A SER A SHEET DO PROJECT PLAN!@@@@@
    ElseIf (typee = 2) Then 'is package
        Range("PackageLayout").Copy Destination:=TargetRange '@SHEET2 TEM DE PASSAR A SER A SHEET DO PROJECT PLAN!@@@@@
    End If

    Sheet2.Select 'SHEET2 TEM DE PASSAR A SER A SHEET DO PROJECT PLAN!@@@@@

    If typee = 1 Then
       nrow = SheetLayout.Range("installationlayout").Rows.Count
       ncolumn = SheetLayout.Range("installationlayout").Columns.Count

       Call RowHeightCorrector(SheetLayout.Range("installationlayout"), TargetRange.CurrentRegion, typee, nrow, ncolumn)
    ElseIf typee = 2 Then
       nrow = SheetLayout.Range("PackageLayout").Rows.Count
       ncolumn = SheetLayout.Range("PackageLayout").Columns.Count
       Call RowHeightCorrector(SheetLayout.Range("PackageLayout"), TargetRange.CurrentRegion, typee, nrow, ncolumn)
    End If
    Range("A1").Select 'Deselect the created table

    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

'** 接收粘贴的表格范围并根据原始 CopiedTable 重新排列其属性,根据类型进行分类:如果是安装布局表(1)或包装布局表(2) **

Function RowHeightCorrector(CopiedTable As Range, PastedTable As Range, typee As Integer, RowCount As Integer, ColumnCount As Integer)
    Dim R As Long, C As Long

    For R = 1 To RowCount
        PastedTable.Rows(R).RowHeight = CopiedTable.CurrentRegion.Rows(R).RowHeight
        If R >= 2 And R < RowCount Then
            PastedTable.Rows(R).Group 'Main group of the table
        End If
        If R = 2 Then
            PastedTable.Rows(R).Group 'both type of tables have a grouped section at relative position "2" of Rows
        ElseIf (R = 4 And typee = 1) Then
            PastedTable.Rows(R).Group 'If it is an installation materials table, it has two grouped sections...
        End If
    Next R

    For C = 1 To ColumnCount
        PastedTable.Columns(C).ColumnWidth = CopiedTable.CurrentRegion.Columns(C).ColumnWidth
    Next C
End Function



Sub test ()
    Call CopyLayout(Sheet2.Range("A18"), 2)
end sub

1

我会尝试

Sheets("Sheet1").Activate
Set Ticker = Range(Cells(2, 1), Cells(65, 1))
Ticker.Copy

Worksheets("Sheet2").Range("A1").Offset(0,0).Cells.Select
Worksheets("Sheet2").paste

1
您可以像下面这样做,将值粘贴到其他范围中。(比复制和粘贴值更快)
ThisWorkbook.WorkSheets("Sheet2").Range("A1:A2").Value = Sheets`("Sheet1").Range("A1:A2").Value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接