Contenido
En VBA (Visual Basic for Applications), las instrucciones `On…GoSub` y `On…GoTo` se utilizan para desviar la ejecución del programa a diferentes líneas de código basándose en el valor de una expresión numérica. Sin embargo, es importante mencionar que estas instrucciones son consideradas obsoletas y resabios de versiones más antiguas de Basic. A pesar de ello, aquí te explico cómo funcionan:
On…GoSub
La instrucción `On…GoSub` es similar a `GoSub`, pero te permite elegir entre varios destinos (subrutinas) basándose en el valor de una expresión. Después de ejecutar la subrutina especificada, el control regresa a la línea siguiente a la llamada `On…GoSub` tras el `Return`.
Ejemplo:
Sub EjemploOnGoSub()
Dim Index As Integer
Index = 2 ' Supongamos que esta es alguna condición o expresión evaluada
On Index GoSub Line1, Line2, Line3
' ... código ...
Exit Sub
Line1:
' ... código para la etiqueta 1 ...
Return
Line2:
' ... código para la etiqueta 2 ...
Return
Line3:
' ... código para la etiqueta 3 ...
Return
End Sub
En este código, si `Index` es 2, la ejecución irá a la etiqueta `Line2`.
On…GoTo
La instrucción `On…GoTo` es similar a `GoTo`, pero te permite elegir entre varios destinos basándose en el valor de una expresión. A diferencia de `GoSub`, `GoTo` no regresa automáticamente, y generalmente se usa para saltar a diferentes partes de un procedimiento.
Ejemplo:
Sub EjemploOnGoto()
Dim Index As Integer
Index = 1 ' Supongamos que esta es alguna condición o expresión evaluada
On Index GoTo Label1, Label2, Label3
' ... código que podría no ejecutarse si el GoTo se activa...
Exit Sub
Label1:
' ... código para la etiqueta 1 ...
Exit Sub
Label2:
' ... código para la etiqueta 2 ...
Exit Sub
Label3:
' ... código para la etiqueta 3 ...
Exit Sub
End Sub
En este caso, si `Index` es 1, la ejecución irá a `Label1`.
Nota importante: Es altamente recomendable evitar el uso de `GoTo` y `GoSub` en programación moderna porque puede hacer que el código sea más difícil de leer, mantener y depurar (es mejor optar por estructuras de control más claras como `If…Then…Else` y bucles, y usar llamadas a subrutinas o funciones cuando sea apropiado). En caso de que se esté trabajando con código existente que utilice estas estructuras, entonces es importante entender su funcionamiento tal como se ha descrito.
Consejo práctico
Para los desarrolladores de VBA actuales, se prefiere adoptar la estrategia de modularización del código mediante la definición de procedimientos `Sub` o funciones `Function` y controlar el flujo del programa utilizando estructuras de control condicional (`If…Then…Else`, `Select Case`) y bucles (`Do…Loop`, `For…Next`), y se evita el uso de `GoTo` y `GoSub`.
Por ejemplo, en lugar de utilizar `On…GoTo` o `On…GoSub`, podrías hacer algo así:
Sub EjemploEstructurado()
Dim Index As Integer
Index = 2 ' Supongamos que esta es alguna condición o expresión evaluada
Select Case Index
Case 1
Call Procedimiento1
Case 2
Call Procedimiento2
Case 3
Call Procedimiento3
End Select
End Sub
Sub Procedimiento1()
' ... código para el procedimiento 1 ...
End Sub
Sub Procedimiento2()
' ... código para el procedimiento 2 ...
End Sub
Sub Procedimiento3()
' ... código para el procedimiento 3 ...
End Sub
Esta estructura es mucho más fácil de leer y mantener que las construcciones `On…GoSub` y `On…GoTo`.