Procedimientos
1. Definiciones
Los procedimientos son subprogramas que permiten descomponer una tarea de programación compleja en un conjunto de tareas más breves y simples. Permiten organizar el código dentro de módulos para obtener un código de mantenimiento más simple y fácilmente reutilizable.
En VBA Excel, se distinguen 3 tipos de procedimientos:
- Los procedimientos Sub (de subrutina) se llaman subprogramas o procedimientos Sub.
- Los procedimientos Function se llaman funciones.
- Los procedimientos Property se llaman procedimientos de propiedad.
De momento nos vamos a centrar los dos primeros que son los más utilizados.
Puntos comunes entre procedimientos Sub y funciones
Son los siguientes:
- Ambos contienen instrucciones o métodos VBA.
- Ambos aceptan argumentos.
- Ambos se pueden llamar desde otras funciones o procedimientos Sub.
Características específicas de las funciones
Son las siguientes:
- Devuelven un valor.
- Se pueden utilizar desde Excel como cualquier función.
2. Acceso a los procedimientos
Para acceder a un procedimiento desde la ventana de código de un módulo, abrimos la segunda lista de la ventana del módulo, hacemos clic en el nombre del procedimiento al que deseamos acceder, o también podemos recorrer los procedimientos con CTRL+FLECHA ARRIBA o CTRL+FLECHA ABAJO.
Para seleccionar una palabra hacemos doble clic en la palabra que deseamos seleccionar.
Para seleccionar una linea, situamos el puntero del ratón a la izda de la línea y hacemos clic cuando el puntero se transforme en una flecha.
Para seleccionar un grupo de caracteres, usamos la técnica de arrastrar y soltar, o hacer MAY+CLIC.
Para seleccionar un procedimiento completo, situamos el puntero del ratón a la izquierda de cualquier línea del procedimiento. Cuando el puntero se transforme en una flecha, hacemos doble clic.
Para ejecutar un procedimiento, hacemos clic en el procedimiento que deseamos ejecutar y pulse F5 o el icono de PLAY.
Para eliminar un procedimiento, seleccione todo el procedimiento y pulse SUPR.
Procedimientos Sub
Hay 2 tipos de procedimientos Sub.
- Los procedimientos Sub generales.
- Los procedimientos Sub asociados a eventos.
Procedimiento general
Es aquel procedimiento declarado en un módulo (generalmente un módulo estándar). La llamada a este tipo de procedimientos se define explícitamente en el código.
Procedimiento asociado a un evento
Es un procedimiento que se ejecuta automáticamente ante ciertos eventos de un objeto. Su nombre se forma con el nombre del objeto, seguido de guión bajo ‘_’ y del nombre del evento, ejm. Workbook_Open. La llamada a estos procedimientos es implícita, es decir, el procedimiento se ejecuta automáticamente cuando se produce el evento asociado.
Ejm de procedimiento general
El siguiente procedimiento general pide al usuario su deseo de abandonar la aplicación, y sale de Excel si el usuario responde que sí. Este código se puede ejecutar con un botón de comando o una opción de menú que permita abandonar la aplicación.
Private Sub Terminar() If MsgBox("¿Desea salir del programa?", _ vbQuestion + vbYesNo) = vbYes Then Application.Quit End If End Sub
Ejm de procedimiento asociado a un evento
El siguiente procedimiento asociado a un evento abre automáticamente el libro Ventas.xlsx cuando se abre el libro Resumen.xlsx. Este procedimiento está asociado al evento Open del objeto Workbook y se encuentra en el módulo ThisWorkbook del libro Resumen.xlsx.
Private Sub Workbook_Open() ’ Abre el libro Ventas.xlsx Workbooks.Open Filename:="C:\VENTAS\VENTAS.xlsx" ’ Activa el libro Resumen Windows("RESUMEN.xlsx").Activate End Sub
4. Procedimientos Function
Los procedimientos Function, denominados comúnmente funciones, devuelven un valor resultado de un cálculo. El valor se devuelve a través del nombre de la función.
El lenguaje Visual Basic incluye numerosas funciones integradas, tales como las usadas en cálculos con fechas (day, week, year, format…).
Además de estas funciones integradas, podemos crear nuestras propias funciones personalizadas.
Ejm
La siguiente función pide al usuario que confirme su deseo de abandonar la aplicación, y devuelve true si el usuario responde que sí, y false en caso contrario.
Function Terminar() As Boolean If MsgBox("¿Desea salir del programa?", _ vbQuestion+vbYesNo)=vbYes Then Terminar=true Else Terminar=False End If End Function
5. Declaración de procedimientos
Sintaxis de un procedimiento Sub
Veamos cual es la sintaxis.
(Private | Public | Friend) (Static) Sub NomProc (Lista de argumentos) < Secuencia de instrucciones > End Sub
Sintaxis de un procedimiento Function
Es la siguiente
(Private | Public | Friend) (Static) Function
NomProc (lista de argumentos) (As Type)
< secuencia de instrucciones >
End Function
Normas a tener en cuenta
Para crear un procedimiento Sub o Function, se deben respetar los siguientes pasos.
- Determinar el alcance del procedimiento.
- Declarar el procedimiento según su tipo con la palabra clave Sub o Function, seguida del nombre del procedimiento.
- Definir los argumentos que se deben pasar como parámetros al procedimiento, e indicar entre paréntesis después del nombre del procedimiento.
- En el caso de una función, si es necesario debemos indicar el tipo del valor devuelto después de la palabra clave As.
- Escribimos el código que permita efectuar la operación deseada, si es necesario utilizamos Exit Sub o Exit Function para salir del procedimiento. En el caso de una función, asignamos el resultado al nombre de la función.
- Finalizamos el proceso con End Sub o End Function.
6. Alcance de los procedimientos
El alcance de un procedimiento determina la extensión de su uso:
- Un procedimiento public se puede llamar desde todos los módulos de todos los proyectos de Excel.
- Un procedimiento private sólamente se puede llamar desde un procedimiento dentro del mismo módulo.
- La palabra clave Static indica que las variables locales del procedimiento se mantienen entre una llamada y otra.
- Si no se especifica Public o Private o Friend, los procedimientos son públicos por defecto.
7. Argumentos de los procedimientos
Los argumentos se usan para transferir a los procedimientos parámetros en forma de datos. La cantidad de argumentos puede variar de 0 a varios.
Para declarar un argumento, basta con especificar su nombre. Sin embargo, la sintaxis completa para declarar un argumento es la siguiente:
(Optional) (ByVal | ByRef) (ParamArray) < variable > (As Type)
- La opción Optional: indica que el argumento es opcional y puede omitirse. Los argumentos opcionales se deben ubicar al final de la lista de argumentos y ser de tipo Variant.
- La opción ByVal: indica que el argumento se pasa por valor. El procedimiento accede a una copia de la variable, su valor inicial no se modifica por el procedimiento al que se le pasa.
- La opción ByRef (opción por defecto): indica que el argumento se pasa por referencia, en este caso el procedimiento puede acceder a la variable propiamente dicha, de esta manera su valor real se puede modificar por el procedimiento al que se le pasa.
- La palabra clave ParamArray: se usa únicamente como último argumento de la lista para indicar que se trata de una matriz opcional de elementos de tipo Variant. No se puede usar con las palabras clave ByVal, ByRef u Optional.
- Variable: especificar el nombre del argumento. Para las variables de matriz no especifica su dimensión.
- Type: especifica el tipo de datos del argumento que se pasa al procedimiento (Byte, Boolean, Integer, Long…).
8. Argumentos con nombre
La transferencia de argumentos a un procedimiento según su orden de aparición es a veces difícil de realizar, especialmente cuando hay parámetros opcionales. De la misma manera, la legibilidad de las llamadas a procedimientos con muchos parámetros no siempre es fácil.
Los argumentos con nombre facilitan la transferencia de argumentos gracias a las siguientes ventajas:
- El orden de los argumentos con nombre no es importante.
- Los argumentos opcionales pueden omitirse.
La sintaxis de los argumentos con nombre es:
NomArg := valor
Ejm
El siguiente código VBA
If MsgBox("¿Desea salir de la aplicación?", _ vbYesNo + vbQuestion, "Gestión de ventas") = vbYes Then Application.Quit End If
puede transformarse en
If MsgBox(Prompt:= "¿Desea salir de la aplicación?", _ Buttons:=vbYesNo + vbQuestion, _ Title:="Gestión de ventas") = vbYes Then Application.Quit End If
También se puede modificar el orden de los parámetros
If MsgBox(Prompt:= "¿Desea salir de la aplicación?", _ Title:="Gestión de ventas", _ Buttons:=vbYesNo + vbQuestion) = vbYes Then Application.Quit End If
El nombre de los argumentos aparece automáticamente en el entorno de VBE a medida que se escribe la instrucción. Los argumentos opcionales aparecen entre corchetes.
9. Llamar a un procedimiento
La sintaxis es la siguiente:
(Call) NomProc (lista de argumentos)
Si se indica la palabra clave Call, debes colocar la lista de argumentos entre paréntesis.
- Para almacenar el resultado de una función en una variable, usamos la siguiente sintaxis
<variable> NomProc ([Lista de argumentos])
- Para llamar a un procedimiento de otro módulo, use la siguiente sintaxis:
NomMódulo.NomProcedimiento
Ejm
ThisWorkbook.Salir_Apli
- Para llamar a un procedimiento de otro libro, use la siguiente sintaxis:
Application.Run "NomLibro!NomMódulo.NomProcedimiento"
Ejm
Application.Run "Ventas.xlsm!ThisWorkbook.Salir_Apli"
Para ejecutar este comando, el libro Ventas.xlsm debe estar abierto.
10. Llamar a una función VBA en una fórmula de Excel
Las funciones VBA se pueden usar en las fórmulas de Excel. Todas las funciones declaradas en Public están disponibles en el asistente para funciones de Excel (categoría Funciones Definidas por el usuario).
Ejm
Este ejm utiliza una función VBA que calcula la edad de una persona a partir de su fecha de nacimiento.
Function CalcEdad(FechaNac As Date) Dim zFecha As Date ' Calcula la edad en función de la fecha de nacimiento CalcEdad = Abs(DateDiff("YYYY", FechaNac, Date)) zFecha = DateAdd("YYYY", CalcEdad, fechaNa) If zFecha > Date Then CalcEdad = CalcEdad - 1 End Function
Para utilizar esta función en Excel:
- Selecciona la opción Insertar función de la pestaña Fórmulas.
- En el cuadro de diálogo Insertar función, en la lista seleccionar una categoría, elige Definida por el usuario, la función CalcEdad estará ahora accesible.
- Selecciona la función y haz clic en Aceptar, el cuadro de diálogo pedirá los argumentos de la función, como se ve aquí:
Este ejemplo muestra la importancia del nombre de los argumentos de las funciones: cuanto más explícitos sean estos, más fácil resultará usar la función en Excel.
11. Ejms de procedimientos y funciones
Copiar el contenido de una tabla de valores en la hoja de Excel activa
Sub Mostrar_Tabla() Dim vTabVal As Variant Dim oCelda As Range Dim i As Integer ’ Muestra el contenido de la tabla en la hoja de cálculo activa vTabVal = Array("Buenos Días", 1.244, "=A1+12", "=A2+12") For i = 0 To 3 Set oCelda = Range("A" & i + 1) If MCell(oCelda, vTabVal(i)) Then MsgBox "La celda se actualizó con éxito" Else MsgBox "La celda no se pudo actualizar" End If Next i End Sub
El código de estos ejms se debe escribir en un módulo estándar o en el módulo ThisWorkBook.
La función MCell informa sobre el valor asignado a una celda. Devuelve True si la celda se actualizó correctamente y False en caso contrario.
Private Function MCell(oCelda As Range, _ Valor As Variant) As Boolean ’ Actualización de una celda a partir de un valor MCell = False If Not IsEmpty(oCelda) Then Exit Function oCelda.Value = Valor If oCelda.Text <> "#VALOR!" Then MCell = True End If End Function