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
Range
、Cells
、Rows
、Columns
都是范围。一个范围属于一个作品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
.
我目前使用的任何一种粘贴方法都遇到了一些麻烦。我必须从 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
Range
、Cells
、Rows
、Columns
都是范围。一个范围属于一个作品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
.