#excel #vba
#excel #vba
Вопрос:
У меня есть два листа, один из которых представляет собой отчет о номерах билетов, а другой — ссылку на возможные альтернативные номера. Вот что я хочу сделать:
- извлеките значение из отчета
- найдите ее в справочном листе
- если она существует в справочном листе, верните значение соседнего столбца
- если она не существует, пропустите ее и посмотрите на следующее значение в отчете
Я могу легко сделать это с vlookup
помощью функции в самом листе, но там много строк, и я пытаюсь ускорить это с помощью VBA.
До сих пор я пытался application.vlookup
сначала использовать, а затем комбинировал методы «Найти» и «Смещение», чтобы получить то, что я хочу. Оба работают нормально, пока значение из отчета существует в диапазоне поиска моего справочного листа. Если этого не происходит, я получаю сообщение об ошибке.
Я не знаю, что еще попробовать. Это то, что у меня есть прямо сейчас, используя «Найти» и «Смещение», я удалил код, используя application.vlookup
:
Function ticket_lookup(NS35 As Long) As Long
Dim rngholder As Range
Set rngholder = Worksheets("Ticket_No").Range("A1")
Dim holder As Long
Dim rw As Integer
rw = Worksheets("Ticket_No").Range("A2").End(xlDown).Row
rngholder = Worksheets("Ticket_No").Range("A2:B" amp; rw).Find(NS35, LookIn:=xlValues, lookat:=xlPart)
If Not rngholder Is Nothing Then
holder = rngholder.Cells(rw, "A").Offset(, 1).Value
Ниже у меня есть некоторая обработка ошибок для определенных значений, которые я переработал откуда-то еще и знаю, что это работает. NS35 — это значение, переданное из листа отчета. Я проверил rngholder ни для чего, потому что я думал, что «Find» должен был ничего не возвращать, если он не смог найти значение.
Комментарии:
1.
rw = Worksheets("Ticket_No").Range("A2").End(xlDown).Row
не очень хорошо работает, если в середине данных есть пустые ячейки. Лучше использоватьrw = Worksheets("Ticket_No").Cells(Rows.Count,1).End(xlUp).Row
. Кроме того, зачем использоватьInteger
, когда вы знаете оLong
? Это просто рискует переполнением без выгоды.2. Отсутствует
Set
:Set rngholder = ...
3. @JohnColeman в наборе данных нет пробелов. И сейчас я использую небольшой образец. Я обычно работаю, сначала находя решение, а затем его точную настройку позже.
4. @BigBen Я установил rngholder сразу после того, как объявил его как диапазон. Вы хотите сказать, чтобы установить rngholder явно как «…»?
5. В вашем фрагменте кода отсутствует
Set
beforerngholder = Worksheets("Ticket_No").Range("A2:B" amp; rw)
. Избавиться отSet rngholder = Worksheets("Ticket_No").Range("A1")
.