5. Subrutinas y Funciones Propias
En esta lección aprenderás a:
- Distinguir
Sub(sin retorno) deFunction(con retorno). - Pasar parámetros con
ByValyByRef. - Llamar un
Subdesde otro procedimiento. - Crear funciones personalizadas (UDF) usables directamente en celdas.
Sub vs Function
Vista tipo Excel: la primera fila muestra las letras de columna; la primera columna muestra los números de fila. En las celdas con fórmula (=...), cada referencia lleva un color distinto. Clic en la referencia: resalta solo esa celda. Clic en el resto de la celda (por ejemplo el = o los operadores): resalta todas las celdas citadas. Repetir el mismo gesto sobre lo ya resaltado lo oculta.
Diferencias clave entre Sub y FunctionResumen
Una Sub automatiza acciones. Una Function calcula y devuelve un resultado.
| A | B | C | |
|---|---|---|---|
| 1 | Sub | Function | |
| 2 | Devuelve un valor | No | Sí |
| 3 | Se puede usar en celdas de Excel | No | Sí (UDF) |
| 4 | Se puede llamar desde código | Sí | Sí |
| 5 | Aparece en Alt+F8 (lista de macros) | Sí | No |
| 6 | Sintaxis de cierre | End Sub | End Function |
Sub con parámetros — ByVal
ByVal vs ByRef
Function — crear funciones personalizadas (UDF)
Practica en Excel
Abre Excel (o copia los datos con el botón de la tabla), sigue los pasos y comprueba el resultado en tu hoja.
- Crea MostrarSaludo() y llámala desde EjecutarSaludo() con dos nombres distintos.
- Ejecuta la Sub Prueba() y verifica en la ventana Inmediata la diferencia entre ByVal y ByRef.
- Escribe PrecioConIVA() en el módulo y úsala desde una celda con =PrecioConIVA(1000).
- Crea ClasificarEdad() y aplícala en una columna de edades.
Ejercicios de práctica
Ejercicio 1 — Sub que limpia un rango
Crea una Sub LimpiarHoja que borre el contenido de A1:Z100 de la hoja activa. Llámala desde otra Sub para probarla.
Ver solución sugerida
Ejercicio 2 — Function: es positivo?
Crea una Function EsPositivo(n As Double) As Boolean que devuelva True si el número es mayor que 0. Úsala en una Sub que lea A1 y muestre el resultado con MsgBox.
Ver solución sugerida
Ejercicio 3 — UDF: Celsius a Fahrenheit
Crea una UDF CelsiusAFahrenheit(c As Double) As Double. La fórmula es (c × 9/5) + 32. Úsala en una celda con =CelsiusAFahrenheit(A1).
Ver solución sugerida
Ejercicio 4 — Sub con parámetro de encabezado
Crea una Sub LlenarEncabezado(ByVal columnas As Integer) que escriba "Columna 1", "Columna 2", … hasta el número de columnas indicado, en la fila 1. Llámala con LlenarEncabezado 5.
Ver solución sugerida
Ejercicio 5 — Function: promedio de tres
Crea una Function Promedio3(a As Double, b As Double, c As Double) As Double y úsala en una Sub que lea tres celdas y muestre el promedio.
Ver solución sugerida
Ejercicio 6 — Sub organizada en dos partes ⭐⭐
Crea una Sub principal PrepararReporte que llame a dos Sub auxiliares: LimpiarZona (borra A1:E20) y EscribirEncabezados (escribe títulos en la fila 1). Organiza el código en tres procedimientos separados.
Ver solución sugerida
Ejercicio 7 — UDF: comisión de ventas ⭐⭐
Crea una UDF CalcularComision(ventas As Double, porcentaje As Double) As Double. Úsala en celdas con =CalcularComision(A1, 0.08) para calcular el 8% de comisión.
Ver solución sugerida
Ejercicio 8 — ByRef en práctica ⭐⭐
Crea una Sub AgregarIVA(ByRef precio As Double) que multiplique el precio por 1.19 modificando la variable original. Comprueba que después de llamarla, la variable del llamador tiene el nuevo valor.
Ver solución sugerida
Ejercicio 9 — UDF: ¿Es fin de semana? ⭐⭐
Crea una UDF EsWeekend(fecha As Date) As Boolean que devuelva True si la fecha cae en sábado (7) o domingo (1) usando Weekday(). Úsala en una celda.
Ver solución sugerida
Ejercicio 10 — Parámetro opcional ⭐⭐
Crea una Sub MostrarMensaje(ByVal texto As String, Optional titulo As String = "Aviso"). Si se pasa el segundo argumento usa ese título; si no, usa "Aviso" como predeterminado. Pruébala con y sin el segundo argumento.
Ver solución sugerida
Ejercicio 11 — Function que cuenta no vacías ⭐⭐⭐
Crea una Function ContarNoVacias(rango As Range) As Integer que cuente las celdas con contenido en el rango dado. Úsala en una Sub pasando Range("A1:A20").
Ver solución sugerida
Ejercicio 12 — UDF: clasificar venta ⭐⭐⭐
Crea una UDF ClasificarVenta(monto As Double) As String que devuelva "Baja" (menor de 1000), "Media" (1000–9999) o "Alta" (10000 o más). Aplícala en una columna de montos.
Ver solución sugerida
Ejercicio 13 — Extraer solo letras ⭐⭐⭐
Crea una Function SoloLetras(texto As String) As String que recorra el texto carácter por carácter con Mid() y devuelva solo las letras (A-Z, a-z) eliminando números y espacios.
Ver solución sugerida
Ejercicio 14 — Exit Function ⭐⭐⭐
Crea una Function DividirSeguro(a As Double, b As Double) As Variant que devuelva el resultado de a/b. Si b es 0, usa Exit Function después de asignar DividirSeguro = "Error: división por cero".
Ver solución sugerida
Ejercicio 15 — Pipeline de funciones ⭐⭐⭐
Crea tres funciones: BaseImponible(precio, cantidad), CalcularIVA(base) y TotalFactura(precio, cantidad) que llame a las dos anteriores. Escribe en celdas A1=precio, B1=cantidad y ejecuta una Sub que llene C1=base, D1=IVA y E1=total.