Код, который я пытаюсь написать, должен просто проверять записи в прайс-листах в моей компании Он должен взять заказ на поставку из прошлого и проверить, какая из записей о цене была бы самой дешевой для определенной минимальной суммы заказа. Прежде чем сделать это, код определяет 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 листа. Это должно работать отлично.
Я ожидаю, что диапазон будет сортироваться впоследствии по другим критериям.
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
Вы можете попробовать:
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
Похожие вопросы
Новые вопросы
excel
Только для вопросов по программированию для объектов или файлов Excel или для разработки сложных формул. Вы можете объединить тег Excel с VBA, VSTO, C #, VB.NET, PowerShell, OLE-автоматизацией и другими тегами и вопросами, связанными с программированием, если это применимо. Общая помощь по MS Excel для функций одного листа доступна в Super User.