VBA 错误 1004:范围 class 的复制方法失败

VBA Error 1004: Copy method of range class failed

我目前使用的任何一种粘贴方法都遇到了一些麻烦。我必须从 sheet 复制数据并将其粘贴到另一个,但我不确定我遗漏了什么。

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

RangeCellsRowsColumns都是范围。一个范围属于一个作品sheet,你需要告诉VBA它应该使用哪个作品sheet。如果你不告诉,VBA 假设 Activesheet.

Worksheets("dest").Range(Cells(rowNum, 1)) 告诉 VBA 你想使用来自 worksheet dest 的范围。然后您想要使用 Cells(rowNum, 1)) 指定您需要 sheet 的哪一部分。然而,你并没有告诉 VBA 你想要什么工作sheet Cells,虽然对于一个人来说你想要工作的细胞似乎很明显sheet dest,它不是。 VBA 将假定 Activesheet.Cells(rowNum, 1),并且由于该单元格不是工作的一部分 sheet dest,您会收到运行时错误。

所以正确的方法是(等等,不要使用它

Worksheets("dest").Range(Worksheets("dest").Cells(rowNum, 1)).PasteSpecial

既然是怪物,就有捷径。使用 With 子句或将 sheet 分配给变量(等等,它仍然变得更容易

' 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.