Excel VBA - 粘贴为值

时间:2015-03-27 23:00:01

标签: excel vba excel-vba

我正在尝试创建一个将信息从一个工作表复制到另一个工作表的函数,但我正在努力将粘贴作为值函数。你知道它为什么不起作用吗?

Sub Copy_Data()
    Dim Src As Worksheet, Dst As Worksheet
    Dim LastRow As Long, r As Range
    Dim CopyRange As Range
    'Change these to the correct sheet names
    Set Src = Sheets("Sheet1")
    Set Dst = Sheets("Sheet2")
    LastRow = Src.Cells(Cells.Rows.Count, "A").End(xlUp).Row

    For Each r In Src.Range("A2:A" & LastRow)
        If (Month(r.Value) = "2" And Year(r.Value) = "1902") Then
            If CopyRange Is Nothing Then
                Set CopyRange = r.EntireRow
            Else
                Set CopyRange = Union(CopyRange, r.EntireRow)
            End If
        End If
    Next r

    If Not CopyRange Is Nothing Then
        CopyRange.Copy Dst.Range("A1").PasteSpecial(xlPasteValues)
    End If
End Sub

4 个答案:

答案 0 :(得分:3)

或者你可能完全错过了剪贴板:

If Not CopyRange Is Nothing Then
    Dst.Range("A1").Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = CopyRange.Value
End If

答案 1 :(得分:1)

CopyRange.Copy 
Dst.Range("A1").PasteSpecial xlPasteValues

但你也可以这样做

 Dst.EntireRow.Value = CopyRange.EntireRow.Value

答案 2 :(得分:1)

使用pastespecial时,您需要在单独的命令中使用复制和粘贴语句。请注意,即使您正在进行“正常”粘贴,在声明目标范围后也不会有.Paste。我认为在操作后将Application.CutCopyMode设置为false也是一个好主意,尽管我对此并不乐观。

正确的语法如下:

If Not CopyRange Is Nothing Then
  CopyRange.Copy
  Dst.Range("A1").PasteSpecial xlPasteType:=xlPasteValues
  Application.CutCopyMode = False
End If

答案 3 :(得分:1)

This answer是正确的,但我只是详细说明,因为这个问题在SO中出现了很多次。 Eirikdaude使用正确的语法是正确的:

  

表达 复制(目标

来自MSDN Range Object Copy Method 所以这一行将起作用:

Range("A1").Copy Destination:=Range("B1")

目标参数需要一个您希望传输数据的范围。
提供此参数会跳过剪贴板而省略它会将范围复制到夹板(再次如链接中所述)。

现在,您的代码:CopyRange.Copy Dst.Range("A1").PasteSpecial(xlPasteValues) 不符合上述要求。为什么呢?

  1. 它不符合 Destination 参数应该是范围的语法。相反,您传递了Method of a Range Object PasteSpecial
  2. 您没有省略参数,因此范围未传递给剪贴板
  3. 为了使它有效,你需要像Eirikdaude那样做,它将分隔两(2)行的语句。

    CopyRange.Copy ' omit the argument so range is passed in clip board
    Dst.Range("A1").PasteSpecial xlPasteValues ' execute PasteSpecial method
    

    但他也补充了这一行:

    Application.CutCopyMode = False ' clears the clip board
    

    用于清除剪贴板。请记住,当您在没有目标参数的情况下执行Copy时,您将其传递给剪贴板,因此您必须清除它(至少在我看来)。

    你可以把它放在一行,但是这样:

    CopyRange.Copy: Dst.Range("A1").PasteSpecial xlPasteValues
    

    以上也可以。在:之后记下结肠 CopyRange.Copy 这是一个行(语句)分隔字符,表示其后面的内容被视为新行,或者在另一个透视图中被视为语句分隔符表明个别陈述的结束。