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

07-24 09:29