Saltar al contenido

¿Cómo manejar el error 1004 Error con WorksheetFunction.VLookup?

Luego de consultar con especialistas en esta materia, programadores de diversas ramas y profesores hemos dado con la respuesta al dilema y la dejamos plasmada en esta publicación.

Solución:

En vez de WorksheetFunction.Vlookuppuedes usar Application.Vlookup. Si establece un Variant igual a esto, devuelve el error 2042 si no se encuentra ninguna coincidencia. A continuación, puede probar la variante – cellNum en este caso – con IsError:

Sub test()
Dim ws As Worksheet: Set ws = Sheets("2012")
Dim rngLook As Range: Set rngLook = ws.Range("A:M")
Dim currName As String
Dim cellNum As Variant

'within a loop
currName = "Example"
cellNum = Application.VLookup(currName, rngLook, 13, False)
If IsError(cellNum) Then
    MsgBox "no match"
Else
    MsgBox cellNum
End If
End Sub

Él Application versiones de la VLOOKUP y MATCH funciones le permiten probar errores sin levantamiento el error. Si usas el WorksheetFunction versión, necesita un manejo de errores complicado que redirige su código a un controlador de errores, regresa a la siguiente declaración para evaluar, etc. Con el Application funciones, puede evitar ese lío.

Lo anterior podría simplificarse aún más usando el IIF función. Este método no siempre es apropiado (p. ej., si tiene que hacer más/procedimiento diferente basado en el If/Then) pero en el caso de que simplemente esté tratando de determinar qué aviso mostrar en MsgBox, debería funcionar:

cellNum = Application.VLookup(currName, rngLook, 13, False)
MsgBox IIF(IsError(cellNum),"no match", cellNum)

Considere esos métodos en vez deOn Error ... declaraciones. Ambos son más fáciles de leer y mantener: pocas cosas son más confusas que tratar de seguir un montón de GoTo y Resume declaraciones.

Hay una manera de omitir los errores dentro del código y continuar con el ciclo de todos modos, espero que ayude:

Sub new1()

Dim wsFunc As WorksheetFunction: Set wsFunc = Application.WorksheetFunction
Dim ws As Worksheet: Set ws = Sheets(1)
Dim rngLook As Range: Set rngLook = ws.Range("A:M")

currName = "Example"
On Error Resume Next ''if error, the code will go on anyway
cellNum = wsFunc.VLookup(currName, rngLook, 13, 0)

If Err.Number <> 0 Then
''error appeared
    MsgBox "currName not found" ''optional, no need to do anything
End If

On Error GoTo 0 ''no error, coming back to default conditions

End Sub

Desde mi limitada experiencia, esto sucede por dos razones principales:

  1. Él valor de búsqueda (arg1) no está presente en el matriz de tabla (arg2)

La solución simple aquí es usar un controlador de errores que termine con Resume Next

  1. Los formatos de arg1 y arg2 no se interpretan correctamente

Si tu lookup_value es una variable con la que puedes encerrarlo TRIM()

numeroCelda = wsFunc.VLookup(RECORTAR(nombreActual), rngLook, 13, Falso)

Si te gusta la invitación, tienes el poder dejar un escrito acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *