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.Vlookup
puedes 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:
- É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
- 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.