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-子句,要么将工作表分配给一个变量(等等,它仍然变得更容易)

' 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)是一个Range(包含一个单元格)。您可以简单地使用

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

最新更新