A pesar de que el número de funciones incluidas en la hoja de cálculo es bastante extenso, es muy probable que, en alguna ocasión, haya echado en falta una función determinada o quiera transformar en función alguna fórmula que utiliza habitualmente. Este mes veremos cómo definir nuevas funciones en Excel, OpenOffice y StarOffice para utilizarlas en la hoja de cálculo. Contemplaremos la posibilidad de disponer de un número de argumentos variable e incluso opcional, indicaremos cómo compartirlas con otros libros y las protegeremos para impedir su modificación o copia.

Cómo definir una función personalizada en ExceL

Cuando lea estas líneas la sonda espacial Messenger ya estará rumbo a Mercurio. En su viaje sobrevolará Venus y el peso de la sonda será diferente en los tres planetas (incluyendo la Tierra). Suponga que la masa de la sonda es de 1.200 kg y que le interesa realizar una tabla comparativa de su peso. Como la Messenger no habrá llegado a su destino final hasta el 2011, le propongo que cree las funciones pesoTierra, pesoMercurio y pesoVenus para calcular el peso en cada planeta.

Sabemos que el peso (p) de la sonda es igual a su masa (m) multiplicada por la aceleración de la gravedad del planeta (g). También sabemos que esta aceleración es de 9,78; 2,78 y 8,87 para la Tierra, Mercurio y Venus, respectivamente. Por tanto, las tres funciones constarán de un argumento, la masa, puesto que g es constante para cada planeta. Veamos cómo sería la primera función:

Function pesoTierra(masa As Double) As Double

Dim gTierra As Double

gTierra = 9.78

pesoTierra = masa * gTierra

End Function

La primera instrucción se encarga de definir el nombre de la función, sus argumentos y el tipo de valor que devolverá. En este caso sólo hay un argumento (la masa), pero es posible que una función no tenga argumento o que tenga varios (separados por comas). Por ejemplo, una función genérica para calcular el peso podría ser peso(masa As Double, gravedad as Double). Observe que se indica el tipo de dato (Double) tanto en los argumentos como en la función y recuerde que debe escoger un tipo de dato adecuado a sus necesidades: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant (predeterminado). Consulte la ayuda de su hoja de cálculo para saber más acerca de los tipos de datos.

La segunda instrucción utiliza Dim para reservar espacio para la variable gTierra de tipo Double que posteriormente almacenará el valor 9,78. Seguidamente calculamos el peso multiplicando la masa por la gravedad y asignándola al nombre de la función. Por último, End Function da por terminada la definición.

Las dos funciones restantes son similares:

Function pesoMercurio(masa As Double) As Double

Dim gMercurio As Double

gMercurio = 2.78

pesoMercurio = masa * gMercurio

End Function

Function pesoVenus(masa As Double) As Double

Dim gVenus As Double

gVenus = 8.87

pesoVenus = masa * gVenus

End Function

Ahora es necesario teclear el código de estas funciones en el editor de Basic de su hoja de cálculo. Para acceder a su editor, si se trata de Excel:

1. Pulse la combinación de teclas ALT+F11.

2. Seleccione en el menú del Editor de Visual Basic Insertar » Módulo y teclee el código de las funciones.

Si se trata de OpenOffice o StarOffice:

1. Seleccione en el menú Herramientas » Macros » Macro.

2. En el cuadro Macro desde, seleccione el nombre de su hoja de cálculo y pulse el botón Nuevo.

Una vez escrito el código, guárdelo y ciérrelo mediante el menú Archivo. Sólo resta probar las funciones en la hoja de cálculo. Por ejemplo, si en la celda A1 tiene la masa de la sonda (1.200) y en otra escribe la fórmula =pesoTierra(A1) obtendrá el valor 11.736. De igual manera =pesoMercurio(A1) y =pesoVenus(A1) devolverán respectivamente 3.336 y 10.644.

Función personalizada con argumentos opcionales

Continuando con el supuesto anterior, es probable que usted piense que es más adecuado definir una fórmula general para el peso en lugar de tener una para cada planeta. Precisamente eso es lo que vamos a hacer.

La función contará con dos argumentos: la masa y el nombre del planeta; siendo este último opcional, de tal forma que si se omite, tomará por defecto el peso en la Tierra. Por ejemplo, la fórmula =PESO(1200, “Mercurio”) retornaría el peso de una masa de 1.200 kg. en Mercurio, mientras que =PESO(1200) lo retornaría de la Tierra. En la definición de la función, bastará con anteponer la palabra reservada Optional al nombre del argumento e indicar que es de tipo Variant (obligatoriamente) para conseguir que sea opcional.

La función cuenta con cuatro partes bien diferenciadas:

1. Inicializar variables. Se define la variable gravedad y se inicia con el valor cero.

2. Averiguar si el parámetro opcional se ha introducido y actuar en consecuencia. La función IsMissing(nombreArgumento) devolverá verdadero si falta el argumento o falso en caso contrario. Observe que utilizamos la función UCase para pasar a mayúsculas el nombre del planeta y así no tener problemas en la comprobación del nombre (no es lo mismo “tierra” que “Tierra” o “TIErra”).

3. Seleccionar la gravedad en base al nombre del planeta. La función Select Case se encargará de ello.

4. Comprobar el valor de la gravedad. Si es cero indica que el nombre del planeta no corresponde con ninguno de los contemplados y devolveremos un mensaje de error. En caso contrario calcularemos el peso con la fórmula habitual.

Utilice el editor de Basic de su hoja de cálculo y teclee el código siguiente (observe que las líneas de comentarios comienzan con la comilla simple). Tras guardar los cambios y cerrar el editor ya podrá verificar si la función responde adecuadamente. Observe que el tipo de dato que devuelve la función es Variant, ya que puede retornar el peso (un número) o bien un mensaje de error (una cadena de texto).

Function PESO(masa As Double, Optional planeta As Variant) As Variant

‘1 – Inicializamos la variable gravedad

Dim gravedad As Double

gravedad = 0

‘2 - Verificamos si falta el parámetro planeta

‘si falta hacemos que el planeta sea Tierra

‘si no falta lo transformamos a mayúsculas

If IsMissing(planeta) Then

planeta = “TIERRA”

Else

planeta = UCase(planeta)

End If

‘3 - Asignamos el valor de la gravedad en función

‘del planeta

Select Case planeta

Case “TIERRA”

gravedad = 9.78

Case “MERCURIO”

gravedad = 2.78

Case “VENUS”

gravedad = 8.87

End Select

‘4 - Si la gravedad es cero quiere decir que el

‘nombre del planeta es incorrecto o no está

‘contemplado. La función devolverá error.

‘En caso contrario calculará el peso

If gravedad = 0 Then

PESO = “Error en el argumento Planeta”

Else

PESO = masa * gravedad

End If

End Function

Función personalizada con argumentos variables

En los dos trucos anteriores hemos visto cómo definir funciones con un número de argumentos determinado o con varios argumentos opcionales, pero ¿qué ocurre si el número de argumentos puede ser variable? Piense en l