Sub copyNonblankData()
Dim erow As Long, lastrow As Long, i As Long
lastrow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastrow
If Sheet1.Cells(i, 1) <> "" Then
' i'm assuming the next line is the 8th line?
Sheets("Sheet1").Range(Cells(i, 1), Cells(i, 2)).Copy
Sheets("Sheet2").Activate
' error occurs here
erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row.Offset(1, 0).Row
ActiveSheet.Paste Destination:=Sheets("Sheet2").Range(Cells(erow, 1), Cells(erow, 2))
Sheets("Sheet1").Activate
End If
Next i
Application.CutCopyMode = False
End Sub
最佳答案
Excel VBA中的“偏移”属性采用的范围是距一定范围特定数量的行和列。Sheet2.Cells(Rows.Count, 1).End(xlUp).Row
会给您Long
,而不是Range Object
。
您的代码可以写成
Dim rng As Range
Set rng = Sheet2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
erow = rng.Row
或者简单地作为
erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row + 1
如果相关工作表处于活动状态,您的代码也将起作用。您需要完全限定单元格,如Why does Range work, but not Cells?中所示
小费
如果使用的是
CodeName
,请使用CodeName
,并避免使用工作表的Name
。如果使用的是Name
,请避免使用Codename
。您最终会感到困惑。如果您不知道它们之间的区别,那么您可能需要查看Refer to sheet using codename请记住,如果代号不存在,您将再次遇到相同的错误(
Object required
)。顺便说一句,如果工作表的名称不存在,那么您将得到一个不同的错误(Subscript Out Of Range
)。因此,如果
erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Row + 1
给出相同的错误,则表示Sheet2
不存在。试试看erow = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row + 1