2017-01-13 4 views
0

У меня есть следующая проблема: У меня есть VLOOKUP, который я хочу запустить в цикле, но когда vlookup не находит соответствующее значение, он останавливает скрипт. Если я обработаю ошибку с обработчиком ошибок, она будет прыгать и также останавливать ее в любом случае.VLOOKUP INSIDE A LOOP (FOR) VISUAL BASIC EXCEL

Sub Botón1_Haga_clic_en() 
Dim filas As Integer 
Dim desdefila As Integer 

filas = InputBox("Cuantas files tiene éste bloque de pagos?") 
desdefila = InputBox("Desde que fila empieza?") 
filasfinal = filas + desdefila 

For x = desdefila To filasfinal 

Dim Nombre As String 
Dim Rango As Range 

Set Rango = Sheets(6).Range("A:B") 

Nombre = Application.WorksheetFunction.VLookup(Range("A" & desdefila).Value, Rango, 2, 0) 
Range("E" & desdefila).Value = Nombre 
desdefila = desdefila + 1 

Next 

End Sub 

Любые идеи о том, как вернуться к циклу или обработать эту ошибку?

+0

Вы объявляете Nombre как строку, поэтому, если значение не найдено, оно возвращает ошибку, которую Excel не понравится, поэтому объявите ее как вариант. Затем добавьте проверку Iferror перед продолжением. – SJR

+0

Вы также можете поделиться своим обработчиком ошибок? –

+1

ПОЖАЛУЙСТА, НЕТ НУЖНО СЖАТИТЬ НА ЛЮДЕЙ. –

ответ

3

Вы можете обрабатывать ошибку ВПР, используя следующую структуру:

Dim myValue As Variant 

myValue = Application.VLookup("Some Value", Range("A:B"), 2, False) 

If IsError(myValue) Then 
    'Code for when not found 
Else 
    'Code for when found 
End If 

Обратите внимание, что это делает не использование Application.WorksheetFunction.VLookup, но вместо этого использует Application.VLookup.

Таким образом, для вашего кода, обработка ошибок будет вставлена ​​выглядеть примерно так:

Dim Nombre As Variant 
Dim Rango As Range 

Set Rango = Sheets(6).Range("A:B") 

Nombre = Application.VLookup(Range("A" & desdefila).Value, Rango, 2, 0) 

If IsError(Nombre) Then 
    'Code for when not found 
Else 
    Range("E" & desdefila).Value = Nombre 
End If 

desdefila = desdefila + 1 
1

Раннего переплете VLookup функция от WorksheetFunction поднимет ошибку во время выполнения, если поиск неудачен.

Если неудача поиск является исключительной вещью и вы хотите, чтобы справиться с этим чисто, необходим для обработки ошибок подпрограммы в:

On Error GoTo ErrHandler 

    For ... 

     Nombre = Application.WorksheetFunction.VLookup(Range("A" & desdefila).Value, Rango, 2, 0) 

     '... 
    Next 

    Exit Sub 
ErrHandler: 
    ' execution jumps here in case of a failed lookup 
    MsgBox "Lookup of '" & Range("A" & desdefila) & "' failed. Please verify data." 
    'if you want to resume the loop, you can do this: 
    Resume Next 
    'otherwise execution of the procedure ends here. 
End Sub 

Если вы знаете неудачу поиск является возможностью, но не совсем исключительный, и вы просто хотите иметь дело с ним и двигаться дальше, вы можете использовать On Error Resume Next/On Error GoTo 0, чтобы скрыть ошибку вместо:

On Error Resume Next 
    Nombre = Application.WorksheetFunction.VLookup(Range("A" & desdefila).Value, Rango, 2, 0) 
    If Err.Number <> 0 Then Nombre = "Not Available" 
    Err.Clear 
    On Error GoTo 0 

В качестве альтернативы вы можете использовать позднюю версию (как в elmer007's answer), которая расширяет интерфейс Application; вместо повышения ошибки во время выполнения VBA, когда поиск неудачен, он возвращает значения ошибки, что вы можете проверить с помощью функции IsError:

Dim Nombre As Variant 'note "As Variant" 

For ... 

    Nombre = Application.VLookup(Range("A" & desdefila).Value, Rango, 2, 0) 
    If IsError(Nombre) Then 
     'handle error value 
    End If 

    '... 

Next 

Одним из преимуществ использования ранней переплете версии , заключается в том, что вы получаете IntelliSense для параметров, тогда как вам нужно точно знать, что вы делаете, когда используете позднюю версию.