En VBA, a veces queremos salir del programa después de alguna condición es verdadera. Pero, ¿utilizo end
o exit sub
?
Esto es un poco fuera del alcance de su pregunta, pero para evitar cualquier confusión potencial para los lectores que son nuevos en VBA: End
y End Sub
no son lo mismo. No realizan la misma tarea.
El End
pone fin a TODA ejecución de código y casi siempre se debe utilizar Exit Sub
(o Exit Function
, respectivamente).
End detiene TODA ejecución. Aunque suena tentador, también borra todas las variables globales y estáticas. todas las variables globales y estáticas. (fuente)
Ver también el dox de MSDN para la sentencia End
Cuando se ejecuta, la sentencia End
reinicia todas las variables a nivel de módulo y todas las variables locales estáticas en todos los módulos. Para preservar el valor de estas variables, utilice la sentencia Stop
en su lugar. Entonces puede reanudar la ejecución preservando el valor de esas variables.
Nota La sentencia End
detiene la ejecución del código de forma abrupta, sin invocar los eventos Unload, QueryUnload, o Terminate, o cualquier otro código de Visual Basic. El código que haya colocado en los eventos Unload, QueryUnload y Terminate de los módulos form y class no se ejecuta. Los objetos creados a partir de módulos de clase se destruyen, los archivos abiertos mediante la sentencia Open se cierran y la memoria utilizada por el programa se libera. Las referencias a objetos mantenidas por otros programas se invalidan.
Tampoco es lo mismo End Sub
que Exit Sub
. No se puede llamar a End Sub
de la misma forma que a Exit Sub
, porque el compilador no lo permite.
Esto significa de nuevo que tienes que Exit Sub
, que es una operación perfectamente legal:
Salir de Sub Sale inmediatamente del procedimiento Sub en el que aparece. La ejecución continúa con la sentencia que sigue a la sentencia que llamó al procedimiento Sub. Exit Sub sólo puede usarse dentro de un procedimiento Sub. procedimiento.
Adicionalmente, y una vez que entiendas como funcionan los procedimientos, obviamente, End Sub
no borra ninguna variable global. Pero sí limpia las variables locales (Dim'd):
End Sub Termina la definición de este procedimiento.