我现在使用的任何一种粘贴方法都有点麻烦。我必须从一个工作表复制数据并粘贴到另一个工作表,但我不确定我错过了什么。
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
。