LibreOffice Calc: casos prácticos (VIII)

 José Francisco Martínez Jiménez. 

  • Editar Columna

Funcionario jubilado.

Servicio de Gestión Contable
Intervención General de la Junta de Andalucía
Consejería de Hacienda y Financiación Europea

Caso práctico n.º 17: Controles de formulario (“botón” y “control de número”).

Nivel: Intermedio.

En esta práctica crearemos dos hojas: una contendrá los días de la semana (L: lunes … D: domingo) de todo el año seleccionado (Imagen 1); la otra cuándo comienza y termina cada uno de los trimestres del año que el usuario tendrá también que seleccionar (Imagen 2). Para elegir el año utilizaremos un “control de número” y para movernos entre las hojas un “botón” (todo ello sin entrar a programar ninguna macro).

Archivo del caso práctico 17

Un control es un elemento de la interfaz de usuario que muestra contenido o permite la interacción con la aplicación (Microsoft: Controles para aplicaciones de Windows).

Una macro es una serie de instrucciones que se guardan para que se puedan ejecutar de manera secuencial mediante una sola llamada u orden de ejecución. Esto permite la automatización de tareas repetitivas (Wikipedia: Macro). Las macros de LibreOffice se escriben en un lenguaje de programación, normalmente en BASIC (LibreOffice BASIC) o Python. En este mismo número de la revista vamos a ver dos casos prácticos de macros en LibreOffice BASIC.

Imagen 1: Hoja “DIA_SEM_ANUAL”

Paso 1: Hoja “DIA_SEM_ANUAL”

En el archivo descargable de esta práctica podéis observar las celdas con valores:

  • B4: El año (que podremos modificar con el control de número).

  • C4:AG4: Los días del mes (hasta el 31, aunque algunos meses tengan 30 o febrero que tiene 28 o 29 en el caso de año bisiesto).

  • B5:B16: Los meses en letra.

Hasta aquí ningún problema. Veamos la fórmula empleada para hallar el día de la semana (celda C5):

=ELEGIR(DIASEM(FECHA($B$4;FILA()-4;C$4));”D”;”L”;”M”;”X”;”J”;”V”;”S”)

  • FILA(): Devuelve el número de la fila de la celda que contiene la fórmula (Ayuda de Calc). En este caso, FILA() devuelve 5 que al restarle 4 nos da 1 (que “casualmente” es el mes de enero que se encuentra en la columna B de la misma fila).

  • FECHA (Año; Mes; Día): Devuelve una fecha tipo Día/Mes/Año (Ayuda de Calc). En este caso, si B4 es 2024 y como C4 es 1 entonces FECHA(2024; 1; 1) es el 1 de enero de 2024.

  • DIASEM(Fecha): Devuelve un número entre 1 – domingo y 7 – sábado (Ayuda de Calc). En este caso devuelve 2 que corresponde a lunes.

  • ELEGIR(Índice; Valor 1 [; Valor 2 [; … [; Valor 30]]]): Devolverá Valor 1, Valor 2, …, Valor 30 de acuerdo al Índice que debe ser un número del 1 al 30 como máximo (Ayuda de Calc). En este caso el Valor 2 es “L” (abreviatura de lunes).

Para el signo $ en la referencia de una celda hay que visitar Direcciones y referencias, absolutas y relativas en la Ayuda de Calc. Hay veces que, como LibreOffice también es un proyecto colaborativo, algunos párrafos de la Ayuda no figuran traducidos al español, así que si no nos defendemos bien con el inglés siempre nos quedará el traductor de Google

En cuanto al formato condicional, menú Formato > Condicional > Gestionar …, hay que hacer mención especial al de la celda “AE6” (Imagen 3).



Imagen 3: Formato condicional. Celda AE6

La fórmula:

NO(ESAÑOBISIESTO(FECHA($B$4;FILA()-4;1)))

comprueba si el año seleccionado no es bisiesto y, en caso afirmativo, el color de fondo y el color del texto coinciden con lo que conseguimos que el contenido de la celda no sea distinguible. Y si es bisiesto veremos el día de la semana correspondiente.

Paso 2: Hoja “TRIMESTRES”

La fórmula usada en la celda B8, que está combinada con la C8, es:

=”Del ” & TEXTO(FECHA($C$4;1;1);”DD/MM/AAAA”) & ” al ” & TEXTO(FECHA($C$4;3;31);”DD/MM/AAAA”)

  • FECHA (Año; Mes; Día): ya conocemos cómo funciona.

  • TEXTO(Valor; Formato). Convierte un Valor en texto según un Formato determinado (Ayuda de Calc). También, en la misma página de ayuda podemos pinchar en Códigos de formato numérico para conocer todos los códigos que se pueden utilizar en Formato. Como podéis imaginar el código de formato “DD/MM/AAAA” convierte una fecha de Calc en un texto (debemos tener presente que una fecha para Calc es un número decimal, ver el apartado Fecha/Hora del artículo LibreOffice Calc: Validación de Datos del número 7 de esta revista).

En la celda C10 tenemos la fórmula:

=NOMPROPIO(TEXTO(FECHA($C$4;1;1);”DDDD”)) & “, ” & TEXTO(FECHA($C$4;1;1);”DD/MM/AAAA”)

  • El formato “DDDD” de la función TEXTO devuelve el día se la semana en letra (lunes, martes, …).

  • NOMPROPIO(Texto). Convierte en mayúscula la letra inicial de todas las palabras de la cadena Texto (Ayuda de Calc).

  • En el resto de fórmulas modificaremos el día y el mes por el que corresponda para un resultado correcto.

Paso 3: Incluir los controles “botón” y “control de número”.

Lo vamos a hacer en la hoja “DIA_SEM_ANUAL”. Los mismos pasos valen para cualquier hoja.

(1) Control de número

Para trabajar más cómodo con los controles de formulario debemos visualizar la barra de herramientas de su mismo nombre (Imagen 4):

Imagen 4: Menú Ver > Barra de herramientas > Controles de formulario (detalle)

Y para activar los controles hay que pinchar primero en el icono “Modo de diseño” (Imagen 5).

Imagen 5: Barra de herramientas “Controles de formulario"

Y ahora pincharemos, por ejemplo, en el control de número para seleccionarlo y, llevando el ratón a la posición de la hoja que queramos, pulsaremos el botón izquierdo del ratón y arrastraremos hasta que tenga el tamaño que deseamos. Estando sobre él pulsaremos el botón derecho para seleccionar Propiedades del control … (Imagen 6).

Imagen 6: Propiedades del control ...

En la pestaña General modificaremos las propiedades necesarias (Imagen 7).

Imagen 7: Modificar las propiedades del control de número...

Y en la pestaña Datos enlazaremos el control con la celda adecuada (Imagen 8).

Imagen 8: Enlazar el control con la celda adecuada ...

(2) Botón

Para dibujar el botón actuaremos igualmente y en Propiedades del control … pestaña General modificaremos las propiedades necesarias (Imagen 9).

Imagen 9: Modificar las propiedades del botón...

Para finalizar y que los controles hagan su trabajo debemos desactivar el Modo de diseño pinchando sobre él (Imagen 10). Nos daremos cuenta de que está desactivado porque los controles se ven difuminados y no se pueden seleccionar.

Imagen 10: Barra de herramientas “Controles de formulario” con el “Modo de diseño” desactivado.

LY para finalizar este caso práctico os animo a hacer pruebas con el resto de controles, contando siempre con la necesaria Ayuda de Calc, en este caso Controles de formulario.

Caso práctico n.º 18: Macro LibreOffice BASIC (I). UDF: Generar contraseñas.

Nivel: Avanzado.

Archivo caso práctico 18

En este caso práctico nos adentraremos en el mágico mundo de las macros. Ya he comentado, grosso modo, al principio de este artículo, lo que es una macro, pero una UDF ¿qué es? Una función definida por el usuario (en inglés User-Defined Function: Wikipedia) es una función creada por el usuario de una aplicación informática para personalizar, en la medida de lo posible, unas determinadas operaciones o resultados, ya que, ninguna de las funciones que de forma predeterminada vienen con la aplicación se ajusta a las necesidades surgidas en un momento dado.

Antes de comenzar con la descripción de la función propiamente dicha he de comentar que:

  1. No soy ingeniero de software ni programador profesional, así que, si alguna denominación o explicación no se ajusta exactamente al modelo académico, he de apelar a vuestra indulgencia.

  2. La lectura de un artículo de cualquier revista, obviamente, no enseña a programar. Hay que leer mucho, estudiar y practicar mucho más. Para aprender el lenguaje LibreOffice BASIC es muy conveniente visitar:

    • La Ayuda de LibreOffice BASIC (imprescindible).

    • Las Guías de Macros en la documentación en español de LibreOffice:

      • Tarjetas de referencia BASIC. Tarjetas de referencia de J. F. Nifenecker para un acceso rápido a la programación de LibreOffice BASIC (más imprescindible).

      • Aprendiendo OOo BASIC de Mauricio Baeza Servín (mucho más imprescindible). Aunque originalmente se escribió el libro con OpenOffice.org en mente, casi todos los conceptos y ejemplos son útiles para LibreOffice.

      • Guía de Macros de Andrew Pitonyak (imprescindible no, lo siguiente). LibreOffice y OpenOffice.org comparten casi el mismo lenguaje para macros BASIC y la API (Application Programming Interface, interfaz de programación de aplicaciones). Este libro está escrito en inglés. Hay que visitar el sitio web de Andrew Pitonyak para obtener la última versión de este libro en formato PDF y ODT.

    • La Guía del desarrollador de LibreOffice: Capítulo 11 – LibreOffice Basic. Por ahora también en inglés.

Mi consejo es que empecéis primero a leer (releer y volver a leer) el libro de Mauricio Baeza y, según vayáis avanzando en vuestros conocimientos, consultar los demás enlaces.

Cuando se trabaja con macros hay que “avisar” a LibreOffice de la seguridad que queremos tener respecto de esas macros, a través del menú Herramientas > Opciones > Seguridad (Imagen 11). Normalmente se elige un nivel medio porque así tenemos libertad de decidir qué macro se ejecuta o qué macro no (Imagen 12).

Imagen 11: Menú Herramientas > Opciones > Seguridad > Seguridad de macros...

Cuando abrimos un archivo que contiene macros nos aparece una ventana (Imagen 12) preguntando si queremos activar o no las macros. Obviamente, si desactivamos las macros no podremos hacer uso de ellas. Sólo debemos activar las macros de fuentes fiables.

Imagen 12: Activar macros

¿Cómo podemos ver el código fuente de las macros en lenguaje BASIC? Seleccionando el menú Herramientas > Macros > Organizar macros > BASIC…. (Imágenes 13 y 14).

Imagen 13: Para ver el código fuente de las macros en BASIC: Paso s
Imagen 14: Seleccionamos archivo, módulo y editamos … (por este orden): Paso 2I

Doy por supuesto que ya estáis familiarizados con el IDE (Integrated Development Environment, Entorno Integrado de Desarrollo) de LibreOffice BASIC (Imagen 15). En caso contrario tendréis que volver sobre el punto 2 anterior y visitar los enlaces propuestos.

Imagen 15: Entorno Integrado de Desarrollo (IDE, en inglés) de LibreOffice BASIC

Una UDF se utiliza en Calc como cualquier otra función incluida de forma predeterminada en la aplicación, por ejemplo, en la celda C4 del archivo descargable figura:

=GENERARCONTRASENA($C$3;VALOR(IZQUIERDA(B4;1)))

GENERARCONTRASENA es el nombre de la función que hemos creado. Recibe dos argumentos de entrada, ambos de tipo entero (integer). El primero num_caracteres_contrasena es el número de caracteres (letras, números, …) que figura en la celda C3, referenciada de forma absoluta, para que al copiar y pegar siga haciendo referencia a esa celda, y el segundo argumento tipo_contrasena es un número del 0 al 9 que nos indicará qué clase de caracteres formarán parte de la contraseña final (letras minúsculas, mayúsculas, números, vocales acentuadas, …). Si nos fijamos, ese número es el primer carácter del texto introducido en las celdas B4:B13, por eso se usa la fórmula VALOR(IZQUIERDA(B4;1)) como segundo argumento de la función (Imagen 16).

Imagen 16: Pantalla principal del archivo descargable de este caso práctico

Como podréis suponer, en un artículo de una revista, no se puede explicar ni desarrollar toda la sintaxis, biblioteca de funciones, herramientas para el control de flujo, estructuras de datos, etc, de un lenguaje de programación. Hay muchos libros donde poder consultar. Y, cómo no, Internet.

En las imágenes siguientes (18, 19 y 20) podéis observar que utilizo como editor de código la aplicación de software libre Notepad++ porque me resulta más cómodo que el IDE de LibreOffice. Después de “picar” el código lo copio y pego en el IDE para poder ejecutarlo y depurarlo (debugging) usando las herramientas que nos proporciona el propio IDE. Para trabajar con cualquier archivo de texto plano (TXT, CSV, …) también utilizo Notepad++ por su versatilidad, facilidad de uso y la cantidad de herramientas de que dispone, incluyendo el uso de expresiones regulares. Pero, como dice el refranero, para gustos los colores.

Las líneas de color verde son comentarios que el intérprete de LibreOffice BASIC no tiene en cuenta. Las palabras de color azul son palabras reservadas del lenguaje (una constante, variable u objeto no puede llamarse igual que una palabra reservada). Los números y las cadenas de texto aparecen con otros colores. Todos los colores son personalizables, tanto en Notepad++ como en el IDE (Imagen 17).

Imagen 17: LibreOffice menú Herramientas > Opciones … > Colores de la aplicación
Imagen 18: Comentarios iniciales y declaración de constantes y variables globales

Para la creación de la contraseña siempre debemos tener en cuenta las indicaciones del sistema o del servicio al que queramos acceder: algunos no admiten la “ñÑ”, tampoco las vocales con tilde ni algunos caracteres no alfanuméricos (letras y números). En este caso hay que modificar las constantes necesarias (Imagen 18).

Imagen 19: Función GenerarContrasena( ): no es recomendable el uso de la ñ y/o vocales acentuadas para nombrar bibliotecas, módulos, constantes, variables, funciones o procedimientos
Imagen 20: Subrutina RecalcularTodo( )

Para asignar la macro RecalcularTodo (Imagen 20) al botón “Nuevas contraseñas” actuaremos como en el punto 2 del paso 3 del caso práctico 17 que hemos visto en este mismo número de la revista. La diferencia está en que pincharemos en la pestaña “Eventos: Ejecutar una acción” y seguiremos los pasos siguientes (Imagen 21).

Imagen 21: Asignar una macro a un botón

No es necesario que os comente que hagáis prácticas con el código y lo mejoréis, por ejemplo, se le puede indicar que un mismo carácter no aparezca tres o más veces en una contraseña, que dos caracteres iguales no sean consecutivos, … El límite es la imaginación de cada uno. ¡Buena programación!

Caso práctico n.º 19: Macro LibreOffice BASIC (II). UDF: Centro Gestor y Posición Presupuestaria (GIRO).

Nivel: Avanzado.

Archivo caso práctico 19

En este caso vamos a crear dos funciones personalizadas para extraer las partes que componen el Centro Gestor y la Posición Presupuestaria en GIRO (Gestión Integrada de Recursos Organizativos, sistema de información económico-financiero de la Junta de Andalucía):

  1. GiroSeccionSvCentro(centro_gestor): el Centro Gestor es un código de diez dígitos formado por la sección presupuestaria (cuatro dígitos, dos para la sección y dos para la agencia), el servicio (dos dígitos) y el centro de gastos (cuatro dígitos). Ejemplo: 1031010000.

  2. GiroPosPresup(pos_presup): la Posición Presupuestaria está formada por el tipo de posición (letra G para gastos, letra I para ingresos), la clasificación funcional (dos dígitos y una letra -solo gastos-), la clasificación económica (clasificación económica/5, capítulo/1, artículo/2, concepto/3 y subconcepto/2) y la provincia (dos dígitos). Ejemplos: G/23A/23412/41 – I/23412/04.

El resultado final está reflejado en la Imagen 22 (las celdas C2:N11 tienen aplicado un formato condicional que si la celda es “Err” entonces el fondo es de color rojo).

Imagen 22: Resultado aplicando las funciones personalizadas … (datos inventados)

Hay que tener muy en cuenta que cada una de estas funciones devuelve más de un resultado y, por tal motivo, debemos introducirlas pulsando a la vez <Ctrl>+<Mayús>+<Intro> y no solo <Intro>. Las funciones que se comportan así reciben el nombre de funciones matriciales. Por eso el tipo devuelto por la función está definido como “Variant” (Imágenes 23 y 24).

Podréis decir, con toda la razón del mundo, que esa información se puede extraer usando funciones predeterminadas, por ejemplo, la columna C “SECC OA”:

=SI(ESNUMERO(A2);SI(LARGO(A2)=10;TEXTO(IZQUIERDA(A2;4);”0000″);SI(LARGO(A2)=9;
TEXTO(IZQUIERDA(A2;3);”0000″);”Err”));”Err”)

Pero, entonces, no aprenderíamos nuevas posibles soluciones para nuevas situaciones.

Imagen 23: Función GiroSeccionSvCentro(centro_gestor)

El operador “Like” se parece a las expresiones regulares que vimos en el “Caso práctico n.º 16: Función EXP.REG( )” del número 16 de esta revista, pero con algunas diferencias y no es tan potente. El formato es cadena Like patrón:

Caracteres en el patrón

Coincide en la cadena …

?

Con un único carácter cualquiera.

*

Con cero o más caracteres.

#

Con cualquier dígito único del 0 al 9.

[listacaracteres]

Con cualquier carácter único en listacaracteres. Se puede usar un rango, por ejemplo, [A-Z] (cualquier letra de la A a la Z del alfabeto inglés, si queremos que incluya la Ñ tenemos que escribir [A-ZÑ]).

[!listacaracteres]

Cualquier carácter único que no se encuentra en listacaracteres.

Fuente: Microsoft (Atención: no todo lo que se explica en esta página de Microsoft funciona en LibreOffice)

Imagen 24: Función GiroPosPresup(pos_presup)

Ahora mismo todas estas macros (funciones) están en su archivo Calc correspondiente (Imagen 25) y sólo pueden ser llamadas desde ese archivo abierto, entonces, ¿cómo podemos tenerlas accesibles desde cualquier archivo? Pues bien, habría que copiarlas y pegarlas en un módulo de la biblioteca “Standard” de “Mis macros y diálogos” (si no existiera ningún módulo tendríamos que crear uno).

Imagen 25: Copiar y pegar en Mis macros ...

Haced prácticas con el código y ajustarlos a vuestras necesidades. Vuelvo a repetir, el límite es la imaginación de cada uno. ¡Buena programación!



Este artículo se ha escrito utilizando LibreOffice Community Writer, Calc e Impress versión 7.5.9 (x86_64 Windows 10) para entornos corporativos.

Saludos cordiales.

Si te ha gustado este artículo, encontrarás más contenidos interesantes en nuestra sección “Tecnología práctica”.

Y no dejes de ver qué tenemos publicado en los distintos números de EnRed@2.0.