Encontrar valores duplicados en fechas solapadas [Excel – Libreoffice]

Tenemos una planilla de cálculo con 3 columnas Fecha Inicio, Fecha Fin y Nombre.

Ejemplo:

Fecha Inicio |  Fecha Fin | Nombre

11/03/14          15/03/14       A

11/03/14         12/03/14       B

12/03/14          13/03/14       A

21/03/14          23/03/14       A

Nos interesa resaltar aquellos nombres que se repiten solamente si las fechas que corresponden a ese nombre se solapan entre si. En el ejemplo sería la 1er y 2da ocurrencia de A, pero no la última.

Podemos usar la fórmula:

SUMA.PRODUCTO(($C$2:$C$XX=$C2)*($A2<=$B$2:$B$XX)*($B2>=A$2:$A$XX))

Combinando con formato condicional podremos resaltar los valores repetidos.

En Excel debemos reemplazar la función por SUMAPRODUCTO.

Dejo un ejemplo para que puedan descargar y analizar.

FechasRepetidas.xls

 

 

Macros en OpenOffice o LibreOffice

El uso de macros en LibreOffice no resulta tan simple como en el paquete de Microsoft.

Una opción para los que no conocemos mucho de programación de macros (usando VBA o OpenOffice Basic) es grabar una macro, ejecutar los pasos para resolver el problema y modificar el código si fuera necesario.

Para grabar macros en OO, primero hay que habilitar la posibilidad de grabar macros desde el menú Herramientas ==> Opciones ==> Avanzado  y marcar la casilla “Activar la grabación de macros“. Así podemos iniciar la grabación desde Herramientas ==> Macros ==> Grabar Marco.

De todas formas debo decir que, al menos desde mi experiencia, la grabación de macros en OO no resulta tan optima en comparación con MS Office. Muchas cosas no pueden ser grabadas o bien el resultado de la grabación no produce el efecto deseado.

Como necesitaba arreglar unas planillas exportadas de SAP para el trabajo, donde tenemos LibreOffice, me dediqué a la búsqueda de un manual de referencia para OpenOffice Basic.

Buscando di con el manual que escribió Mauricio Baeza Servín, disponible en el repositorio del autor el cual me ayudó mucho en el proceso de construir las macros necesarias para el proceso. El manual resulta muy claro, bien estructurado y da varios ejemplos de usos prácticos y realistas.

Básicamente mi necesidad consistía en aplicar unos formatos, eliminar algunas filas y columnas, cortar y pegar algunos rangos de celdas, ordenar algunos datos y calcular unos subtotales.

También probé usar MS Office, pero comprobé que Excel es bastante “vidrioso” con el tema de tomar celdas con fechas en formato texto surgidas de otros sistemas, ordenarlas y filtrarlas (pueden quedar en cualquier orden).

A continuación les muestro el código de algunos ejemplos para lograr cosas más simples y rutinarias:

Cortar y pegar un rango de celdas:

' declaro las variables
Dim oHojaActiva as Object
Dim OrangoOrig as Object
Dim OrangoDest as Object
' hago referencia a la hoja activa
oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'creamos dos variables con los rangos de origen y destino
oRangoOrig = oHojaActiva.getCellRangeByName( "A8:E11" )
oRangoDest = oHojaActiva.getCellRangeByName( "C1" )
'movemos el rango de origen al destino
oHojaActiva.moveRange( oRangoDest.getCellAddress(), oRangoOrig.getRangeAddress() )

Eliminar Filas y Columnas:

Las filas y columnas se cuentan desde 0 y para removeByIndex se indica la celda donde se comienza a eliminar y a continuación la cantidad de celdas a eliminar

' eliminar la columna D
oHojaActiva.getColumns.removeByIndex( 3, 1 )
' eliminar las filas 5 a 7
oHojaActiva.getRows.removeByIndex( 4, 3 )

Buscar y reemplazar texto en un rango:

oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
'Creo un descriptor de los reemplazos
oRD = oHojaActiva.createReplaceDescriptor
' texto a buscar y reemplazar
oRD.setSearchString( "," )
'texto que reemplaza al buscado
oRD.setReplaceString( "" )
rango.replaceAll( oRD )

Formatos de celdas:

oHojaActiva = ThisComponent.getCurrentController.getActiveSheet()
oRango = oHojaActiva.getCellRangeByName( “A5:O5” )
oRango.HoriJustify = 2 ‘ centrado
oRango.CharWeight = 150 ‘ bold
oRango.getColumns.OptimalWidth = True
oRango = oHojaActiva.getCellRangeByName( “A5:A6” )
oRango.getColumns.Width = 2420 ‘ ancho de columna

Todos los formatos se rigen por constantes o valores numéricos, por lo que conviene consultar las tablas que figuran en el manual para lograr los resultados buscados.

Otras cosas son más específicas del trabajo que me tocó hacer, traté de poner los ejemplos más  generales.

Impresora Virtual en Linux

Problema:

Necesito poder imprimir a un PDF un archivo de LibreOffice Impress con varias diapositivas por hoja. La opción “Exportar a PDF” no me sirve para hacer esto, por lo tanto tengo que instalar una impresora virtual.

Solución:

Doy con este excelente artículo de Diversidad y un Poco de Todo que explica los pasos.

Desde la consola instalamos el paquete correspondiente

$ sudo apt-get install cups-pdf

Vamos al Menú -> Preferencias del Sistema -> Hardware -> Configuración de la Impresora

Hacemos click en el botón “Impresora Nueva“.

Seleccionamos “CUPS-PDF” y seguimos adelante.

En la base de datos de impresoras seleccionamos el tipo “Generic” (aparece primero).

En modelo y controlador seleccionamos “CUPS-PDF“.

Luego damos un nombre y una descripción a la impresora y listo.

Por defecto los archivos impresos se guardan en un directorio llamado PDF en el home del usuario (~/PDF).

En el post fuente se enseña a cambiar ese directorio por otro que sea de nuestra preferencia.

FUENTE: Diversidad y un Poco de Todo