【问题标题】:Method range of object worksheet failed对象工作表的方法范围失败
【发布时间】:2018-11-06 18:20:23
【问题描述】:

我一直在寻找解决方案时遇到此错误,但找不到。 谁能指出下面的代码有什么问题?

    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

【问题讨论】:

标签: vba


【解决方案1】:

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

你可以写

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-statement(使调试更容易)

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

根据经验:如果没有 dot,切勿访问 Range。即使如果你想访问ActiveSheet的范围(你不会经常这样),最好写ActiveSheet.Range

【讨论】:

  • 感谢您的回答。确实有助于分配编写未来的代码。
【解决方案2】:

Range("A3").End(xlDown) 将返回对单元格本身的引用,而不是单元格的地址属性。
由于您没有指定具有该范围的工作表,因此它还将查看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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多