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.

Argumento con nombre

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.

Llamar a una función desde una celda de Excel

  • 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í:

Llamar a una función desde una celda de Excel 2

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