对象工作表的方法范围失败

时间:2018-11-06 08:55:30

标签: vba

我一直在搜索此错误,以寻求解决方案,但找不到它。 谁能指出以下代码有什么问题?

    Sub test()
    Dim WKB As ThisWorkbook
    Set WKB = ActiveWorkbook
    Dim DataPivotSheet As Worksheet
    Set DataPivotSheet = WKB.Sheets("DataPivot")
    Dim YTDDataTableSheet As Worksheet
    Set YTDDataTableSheet = WKB.Sheets("YTD Data Table")
    Dim Startrow As Long

    If YTDDataTableSheet.Cells(2, 1) = False Then
    Startrow = YTDDataTableSheet.Cells(2, 1).Row
    Else: Startrow = YTDDataTableSheet.Cells(1, 1).End(xlDown).Offset(1, 0).Row
    End If

    YTDDataTableSheet.Cells(2, 22) = Startrow

    'Below line gets the error:
    DataPivotSheet.Range("J3", Range("A3").End(xlDown)).Copy 
    Destination:=YTDDataTableSheet.Range("A" & Startrow)

    End Sub

2 个答案:

答案 0 :(得分:0)

Excel-VBA中的常见问题:您尚未限定Range("A3")。尽管您似乎很想访问DataPivotSheet中的范围,但是如果您不知道,Excel不会这样做。相反,它将使用 active 工作簿中的范围,该范围可能不是DataPivotSheet

您可以写

DataPivotSheet.Range("J3", DataPivotSheet.Range("A3").End(xlDown)).Copy _
    Destination:=YTDDataTableSheet.Range("A" & Startrow)

或者,也许更好看(注意Range前面的圆点)

With DataPivotSheet
    .Range("J3", .Range("A3").End(xlDown)).Copy _
        Destination:=YTDDataTableSheet.Range("A" & Startrow)
End With

或者,分割您相当复杂的copy语句(使调试更容易)

With DataPivotSheet
    Dim endCell As Range
    Set endCell = .Range("A3").End(xlDown)
    .Range("J3", endCell).Copy Destination:=YTDDataTableSheet.Range("A" & Startrow)
End With

根据经验:切勿在没有Range的情况下访问dot。即使如果您要访问ActiveSheet的范围(并且您不会经常希望访问该范围),最好编写ActiveSheet.Range

答案 1 :(得分:0)

Range("A3").End(xlDown)将返回对单元格本身的引用,而不是对单元格的address属性的引用。
由于您没有指定具有该范围的工作表,因此也会查看ActiveSheet。如果不是DataPivot工作表,它将尝试从不同工作表上的单元格创建引用。

您可以使用:

DataPivotSheet.Range("J3", Range("A3").End(xlDown).Address).Copy _
        Destination:=YTDDataTableSheet.Range("A" & Startrow)  

With DataPivotSheet
    .Range(.Range("J3"), .Range("A3").End(xlDown)).Copy _
        Destination:=YTDDataTableSheet.Range("A" & Startrow)
End With  

从侧面看,从下往上工作通常是查找最后一行的更好方法:

YTDDataTableSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row