jueves, abril 17, 2014

Correctores voluntarios para el modelo Factura con base de datos

Nuevamente recurro a mis lectores en búsqueda de editores/correctores voluntarios para probar mi nuevo modelo: Factura con base de datos.

Actualización 25/08/2014: post con el nuevo modelo


A diferencia del modelo que publiqué hace varios años atras, éste permite no sólo producir e imprimir facturas sino también guardar los datos en un base de datos. Esto nos permite producir copias de las facturas y también producir informes sobres nuestras ventas.

Para probar el funcionamiento y encontrar los inevitables bugs, enviaré una copia del modelo con un video explicatorio a los primeros 5 voluntarios que estén dispuestos a ayudarme en la tarea.

Para recibir el modelo con el video deben mandarme un mail privado (ver el enlace Ayuda, en la parte superior de la plantilla) o dejar un comentario con el mail (evitando poner el símbolo @, por ejemplo: "jose at mimail.com").

Los gentiles voluntarios serán recompensados con una copia gratuita del modelo, con todos los códigos abiertos (sin contraseñas).

Desde ya, muchas gracias


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.