Automatizar tareas con macros y filtros avanzados en OpenOffice Calc- Ejemplo paso a paso

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Los filtros avanzados de OpenOffice Calc nos muestran la gran potencia y flexibilidad de esta herramienta, permitiendo filtrar fácilmente un gran número de datos aplicando varios criterios o condiciones de filtro.

Las macros nos permiten automatizar tareas que hemos de repetir muchas veces incluso a diario, de forma que con unos pocos clics se realicen múltiples pasos y tareas que de otra forma requieren mucho tiempo y atención.

Combinar ambas herramientas definen la verdadera potencia de esta hoja de cálculo. Veamos un ejemplo, paso a paso, en el que vamos a explotar no una, sino varias de las herramientas de que Calc dispone para facilitarnos las tareas diarias.

De donde partimos y a donde queremos llegar

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Partimos de una típica tabla con varias columnas y cientos o miles de filas, guardada en un documento Calc llamado Filtros.ods.

Deseamos establecer un filtro avanzado para, con facilidad, poder definir varias condiciones según una o más columnas, condiciones que son frecuentemente variables.

Los resultados filtrados deseamos que se muestren en otra hoja.

Por pedir que no quede. Queremos que todo esto se realice apretando un botón.

¿Es posible?

La respuesta es un sí rotundo.

 

Preparar la hoja para las condiciones del filtro avanzado

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Insertaremos cuatro filas justo por encima de los datos a filtrar. Estas cuatro filas nos permitirán definir hasta 3 condiciones de tipo O. Si llegado el caso fuera necesario, podemos ampliar el número de filas para fijar más condiciones.

En las celdas A1 y B1 copiaremos los encabezados de la tabla de datos (celda A5 y B5), definiendo de esta forma las dos columnas para las que estableceremos criterios de filtro Y.

Aplicaremos un color de fondo adecuado a las celdas del rango A2:B4, no porque sea necesario, sino simplemente, para identificar fácilmente el área donde podemos especificar condiciones para nuestro filtro.

Definir el área de la base de datos

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Para comodidad a la hora de programar las macros vamos a definir como base de datos el área de los datos. Tan sólo tendremos que hacer clic sobre cualquier celda del área de datos a filtrar (por ejemplo en B9), y seleccionar la opción Datos > Definir área.

En Nombre tecleamos la palabra Datos, y en Área se mostrará el rango de celdas que conforman los datos, en nuestro caso $Hoja1.$A$5:$E:29. Para asegurarnos de que se tengan en cuenta futuros datos, ampliaremos manualmente el rango de celdas hasta $Hoja1.$A$5:$E:5006, sencillamente sustituyendo el número 29 por 5006. Nos aseguramos así 5000 filas de datos.

Haz clic en el botón Añadir, y luego, en el botón Aceptar.

Definir el rango con nombre Condiciones

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

También por comodidad a la hora de escribir las macros definiremos como Rango de celdas con nombre el rango de celdas que conforman las condiciones del filtro.

Seleccionamos las celdas A1:B4, y seleccionamos desde el menú Insertar > Nombres > Definir....

En Nombre tecleamos la palabra Condiciones, mientras que en Asignado a se mostrará el rango seleccionado.

Haremos clic en el botón Añadir y luego en el botón Aceptar.

 

Definir el rango con nombre Resultados

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Al igual que en el caso anterior, vamos a definir también un rango con nombre para las celdas que albergarán los resultados filtrados.

Seleccionamos desde el menú Insertar > Nombres > Definir....

En Nombre tecleamos la palabra Resultados, mientras que en Asignado a tecleamos $Hoja2.$B$2:$F$5003. Con esto nos aseguramos un área de resultados con capacidad para 5000 filas.

Haremos clic en el botón Añadir y luego en el botón Aceptar.

 

Insertar una imagen que utilizaremos como botón para lanzar la macro

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

Bien desde el menú Insertar > Imagen > A partir de archivo... o desde la Galería de OpenOffice, insertamos una imagen en la hoja de datos.

Si no tienes a mano ninguna, puedes dibujar cualquier forma desde la barra de herramientas Dibujo.

 

Escribir el código de las macros

Selecciona desde el menú Herramientas > Macros  > Organizar macros > OpenOffice.org Basic...

En el diálogo mostrado localiza y haz clic sobre el nombre de nuestro documento (en nuestro caso Filtros.ods).

Haz clic sobre el botón Nuevo, y en el diálogo mostrado, haz clic sobre el botón Aceptar.

Se presentará el IDE Basic (el editor de macros en lenguaje OOo Basic).

Elimina las entradas Sub Main y End Sub mostradas, si bien no es imprescindible.

Teclea, o mejor, copia el código mostrado a continuación y pégalo en el editor Basic (con el botón Pegar o con la combinación de teclas Ctrl+V).

Sub Aplicar_Filtros
Dim oDatos as object, oCondiciones as object, oResultados as object
with ThisComponent
' Definir las áreas de datos, condiciones y resultados
oDatos = .DatabaseRanges.getByName("Datos")
oCondiciones = .NamedRanges.getByName("Condiciones").getReferredCells
oResultados = .NamedRanges.getByName("Resultados" ).getReferredCells

' Vacíar el rango de celdas destino
oResultados.clearContents(1023)

' Aplicar el filtro avanzado
AplicaFiltroAvanzado oDatos, oCondiciones, oResultados

' Mostrar el resultado
.CurrentController.ActiveSheet = .Sheets.getByIndex( _
oResultados.RangeAddress.Sheet())

' Activar la primera celda del resultado
.CurrentController.Select(.CurrentController.ActiveSheet.getCellbyPosition( _
oResultados.RangeAddress.StartColumn,oResultados.RangeAddress.StartRow+6)
end with
End sub

Sub AplicaFiltroAvanzado(oDatos as object, _
optional oCondiciones as object, _
optional oResultados as object)
Dim oFiltroActual as object, oFiltroNuevo as object
Dim bCopiarDatos as Boolean, bUsarCondiciones as Boolean
' actual definición del filtro, por si no hay nuevas condiciones
oFiltroActual = oDatos.getFilterDescriptor

' hay que copiar los datos a algun otro sitio?
bCopiarDatos = not isMissing(oResultados)

' hay que usar condiciones?
bUsarCondiciones = not isMissing(oCondiciones)

' si hay que usar condiciones cargamos en oFiltroActual las nuevas condiciones
if bUsarCondiciones then
oDatos.FilterCriteriaSource = oCondiciones.getRangeAddress
oFiltroNuevo = oCondiciones.createFilterDescriptorByObject( _
oDatos.getReferredCells)
oFiltroActual.setFilterFields(oFiltroNuevo.getFilterFields)
endif

' Aplicamos el filtro
oDatos.useFilterCriteriaSource = bUsarCondiciones
oFiltroActual.CopyOutputData = bCopiarDatos

' Si hay que copiar a otro rango
if bCopiarDatos then
oFiltroActual.OutputPosition = oResultados
endif

' Refrescar los datos
oDatos.refresh()
End Sub

Una vez insertado el código, cerramos el editor de Basic. El código macro está suficientemente comentado como para comprender qué pasos se siguen y qué hace cada grupo de instrucciones. Otra cosa es saber escribir estas macros, pero eso es harina de otro costal.

La macro que desencadena todo el proceso es la llamada Aplicar_Filtros, y es la que tendremos que asignar a la imagen que vamos a utilizar como botón.

 

Asignar la macro a la imagen

De nuevo desde la Hoja 1 de nuestro documento, hacemos clic con el botón secundario sobre la imagen insertada.

Selecciona la opción Asignar Macros.

En la lista Acontecimiento selecciona Botón del ratón presionado.

En la lista Macros, localiza la entrada con el nombre del documento (en nuestro caso Filtros.ods) y haz clic en los signos + hasta que puedas seleccionar Module1.

En la lista Macros existentes, selecciona Aplicar_Filtros.

 

Haz clic sobre el botón Asignar, y luego, sobre el botón Aceptar.

 

Un último refinamiento

Automatizar tareas con macros y filtros avanzados en OpenOffice Calc

¿Por qué no, en lugar de escribir las condiciones del filtro las seleccionamos desde un desplegable?

Podemos hacerlo fácilmente utilizando Validación de celdas.

 

Selecciona la celda A2 y activa desde el menú Datos > Validez....

En el diálogo mostrado completa las propiedades tal y como ves en la imagen justo debajo de estas líneas.


Repite el proceso para la celda B2, pero en este caso, el origen será $Hoja1.B$6:B5006.

Selecciona la celda A2 y con la herramienta Pincel de formato copia el formato de celda a las celdas A3 y A4.

Repite el proceso copiando el formato de la celda B2 a las celdas B3 y B4

Ahora dispones de un cómodo desplegable para seleccionar las opciones de filtrado.

 

Probar que todo funciona correctamente

Si has seguido todos los pasos al pié de la letra, y no se ha cometido ningún error al teclear las macros, cosa muy normal y habitual, todo deberá funcionar perfectamente.

Selecciona en A2 Valencia, y en B2 Queso. Haz clic sobre la imagen-botón.

Calc copiará las celdas filtradas en la Hoja 2 y mostrará el resultado.

En el peor de los casos siempre puedes descargar el documento Filtros.ods de Calc con el que hemos realizado este minitutorial.

Si te ha gustado, puedes dejar un comentario en nuestro Libro de Firmas.

Recuerda que puedes encontrarnos y seguirnos en FaceBook y en Twitter.

 

 

 

 

3 comentarios

Comentario De: fred [Visitante]

Muy interesante y trabajado esta macro.Gracias

10.01.15 @ 10:18
Comentario De: Jammoyano [Visitante]

Muy interesante y práctico.
Sin embargo estoy intentando adaptarlo a mis necesidades y me encuentro con el problema de la traducción de los campos ... no los reconoce.
Por ejemplo "get.filterdescription" o "copyOutputData" ....

Gracias de antemano!!!

17.02.15 @ 10:52
Comentario De: César [Visitante]  

Excelente, pero he descargado la hoja de cálculo y al hacer click en la imagen se va a la hoja2 pero no aparece ningún resultado, ¿tengo que habilitar antes las macros, como lo hago?

Saludos.

01.09.15 @ 17:32


Form is loading...