如何解决VBA 错误 1004:范围类的复制方法失败
我目前使用的任何一种粘贴方法都遇到了一些麻烦。我必须从工作表中复制数据并将其粘贴到另一个工作表中,但我不确定我遗漏了什么。
Dim idSelect As Integer
Dim nRow As Integer
Dim i As Integer
Dim rowNum As Integer
idSelect = Worksheets("dest").Range("C2").Value - 1
rowNum = 5
nRow = Worksheets("origin").Cells(Rows.Count,1).End(xlUp).Row
For i = 2 To nRow
If Worksheets("origin").Cells(i,1).Value = "No" Then 'if do not ignore
If idSelect > 0 And (Left(Worksheets("origin").Cells(i,6).Value,1) Or Left(Worksheets("origin").Cells(i,7).Value,1) = idSelect) Then
Range(Worksheets("origin").Cells(i,3),Worksheets("origin").Cells(i,27)).Copy
Worksheets("dest").Range(Cells(rowNum,1)).PasteSpecial Paste:=xlPasteValues
rowNum = rowNum + 1
End If
End If
Next i
Application.CutCopyMode = False
解决方法
Range
、Cells
、Rows
、Columns
都是范围。范围属于工作表,您需要告诉 VBA 它应该使用哪个工作表。如果您不告诉,VBA 会假定 Activesheet
。
Worksheets("dest").Range(Cells(rowNum,1))
告诉 VBA 您要使用工作表 dest
中的范围。然后您想使用 Cells(rowNum,1))
指定您需要工作表的哪一部分。但是,您没有告诉 VBA 您想要哪个工作表 Cells
,虽然对于人类来说,您想要工作表 dest
中的单元格似乎很明显,但事实并非如此。 VBA 将假定 Activesheet.Cells(rowNum,1)
,并且由于该单元格不是工作表 dest
的一部分,因此您会收到运行时错误。
所以正确的方法是(等待,不要使用它)
Worksheets("dest").Range(Worksheets("dest").Cells(rowNum,1)).PasteSpecial
因为这是一个怪物,所以有捷径。使用 With
-Clause 或将工作表分配给变量(等待,它仍然变得更容易)
' Either
With Worksheets("dest")
.Range(.Cells(rowNum,1)).PasteSpecial
End With
' --- Or
Dim destSheet As Worksheet
Set destSheet = Worksheets("dest")
destSheet.Range(destSheet.Cells(rowNum,1)).PasteSpecial
现在,我在顶部声明 Cells
是范围。 Cells(rowNum,1)
是一个范围(包含一个单元格)。你可以简单地使用
Worksheets("dest").Cells(rowNum,1).PasteSpecial
' --- Or
With Worksheets("dest")
.Cells(rowNum,1).PasteSpecial
End With
' --- Or
Dim destSheet As Worksheet
Set destSheet = Worksheets("dest")
destSheet.Cells(rowNum,1).PasteSpecial
...现在您需要了解的下一件事是您需要告诉 VBA 它应该在哪个工作簿中查找 Worksheets
- 否则它假定 ActiveWorkbook
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。