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

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

0
dominic.landert 28 Май 2019 в 12:33

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 примет рабочую книгу и рабочую таблицу active . Если это не то, на что вы собираетесь ссылаться, вы, скорее всего, получите ошибку. Вы могли бы упростить свою жизнь, используя оператор 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
0
Tim Stack 28 Май 2019 в 09:47

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

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
Error 1004 28 Май 2019 в 09:46