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