miércoles, 6 de diciembre de 2023

Procedimientos. Datos.

Calc. Función. Script como función

Hemos visto en entradas que preceden a la actual, diferentes aspectos de la configuración de la condicionalidad/opcionalidad/iteración y hemos opuesto el uso de funciones Calc (SI(), por ejemplo) al uso de script OOo Basic. Pero bajo determinadas condiciones, Calc asume como funciones propias los script creados con OOo Basic.


En esta entrada vamos a profundizar en esta posibilidad, en sus condicionantes y también en sus limitaciones.

Ya sabemos que accedemos a las funciones Calc bien desde la línea de entrada (de funciones), bien desde el icono que nos da acceso al Asistente para funciones. También sabemos que para acceder a un script debemos hacerlo desde el menú Herramientas/Macros/Ejecutar macro, o bien desde un botón de comando creado en la hoja como elemento de formulario y asociado previamente a la macro en cuestión.

Estos conocimientos nos van a seguir siendo útiles y lo que añado en esta entrada es una forma alternativa y de utilidad ciertamente limitada, pero de interés: acceder a ciertos script desde la línea de entrada de funciones Calc.

Estos script pueden presentarse identificados como subrutinas (Sub...End Sub) y van a funcionar (inicialmente al menos) de forma correcta, pero no recomiendo formularlos de ese modo, ya que pueden presentar un comportamiento un tanto errático. Estas subrutinas pueden serlo en efecto, pero también pueden presentar una formulación mixta entre el esperado en una subrutina y el propio de una función(1)

También, sean identificados como subrutinas o como funciones, pueden contener variables internas personalizables (esto es: que necesiten una entrada de datos desde, por ejemplo, InputBox()), pero personalmente tampoco recomiendo este tipo de construcción mientras LibreOffice-Calc no mejore su comportamiento al usarlas: se pueden generar insistentes demandas de entrada de datos (¿bucles?) que no vienen a cuento.

Ahora bien, existe un tipo de estructura que funciona perfectamente y sin que se observen inconvenientes, pudiendo ser empleadas desde rutinas que contienen su llamada (2) como desde la línea de entrada de funciones de Calc, y del mismo modo que se llama a una función propia de Calc (como la función condicional SI(), por ejemplo). Me estoy refiriendo a las funciones creadas con OOo Basic.

Recordemos que para escribir correctamente una función debemos seguir los siguientes pasos:
  1. Nombrarla siguiendo esta sintaxis: Function NombreFuncion(Var1 As Tipo[...]) As Tipo
  2. Declarar, si existen, variables propias o privadas de la función y darles los valores que corresponda.
  3. Formular la operación que incluye la(s) variable(s) indicadas entre el paréntesis de la función (parámetros). Aquí entra también el uso de las estructuras condicionales o cíclicas, simples o complejas, que sean necesarias.
  4. Asignar al nombre de la función la salida o resultado de la(s) operación(es) anteriores. Debe corresponder en tipología a lo indicado en la denominación de la función: NombreFuncion=Operación/VariableQueContieneElResultado 
  5. Y cierre de la función: End Function 
Un ejemplo muy sencillo:

Function multiplicados(Num As Integer) As Integer
Dim Multi As Integer, Resulta As Integer
Multi = 5
Resulta = Num * Multi
multiplicados = Resulta
End Function

La forma de llamar a estas funciones es la misma que a cualquier otra función Calc (desde Línea de entrada) o a cómo las llamamos desde un script:

 NombreFuncion(Valores/VariablesDeParametros) -> multiplicados(12)

Si lo hacemos (y de eso se trata ahora) desde Línea de entrada (de funciones) en Calc, obtendremos el resultado en la celda desde la que la llamamos...



... pero al contrario de lo que pasa con las funciones propias de Calc, nuestras funciones no se encuentran en los listados del Asistente para funciones, sino en la pestaña Estructura...

... desde donde también podremos llamar a la función (ventana Fórmula, tras el signo =), aunque posiblemente con algún mensaje de error que no se corresponde con tal, por lo que se puede eludir sin más complicación, pero que hace que esta forma de llamar a la función no sea mi preferida (3)

Estas nuestras funciones son accesibles desde Calc estando ubicadas en la misma hoja de cálculo (obviamente en una Biblioteca/Librería y en un Módulo) o en Mis macros y diálogos. En el primer caso estará disponible para la hoja que la contiene y en el segundo para cualquier hoja de cálculo en que deseemos usarla. Obviamente, salvo circunstancias especiales, es la segunda opción la más rendimiento nos va a proporcionar. 

NOTAS

(1) Recuerda que en OOo Basic se diferencia entre subrutina y función, incluso en  la forma de identificar cada una de ellas: Sub Nombre().... End Sub (subrutina) frente a Function Nombre()... End Function (función)
(2) Y por tanto activadas desde botones de comando o directamente desde Ejecutar macro.
(3) Llamar a la función desde Línea de entrada resulta ser más directo y más seguro, por lo que recomiendo utilizar esta opción. 

No hay comentarios:

Publicar un comentario

Comenta esta entrada