VBA для поиска в справочном листе, возвращает ошибку, когда она не существует

#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 before rngholder = Worksheets("Ticket_No").Range("A2:B" amp; rw) . Избавиться от Set rngholder = Worksheets("Ticket_No").Range("A1") .