Сбой диапазона методов объекта листа - PullRequest
0 голосов
/ 06 ноября 2018

Я продолжаю получать эту ошибку в поисках решения, но не могу найти его. Кто-нибудь может указать, что не так с кодом ниже?

    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 голосов
/ 06 ноября 2018

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
0 голосов
/ 06 ноября 2018

Распространенная проблема в Excel-VBA: вы не указали Range("A3"). Хотя кажется очевидным, что вы хотите получить доступ к диапазону от DataPivotSheet, Excel не сделает этого, если вы не скажете. Вместо этого он будет использовать Range из active workbook, который, вероятно, не является 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...