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 

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

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

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

正确的语法是这样的:

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

尝试

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

但你也可以做

  Dst.EntireRow.Value = CopyRange.EntireRow.Value 

这个答案是正确的,但我会详细说明,因为这个问题在这里出现了很多次。 Eirikdaude使用正确的语法是正确的:

expression复制( 目标

从MSDN范围对象复制方法 。
所以这一行将起作用:

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

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

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

  1. 它不符合Destination参数应该是范围的语法。 相反,您传递了Method of a Range Object PasteSpecial Method of a Range ObjectMethod of a Range Object
  2. 你没有省略这个参数,所以Range不能通过剪贴板

为了使它工作,你需要像Eirikdaude那样做,它将两条语句分开。

 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没有目的地参数,你把它传递到剪贴板,所以你必须清除它(至less在我看来)。

你可以像这样在一行中:

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

上面也会工作。 注意冒号:CopyRange.Copy之后。
这是一个分隔字符行(语句) ,表示跟随它的字符被视为新行,或者在另一个angular度作为语句分隔符来表示单个语句的结束。