10/05/2023
En el vasto universo de la programación, la organización y la reutilización del código son pilares fundamentales para construir aplicaciones robustas y fáciles de mantener. Visual Basic, como lenguaje de programación, nos ofrece herramientas poderosas para lograr esto: las subrutinas, los procedimientos y las funciones. Estas estructuras no solo nos permiten encapsular tareas específicas, sino que también facilitan la depuración y la colaboración en proyectos complejos. ¿Alguna vez te has preguntado cómo se crea Visual Basic automáticamente el código o cómo puedes hacer tus propias rutinas personalizadas? Acompáñanos en este recorrido para desvelar los secretos detrás de estos componentes esenciales.

- La Magia de la Creación Automática de Procedimientos
- Subrutinas y Procedimientos Propios: Tomando el Control
- Dominando los Parámetros: Flexibilidad y Control del Código
- Paso de Parámetros: Por Valor (ByVal) vs. Por Referencia (ByRef)
- Las Funciones en Visual Basic: Retornando Resultados con Propósito
- Tipos de Procedimientos en Visual Basic .NET: Una Visión Ampliada
- Tabla Comparativa: Subrutinas vs. Funciones
- Preguntas Frecuentes sobre Procedimientos y Funciones
- ¿Cuál es la diferencia principal entre un procedimiento (Sub) y una función (Function) en Visual Basic?
- ¿Cuándo debo usar ByVal y cuándo ByRef para pasar parámetros?
- ¿Puedo tener parámetros opcionales en cualquier posición en la declaración de una rutina?
- ¿Cómo puedo saber si un parámetro opcional fue realmente enviado al procedimiento o función?
- ¿Qué sucede si no especifico ByVal ni ByRef al declarar un parámetro?
La Magia de la Creación Automática de Procedimientos
Visual Basic, con su enfoque en la programación orientada a eventos, simplifica enormemente el proceso de asociar acciones a las interacciones del usuario. Una de las características más convenientes es cómo el entorno de desarrollo (IDE) genera automáticamente plantillas de procedimientos para los eventos más comunes de los controles.
Cuando trabajas en un formulario y, por ejemplo, insertas un botón al que llamas Command1, y luego seleccionas su evento Click desde la ventana de propiedades o simplemente haces doble clic sobre él, Visual Basic te facilita la vida creando automáticamente la estructura básica de una subrutina. Esta subrutina, conocida como manejador de eventos, está lista para que escribas el código que deseas que se ejecute cuando el usuario haga clic en ese botón. El resultado es algo como esto:
Private Sub Command1_Click() End SubDe manera similar, si colocas un control TextBox, digamos TextPedidos, y haces doble clic sobre él, Visual Basic asume que el evento más probable que desees manejar es el evento Change, que se dispara cada vez que el texto dentro del cuadro de texto cambia. Así, verás que se genera automáticamente la siguiente estructura:
Private Sub TextPedidos_Change() End SubEstos ejemplos ilustran subrutinas o procedimientos de tipo Privado. Esto significa que su alcance está limitado al formulario o módulo donde han sido declarados. Son accesibles y utilizables solo dentro de ese contexto específico. La palabra clave Sub es seguida por el nombre de la rutina, que en estos casos combina el nombre del control y el evento asociado (por ejemplo, Command1_Click()).
Si alguna vez necesitaras que un procedimiento de este tipo fuera accesible desde otros formularios o módulos de tu proyecto, simplemente tendrías que cambiar su alcance de Private Sub a Public Sub. Esta modificación permite que el procedimiento sea invocado y utilizado desde cualquier parte del proyecto, aumentando la flexibilidad y reutilización de tu código.
Subrutinas y Procedimientos Propios: Tomando el Control
Más allá de los manejadores de eventos generados automáticamente, el verdadero poder de la programación estructurada reside en la capacidad de crear nuestros propios procedimientos y subrutinas personalizados. Estos bloques de código están diseñados para ejecutar tareas específicas y repetitivas, evitando la duplicidad de código y mejorando la legibilidad.
Para definir un procedimiento propio, debes escribir la palabra clave Private Sub o Public Sub, según el alcance que desees que tenga, seguida de un nombre identificativo que tú elijas. Opcionalmente, puedes incluir parámetros entre paréntesis si el procedimiento necesita recibir datos para funcionar. Es crucial que definas estos procedimientos en un espacio vacío dentro de la ventana de código, nunca dentro de otro procedimiento.
Consideremos un ejemplo práctico. Imagina que tienes un formulario con tres controles Label (Label1, Label2 y Label3) y necesitas una forma sencilla de borrar su contenido. Puedes crear un procedimiento específico para esta tarea:
Private Sub ProcedimientoBorrar() Label1.Caption = "" Label2.Caption = "" Label3.Caption = "" End SubUna vez creado, la pregunta natural es: ¿cómo se ejecuta este procedimiento? La respuesta es sorprendentemente sencilla: solo necesitas escribir el nombre del procedimiento en el lugar donde deseas que se ejecute. Por ejemplo, si tienes un botón Command1 y quieres que al hacer clic en él se borren los labels, lo harías así:
Private Sub Command1_Click() ProcedimientoBorrar End SubAl presionar el botón Command1, Visual Basic detectará el nombre ProcedimientoBorrar, saltará automáticamente al lugar donde lo definiste y ejecutará todas las líneas de código contenidas en él. Una vez que el procedimiento termina de ejecutarse, el flujo del programa regresa a la línea siguiente desde donde fue llamado, continuando con el resto del código (si lo hubiera).
También es posible llamar a un procedimiento utilizando la palabra clave Call, seguida del nombre del procedimiento. Si el procedimiento acepta parámetros, estos deben ir entre paréntesis. Por ejemplo: Call ProcedimientoBorrar(). Si bien Call es opcional en la mayoría de los casos para procedimientos sin parámetros o con parámetros pasados sin paréntesis, su uso puede mejorar la claridad del código para algunos desarrolladores.
La principal ventaja de crear procedimientos de código es su capacidad para evitar la repetición de código, haciendo que el programa sea más funcional y comprensible. Permiten dividir un problema complejo en tareas más pequeñas y manejables, cada una encapsulada en su propio procedimiento, lo que facilita la prueba y el mantenimiento.
Dominando los Parámetros: Flexibilidad y Control del Código
Para que un procedimiento o una función no siempre ejecuten las mismas instrucciones o trabajen con los mismos datos, utilizamos los parámetros. Los parámetros son datos que se le “pasan” a una subrutina o función para que los utilice en su ejecución, permitiendo que el código sea mucho más dinámico y versátil. Aunque en algunas situaciones no son necesarios, en otras son prácticamente indispensables.
Los parámetros son valores (cadenas de texto, números, booleanos, objetos, etc.) que se listan después del nombre del procedimiento, separados por comas si hay más de uno. Por ejemplo, si tuvieras un procedimiento para mostrar datos personales, podrías llamarlo así:
DatosPersonales "Luciano", 25, "La Plata"En este ejemplo, estamos pasando tres parámetros: una cadena de texto para el nombre, un número entero para la edad y otra cadena de texto para la ciudad. Es crucial que, al definir el procedimiento, especifiques el tipo de datos que cada parámetro espera recibir. Esto se hace de manera similar a la declaración de variables, pero sin la palabra clave Dim:
Private Sub DatosPersonales(nombre As String, edad As Integer, ciudad As String) Label1.Caption = nombre Label2.Caption = edad Label3.Caption = ciudad End SubAquí, declaramos que DatosPersonales espera tres parámetros: nombre (tipo String), edad (tipo Integer) y ciudad (tipo String). Cuando llamas al procedimiento, los valores que pasas se asignan a estas variables internas en el mismo orden en que están declarados. Es decir, "Luciano" se asigna a nombre, 25 a edad, y "La Plata" a ciudad. Luego, estos valores se utilizan dentro del procedimiento, por ejemplo, para asignarlos a los controles Label.
Es de vital importancia respetar el orden y el tipo de los parámetros. Si intentaras pasar los parámetros de forma incorrecta, como DatosPersonales 25, "Luciano", "La Plata", se produciría un error en tiempo de ejecución. Esto se debe a que el procedimiento espera un String para el primer parámetro (nombre) y le estás pasando un Integer (25), generando una "No coincidencia de tipos" (Type Mismatch).
De igual manera, si un procedimiento ha sido declarado para recibir un número específico de parámetros, debes pasarle exactamente esa cantidad. Si un procedimiento espera dos parámetros y le envías solo uno, obtendrás un error de compilación. Por ejemplo:
Private Sub Sumar(a As Integer, b As Integer) Label1.Caption = a + b End SubSi luego intentaras llamar a este procedimiento con Call Sumar(456), Visual Basic te mostraría un error indicando que faltan argumentos, ya que el procedimiento espera dos y solo recibe uno.
Parámetros Opcionales: Flexibilidad Adicional con Optional e IsMissing
Existe una excepción a la regla de pasar todos los parámetros declarados: la palabra clave Optional. Al usar Optional, puedes permitir que ciertos parámetros sean omitidos al llamar a la rutina, lo que brinda una gran flexibilidad.
Private Sub Con_Parametro_Opcional(Nombre As String, Optional Email As String) MsgBox Nombre MsgBox Email End SubAhora, puedes llamar a esta subrutina omitiendo el parámetro Email sin que se produzca un error:
Call Con_Parametro_Opcional("Maria")Es importante destacar que los parámetros Optional deben ser siempre los últimos en la lista de parámetros de una declaración de procedimiento o función. No puedes tener un parámetro obligatorio después de uno opcional.
Cuando utilizas parámetros opcionales, a menudo necesitas saber dentro del procedimiento si el parámetro opcional fue realmente enviado o no. Para esto, Visual Basic proporciona la función IsMissing. Esta función devuelve True si el parámetro opcional no fue enviado, y False si sí lo fue.
Private Sub Mostrar_Dato(Optional Nombre As Variant) If IsMissing(Nombre) = True Then MsgBox "NO Se ha enviado el parámetro NOMBRE ", vbInformation Else MsgBox "Se ha enviado el parámetro NOMBRE ", vbInformation End If End Sub Private Sub Command1_Click() Mostrar_Dato ' Acá NO se envía el parámetro End Sub Private Sub Command2_Click() Mostrar_Dato "María" ' Acá SÍ se envía el parámetro End SubEn este ejemplo, al hacer clic en Command1, verás un mensaje indicando que el parámetro Nombre no fue enviado. Al hacer clic en Command2, el mensaje indicará que sí fue enviado.
Paso de Parámetros: Por Valor (ByVal) vs. Por Referencia (ByRef)
Una de las distinciones más importantes al trabajar con parámetros es cómo se pasan a la función o procedimiento: por valor (ByVal) o por referencia (ByRef). Esta elección determina si los cambios realizados al parámetro dentro de la rutina afectarán a la variable original fuera de ella.
Paso de Parámetros por Valor (ByVal)
Cuando un parámetro se declara con ByVal, lo que se envía al procedimiento o función es una copia del valor de la variable original. Esto significa que cualquier modificación que se realice a ese parámetro dentro de la rutina solo afectará a esa copia local. La variable original, fuera del procedimiento, conservará su valor inicial y no se verá alterada.
Private Sub Command1_Click() Dim Un_Valor As Long Un_Valor = 100 ' Se envía la variable por Valor (ByVal) Call SumarByVal(Un_Valor) ' Muestra el valor que es 100, (no se modificó en la función SumarByVal) MsgBox Un_Valor End Sub Sub SumarByVal(ByVal Valor As Long) ' Modifica la copia local de la variable Valor = Valor + 100 End SubEn este ejemplo, Un_Valor se inicializa en 100. Cuando se llama a SumarByVal, se pasa una copia de Un_Valor. Dentro de SumarByVal, la copia de Valor se incrementa a 200. Sin embargo, al regresar al Command1_Click, el MsgBox seguirá mostrando 100, demostrando que la variable original Un_Valor no fue afectada por los cambios dentro de SumarByVal. Es como darle una fotocopia de un documento a alguien: puede escribir en la fotocopia, pero el documento original permanece intacto.
Paso de Parámetros por Referencia (ByRef)
En contraste, cuando un parámetro se declara con ByRef, lo que se envía no es una copia del valor, sino una referencia (un puntero) a la ubicación de memoria de la variable original. Esto implica que cualquier cambio que se realice al parámetro dentro del procedimiento o función afectará directamente a la variable original fuera de la rutina. Los cambios son permanentes y visibles una vez que la rutina finaliza.

Private Sub Command1_Click() Dim Un_Valor As Long Un_Valor = 100 ' Se envía la variable por Referencia (ByRef) con el valor 100 Call SumarByRef(Un_Valor) ' Muestra el valor que ahora es 200, (ya que se modificó en la Sub SumarByRef) MsgBox Un_Valor End Sub Sub SumarByRef(ByRef Valor As Long) ' Modifica la variable original Valor = Valor + 100 End SubAquí, Un_Valor comienza en 100. Al llamar a SumarByRef, se pasa una referencia a Un_Valor. Dentro de SumarByRef, cuando Valor se incrementa a 200, este cambio se aplica directamente a la variable original Un_Valor. Por lo tanto, el MsgBox en Command1_Click mostrará 200. Es como darle el documento original a alguien: cualquier cambio que haga en él será un cambio en el documento real.
Nota Importante: En Visual Basic, si no especificas explícitamente ByVal ni ByRef al declarar un parámetro, por defecto se asume que el parámetro se está enviando por referencia (ByRef). Por ejemplo, Sub Sumar(Valor As Long) es equivalente a Sub Sumar(ByRef Valor As Long).
Las Funciones en Visual Basic: Retornando Resultados con Propósito
Las funciones en Visual Basic son muy similares a los procedimientos en la forma en que se declaran, se les pasan parámetros y se llaman. Sin embargo, hay una diferencia fundamental que las distingue y las hace indispensables para ciertos tipos de tareas: las funciones siempre retornan un valor al código que las invocó.
Mientras que un procedimiento ejecuta un conjunto de instrucciones y luego finaliza su ejecución, una función realiza su tarea y, al completarla, devuelve un resultado que puede ser utilizado en una expresión, asignado a una variable o mostrado directamente. Este valor de retorno puede ser de casi cualquier tipo de dato: números, cadenas de texto, fechas, booleanos, objetos, o incluso arreglos.
Para declarar una función, se utiliza la palabra clave Function en lugar de Sub. Además, debes especificar el tipo de dato que la función retornará al final de su declaración, utilizando As TipoDeDato. Dentro del cuerpo de la función, el valor a retornar se asigna al nombre de la función misma, o se utiliza la palabra clave Return (aunque en los ejemplos proporcionados se usa la asignación al nombre de la función).
Aquí tienes un ejemplo de una función simple que suma dos valores y devuelve el resultado:
Private Function Total(Valor1 As Integer, Valor2 As Integer) As Long Total = Valor1 + Valor2 End FunctionEn este caso, la función Total está declarada para recibir dos parámetros enteros (Valor1 y Valor2) y retornará un valor de tipo Long. Dentro de la función, la suma de Valor1 y Valor2 se asigna a Total, que es el nombre de la función y, por lo tanto, el valor que se devolverá.
Para llamar a esta función y utilizar su valor de retorno, simplemente la incluyes en una expresión o la asignas a una variable. Por ejemplo, para mostrar el resultado de la suma en un control Label:
Label1.Caption = Total(502, 1478)Aquí, el control Label1 llamará a la función Total, que realizará la suma de 502 y 1478. El valor resultante (2000) será el valor de retorno de la función, que luego se asignará a la propiedad Caption de Label1.
Tipos de Procedimientos en Visual Basic .NET: Una Visión Ampliada
Aunque nos hemos centrado en subrutinas (Sub) y funciones (Function), Visual Basic .NET ofrece una gama más amplia de procedimientos para manejar diferentes aspectos de la programación. Entender estos tipos te permitirá escribir código más estructurado y eficiente, especialmente cuando trabajes con programación orientada a objetos.
En Visual Basic .NET, podemos identificar cuatro tipos principales de procedimientos:
Procedimientos (Sub): Son bloques de código que ejecutan una serie de instrucciones a petición. Su característica principal es que no devuelven ningún resultado al código que los llamó. Son ideales para realizar acciones, como limpiar campos de texto, guardar datos, o mostrar mensajes.
Private Sub Limpiar() txtNumero1.Clear() txtNumero2.Clear() txtResultado.Clear() End SubFunciones (Function): Similar a los procedimientos, pero con la diferencia crucial de que ejecutan un código y devuelven un resultado al código que las invocó. Son perfectas para realizar cálculos, validaciones, o cualquier operación que deba producir un valor específico.
Private Function Sumar(num1 As Integer, num2 As Integer) As Integer Dim resultado As Integer = num1 + num2 Return resultado End FunctionProcedimientos de Propiedades (Property Procedures - Get/Set): Estos procedimientos son utilizados para manejar las propiedades de los objetos. Permiten un control encapsulado sobre cómo se accede (
Get) y cómo se modifica (Set) el valor de una propiedad. Son fundamentales en la programación orientada a objetos para implementar la encapsulación y la validación de datos.Public Property Numero1 As Integer Get Return _numero1 End Get Set (value As Integer) _numero1 = value End Set End PropertyLos métodos
GetySetactúan como "encapsuladores", proporcionando una interfaz controlada para interactuar con los campos privados de una clase.Procedimientos de Operador (Operator Procedures): Son procedimientos especializados que se utilizan para modificar o "sobrecargar" el funcionamiento de un operador estándar (como
+,-,*,/,=) cuando se aplica a una clase o estructura personalizada. Esto permite que tus propios tipos de datos se comporten de manera intuitiva con los operadores de Visual Basic.Aunque son un tema más avanzado, su existencia demuestra la flexibilidad del lenguaje para extender sus capacidades. Por ejemplo, podrías definir cómo se "suman" dos objetos de una clase
Vector.
Tabla Comparativa: Subrutinas vs. Funciones
Para resumir las diferencias clave entre los dos tipos de procedimientos más utilizados, aquí tienes una tabla comparativa:
| Característica | Subrutina (Sub) | Función (Function) |
|---|---|---|
| Propósito Principal | Ejecutar una tarea o acción. | Realizar un cálculo o tarea y devolver un valor. |
| Retorno de Valor | No devuelve ningún valor. | Siempre devuelve un valor de un tipo de dato específico. |
| Declaración | Empieza con Sub y termina con End Sub. | Empieza con Function y termina con End Function; incluye As TipoDeDato para el retorno. |
| Uso Típico | Manejadores de eventos, procedimientos que modifican estados, acciones sin resultado directo. | Cálculos matemáticos, validaciones de datos, transformaciones de cadenas, obtener información. |
| Cómo se llama | Se invoca por su nombre (ej. MiProcedimiento) o con Call MiProcedimiento. | Se usa en una expresión o se asigna su valor de retorno a una variable (ej. resultado = MiFuncion()). |
Preguntas Frecuentes sobre Procedimientos y Funciones
¿Cuál es la diferencia principal entre un procedimiento (Sub) y una función (Function) en Visual Basic?
La diferencia fundamental radica en su propósito y comportamiento: una Subrutina (Sub) ejecuta una serie de instrucciones y no devuelve ningún valor al código que la llama, mientras que una Función (Function) ejecuta instrucciones y, al finalizar, siempre devuelve un valor de un tipo de dato específico.
¿Cuándo debo usar ByVal y cuándo ByRef para pasar parámetros?
Usa ByVal (Por Valor) cuando quieras asegurarte de que la variable original pasada como parámetro no sea modificada por el procedimiento o función. Se pasa una copia del valor, protegiendo el dato original. Esto es útil para entradas de datos que no deben alterarse. Usa ByRef (Por Referencia) cuando necesites que el procedimiento o función pueda modificar la variable original que se le pasa como parámetro. Se pasa una referencia a la ubicación de memoria de la variable, permitiendo que cualquier cambio persista fuera de la rutina. Esto es útil si necesitas que una rutina devuelva múltiples valores a través de los parámetros modificados.
¿Puedo tener parámetros opcionales en cualquier posición en la declaración de una rutina?
No. Los parámetros declarados con la palabra clave Optional deben ser siempre los últimos en la lista de parámetros de un procedimiento o función. No puedes tener un parámetro obligatorio después de un parámetro opcional.
¿Cómo puedo saber si un parámetro opcional fue realmente enviado al procedimiento o función?
Para verificar si un parámetro opcional fue proporcionado al llamar a una rutina, puedes utilizar la función IsMissing. Esta función devuelve True si el parámetro opcional no se envió y False si sí se envió. Es especialmente útil cuando el parámetro opcional es de tipo Variant.
¿Qué sucede si no especifico ByVal ni ByRef al declarar un parámetro?
Si no indicas explícitamente ByVal ni ByRef al declarar un parámetro en Visual Basic, por defecto se asumirá que el parámetro se está pasando por referencia (ByRef). Es una buena práctica especificar siempre el método de paso de parámetros para evitar ambigüedades y hacer el código más claro.
Dominar el uso de subrutinas, procedimientos y funciones es un paso crucial para cualquier programador de Visual Basic. Estas herramientas no solo te permiten escribir código más organizado y reutilizable, sino que también mejoran la legibilidad y facilitan la depuración de tus aplicaciones. Al comprender cómo funcionan los parámetros, la distinción entre ByVal y ByRef, y los diferentes tipos de procedimientos, estarás bien equipado para construir programas eficientes y escalables. La programación estructurada es la clave para desbloquear el verdadero potencial de tus proyectos en Visual Basic.
Si quieres conocer otros artículos parecidos a Dominando Procedimientos y Funciones en Visual Basic puedes visitar la categoría Librerías.
