Код, который я пытаюсь написать, должен просто проверять различные записи в прейскуранте в системе моей компании. Он должен взять заказ на покупку из прошлого и проверить, какой из них был бы самым дешевым в книге цен для определенного минимального количества заказа.
Прежде чем сделать это, код определяет диапазон 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 для работы с двумя рабочими листами. Это должно отлично работать.
Я ожидаю, что диапазон будет сортироваться впоследствии по разным критериям.
Правильная ссылка — ключ для предотвращения ошибок. Даже если они не появятся сразу, эти ошибки всплывут и исправят ваш код раньше, чем позже.
Правильная ссылка может быть, например:
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, поэтому большое спасибо за этот совет! Я еще немного погуглю о правильных ссылках, чтобы предотвратить подобные ошибки в будущем!
Без проблем! Если мой ответ помог вам, не забудьте принять его, нажав на значок проверки под кнопкой отрицательного ответа :)
Вы можете попробовать:
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
Непосредственной проблемой, которую я вижу, является неправильная ссылка. Рабочие листы не связаны с рабочей книгой, а в строке
Set PBRange
у вас есть объект Range, не связанный с каким-либо листом или wb. Последний дает мне ту же ошибку, что и у вас