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)
不符合以上要求。 为什么?
- 它不符合Destination参数应该是范围的语法。 相反,您传递了
Method of a Range Object
PasteSpecial
Method of a Range Object
的Method of a Range Object
。 - 你没有省略这个参数,所以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度作为语句分隔符来表示单个语句的结束。