VBA 复制粘贴代码无效

VBA copy and paste code not working

我正在尝试将列从一个 sheet 复制到另一个。为了避免'Select',我写了worksheet.range.copy这样的代码。出于某种原因,下面的代码给我错误。如果我将 Range("A2").End(xlDown) 替换为 "A100",那么代码将起作用。

Sub CopyData()

    MTDData.Range("A2", Range("A2").End(xlDown)).Copy
    MTDFormula.Range("H2").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

End Sub

关于为什么上面的代码出错的任何建议,以及是否有更有效的方法将大块数据从一个 sheet 复制并粘贴到另一个。

您需要将父级 sheet 添加到范围内的范围:

MTDData.Range("A2", MTDData.Range("A2").End(xlDown)).Copy
MTDFormula.Range("H2").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

但我们可以使用 With 块并节省一些输入和 space。你也不需要 pastespecial。

With MTDData
    .Range("A2", .Range("A2").End(xlDown)).Copy MTDFormula.Range("H2")
End with

复制大量值的最快方法是不使用剪贴板,而是直接复制。

MTDFormula.Range("H2").Resize(n,1).Value = MTDData.Range("A2").Resize(n,1).Value

但你必须先找到单元格的大小。这是通过以下可重复使用的代码片段完成的:

Public Function CountRows(ByRef r As Range) As Long
    If IsEmpty(r) Then
        CountRows = 0
    ElseIf IsEmpty(r.Offset(1, 0)) Then
        CountRows = 1
    Else
        CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count
    End If
End Function

因此您的复制代码将如下所示:

Public Sub CopyValuesTest()

    Dim src As Range, dst As Range

    Set src = MTDData.Range("A2")
    Set dst = MTDFormula.Range("H2")

    Dim n As Long
    n = CountRows(src)

    dst.Resize(n, 1).Value = src.Resize(n, 1).Value
    dst.Resize(n, 1).NumberFormat = src.Resize(n, 1).NumberFormat
End Sub