Ошибка выполнения «1004»: метод «Диапазон» объекта «_Worksheet» не удалось выполнить после сохранения файла

Код, который я пытаюсь написать, должен просто проверять различные записи в прейскуранте в системе моей компании. Он должен взять заказ на покупку из прошлого и проверить, какой из них был бы самым дешевым в книге цен для определенного минимального количества заказа. Прежде чем сделать это, код определяет диапазон PBRange, который затем должен быть отсортирован для последующей работы с предложениями «если». При определении 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 else с двумя циклами for для работы с двумя рабочими листами. Это должно отлично работать.

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

Непосредственной проблемой, которую я вижу, является неправильная ссылка. Рабочие листы не связаны с рабочей книгой, а в строке Set PBRange у вас есть объект Range, не связанный с каким-либо листом или wb. Последний дает мне ту же ошибку, что и у вас

Tim Stack 28.05.2019 11:37
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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 примет рабочую книгу и рабочий лист активный. Если это нет, на которые вы собираетесь ссылаться, вы, скорее всего, получите сообщение об ошибке. Вы можете облегчить себе жизнь, используя оператор With...End With, чтобы не набирать много текста. Например.:

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

Вау, это было быстро! Я новичок в VBA, поэтому большое спасибо за этот совет! Я еще немного погуглю о правильных ссылках, чтобы предотвратить подобные ошибки в будущем!

dominic.landert 28.05.2019 11:45

Без проблем! Если мой ответ помог вам, не забудьте принять его, нажав на значок проверки под кнопкой отрицательного ответа :)

Tim Stack 28.05.2019 11:48

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

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

Другие вопросы по теме