miércoles, abril 16, 2014

La función SIFECHA (DATEDIF) con varios períodos

Ya hemos hablado en el pasado sobre la función SIFECHA (DATEDIF en inglés) y sus bondades. A pesar de su utilidad esta función sólo está documentada en la versión 2000 de Excel. Por algún motivo Microsoft decidió "pasarla a la clandestinidad", aunque está disponible en todas las versiones posteriores de Excel.
Un lector me consultaba sobre cómo usarla para calcular la antigüedad de un empleado que se ha reincorporado a la empresa en varias oportunidades.

Veamos este ejemplo

Las columnas B y C muestran la fecha de comienzo y final de cada período; las columnas D, E y F contienen estas fórmulas:
  • =SIFECHA(B2,C2,"y"), para calcular los años
  • =SIFECHA(B2,C2,"ym"), para calcular el resto de los meses
  • =SIFECHA(B2,C2,"md"), par calcular el resto de los días.

Nótese que el argumento "y" indica que se calculan los años, pero dependiendo de las definiciones regionales del sistema, debe usarse "a" en su lugar.

La tabla muestra que nuestro empleado ha trabajado al presente 10 años, 21 meses y 55 días. Por suspuesto, la forma de presentar este cálculo debe ser 11 años, 10 meses y 25 días. Podemos corregir la fila 5 manualmente ("pasamos" 12 meses a los años quedando 11 años y 9 meses; pasamos 30 días a los meses quedando 10 meses y 25 días), pero más práctico es usar SIFECHA de la siguiente manera:

Las fórmulas con SIFECHA aquí son:

  • =SIFECHA(B2+B3+B4,C2+C3+C4,"y")
  • =SIFECHA(B2+B3+B4,C2+C3+C4,"ym")
  • =SIFECHA(B2+B3+B4,C2+C3+C4,"md")

Dado que Excel maneja las fechas como números enteros de una serie, podemos sumar las fechas de comienzo como "fecha inicial" y de la misma manera sumar las fechas de finalización como argumentos de la función.

Si necesitamos expresar el resultado en un único número, a los efectos de realizar algún cálculo, podemos usar esta fórmula que dará una buena aproximación:

La parte decimal del resultado expresa los meses y días por encima de los 11 años. Podemos interpretar este número de la siguiente manera:


donde las fórmulas utilizadas son





sábado, abril 12, 2014

Copiar filas de una tabla filtrada en Excel con Vba (macros)

Numerador automático para facturas es una de las páginas más populares de este blog. Una de las consultas más frecuentes es cómo hacer para guardar copias de las facturas, así que, después de varios años (la nota es del 2008), decidí rehacer el modelo que incluye, además de corregir varios bugs, la posibilidad de manejar los datos de las facturas en una base de datos.
Toda esta introducción viene a cuento de que una de las rutinas que tuve que desarrollar para el nuevo modelo, que estaré publicando en breve, se basa en filtrar las filas de la base de datos y copiarlas a otra hoja (lo hoja que contiene la copia de la factura).
En esta nota mostraré dos métodos eficientes para hacerlo. Como ejemplo utilizaremos los datos de ventas de la base de datos Northwind

Ventas Northwind

Dado que los métodos de Excel, como Autofiltro, suelen ser más eficientes que el código que podamos escribir, podemos grabar las acciones y luego mejorar el código reemplazando, por ejemplo, las referencias a rangos por variables.
Supongamos que queremos copiar a otra hoja todas las ventas a la Argentina. Después de aplicar Autofiltro, grabamos las acciones para el copiado obteniendo este código

Sub Macro1()

'
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Sheets("Hoja2").Select
    ActiveSheet.Paste
End Sub


Hacemos dos mejoras a este código


  • usamos la propiedad CurrentRegion de Range en lugar de Selection.End(xlToRight) y Selection.End(xlDown),
  • eliminamos los Select abreviando el código


Sub Macro2()
'
    Selection.CurrentRegion.Copy
    Sheets("Hoja2").Paste
 
End Sub


Pero existe una posibildad más sencillla usando AutoFilter.Range

Sub Macro3()

    ActiveSheet.AutoFilter.Range.Copy
    Sheets("Hoja2").Paste

End Sub


La ventaja de usar AutoFilter.Range es que funciona aún si la celda activa no pertenece a la tabla filtrada.



martes, abril 08, 2014

El error "demasiados formatos de celdas" en Excel

Todo quien haya trabajado suficiente tiempo con Excel se ha topado en alguna oportunidad con el error "demasiados formatos de celda diferentes" (too many different cell formats)

o, en Excel 2003, con

Excel ha encontrado un error y se tuvieron que quitar parte del formato para evitar dañar el libro

o, en Excel 2007-2013, con

Excel encontró contenido no legible en el archivo 
 Otros síntomas ligados a este error pueden ser:


  • al abrir un archivo se elimina todo el formato;
  • incremento en el tamaño del archivo después de copiar-pegar entre libros
  • imposibilidad de pegar lo que se ha copiado al portapapeles (aparece el mensaje "Microsoft Excel no puede pegar datos")

De acuerdo a la base de datos de conocimientos de Microsoft:

Este problema se produce cuando el libro contiene más de aproximadamente 4.000 combinaciones diferentes de formatos de celda en Excel 2003 o 64.000 en Excel 2007 y posteriores. Una combinación se define como un conjunto de elementos que se aplican a una celda de formato único. Una combinación incluye todo el formato de fuente (por ejemplo: tipo de letra, tamaño de fuente, cursiva, negrita y subrayado), bordes (por ejemplo: ubicación, grosor y color), los patrones de celdas, formato, alineación y protección de celda de número.

Hay todo tipo de medidas que pueden y deben tomarse para evitar este problema. Pero si nos topamos con él, la mejor herramienta es XLStylesTool. Esta herramienta, que se puede descargar en forma gratuita,  fue desarrollada por Sergei Gundorov, quien se merece todo nuestro agradecimiento.