Ошибка во время выполнения «1004»: сбой метода «Range» объекта «_Worksheet» после сохранения файла - PullRequest
0 голосов
/ 28 мая 2019

Код, который я пытаюсь написать, должен просто проверить разные записи в системе цен моей компании.Он должен взять заказ на поставку из прошлого и проверить, какая из записей о ценах была бы самой дешевой для определенной минимальной суммы заказа.Перед этим код определяет диапазон Range PBRange, который затем должен быть отсортирован для работы с предложениями 'if' впоследствии.При определении PBRange возникает ошибка 1004.

При сохранении и повторном открытии файла всплывает сообщение о том, что обнаружена проблема с некоторым содержимым файла.После того, как я попросил его восстановить, код больше не работает.Странно то, что в начале код работал отлично.

Public PBRange As Range
Public PO As Worksheet
Public PB As Worksheet

Sub CheapestPrice()


Dim LastRowPO As Long
Dim LastRowPB As Long

Dim i As Long
Dim j As Long

Set PO = Worksheets("Purchase Orders")
Set PB = Worksheets("Price Book")

'!!!Here the error occurs!!!
Set PBRange = PB.Range("A1", Range("A1").End(xlDown).End(xlToRight))

Код после - это просто комбинация if if else с двумя циклами for для работы с двумя рабочими листами.Это должно прекрасно работать.

Я ожидаю, что диапазон будет сортироваться впоследствии по другим критериям.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Вы можете попробовать:

Option Explicit

Public PBRange As Range
Public PO As Worksheet, PB As Worksheet

Sub test()
    Dim LastRowA As Long

    With ThisWorkbook
        Set PO = .Worksheets("Purchase Orders")
        Set PB = .Worksheets("Price Book")
    End With

    With PB
        'Find Sheet PB & Column A last row
        LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row
        'With out using LastRowA variable
        Set PBRange = .Range("A1:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
        'Using LastRowA variable
        Set PBRange = .Range("A1:A" & LastRowA)
    End With

End Sub
0 голосов
/ 28 мая 2019

Ссылка правильно - ключ для предотвращения ошибок. Даже если они не появляются сразу, эти ошибки появятся и займут ваш код раньше, чем позже.

Правильные ссылки могут быть, например:

Option Explicit

Public PBRange As Range
Public PO As Worksheet
Public PB As Worksheet

Sub CheapestPrice()
Dim LastRowPO As Long, LastRowPB As Long, i As Long, j As Long

Set PO = ThisWorkbook.Sheets("Purchase Orders")
Set PB = ThisWorkbook.Sheets("Price Book")

Set PBRange = PB.Range("A1", PB.Range("A1").End(xlDown).End(xlToRight))

End Sub

Если вы не укажете ни рабочую книгу, ни рабочую таблицу, как в случае Range("A1"), VBA примет рабочую книгу и рабочую таблицу active . Если это , а не то, на что вы собираетесь ссылаться, вы, скорее всего, получите ошибку. Вы можете упростить свою жизнь, используя оператор With...End With, чтобы предотвратить много печатания. E.g.:

Sub example()
Dim LRow As Long

With ThisWorkbook.Sheets(1)
    LRow = .Cells(.Rows.Count, "D").End(xlUp).Row
    MsgBox LRow

    .Range("D1:D" & LRow).Value = "NewValue"
End With

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