Cómo DETENER que VBA interprete los argumentos de una función entera como booleanos si el entero es 0 o -1.
Por favor, revisa el código que he publicado a continuación. Aísla el problema de manera más concisa.
Estoy tratando de capturar un error de argumento, es decir, si el usuario de Excel coloca un booleano en lugar de intTestVar
que debería ser un entero. VBA interpreta una entrada de 0 o -1 (lo cual es válido) como un booleano. Si el usuario ingresa un booleano (no válido), lo interpreta como un entero, es decir, -1 o 0. Entiendo que si conviertes un booleano a un entero, será -1 o 0, pero no lo estoy convirtiendo.
Option Explicit
Public Function TestA(filler As Integer, Optional intTestVar As Integer = 0) As Integer
Dim intTrap As Integer
intTrap = 0
On Error GoTo ErrorH
Debug.Print "cómo VBA ve la variable de argumento " & intTestVar & " type = " & VarType(intTestVar)
If VarType(intTestVar) = vbBoolean Then
intTrap = 1
GoTo ErrorH
End If
'en caso de que eso no funcione
If intTestVar = False Or intTestVar = True Then
intTrap = 2
GoTo ErrorH
End If
'en caso de que eso no funcione
If IsNumeric(intTestVar) = False Then
intTrap = 3
GoTo ErrorH
End If
TestA = 10 * intTestVar
Exit Function
ErrorH:
Debug.Print intTrap & " Atrapó al Bicho "
Resume Next
End Function
Esto es cómo respondió a diferentes valores para intTestVar
– filler
es solo un valor ficticio = 5
Ingresando 6 devuelve 60
cómo VBA ve la variable de argumento 6 type = 2
Ingresando -1 devuelve 0
cómo VBA ve la variable de argumento -1 type = 2
2 Atrapó al Bicho
2 Atrapó al Bicho
Ingresando True devuelve 0
cómo VBA ve la variable de argumento -1 type = 2
2 Atrapó al Bicho
2 Atrapó al Bicho
Ingresando False devuelve 0
cómo VBA ve la variable de argumento 0 type = 2
2 Atrapó al Bicho
2 Atrapó al Bicho
Como dato adicional, no sé por qué el controlador de errores repite el mensaje de error. Resume Next
debería limpiar el error…??
davy.ai
Basado en el código proporcionado, la función
TestA
intenta capturar un error de argumento cuando el usuario de Excel ingresa un valor booleano en lugar de un entero paraintTestVar
. El código utiliza las funcionesVarType
eIsNumeric
para verificar el tipo deintTestVar
y determinar si es válido. Sin embargo, parece que el código no está capturando correctamente el error, ya que el controlador de errores repite el mensaje de error. La razón exacta de este comportamiento no está clara sin más contexto.