jueves, enero 17, 2008

Numerador automático para facturas o recibos en Excel

Con Excel es fácil crear plantillas para facturas o recibos. Más aún, se pueden descargar gratuitamente de varios sitios. La plantilla del ejemplo que usaré en esta nota fue descargada del sitio de Microsoft.



Actualización 25/08/2014: nuevo modelo mejorado

Una de las consultas que recibo frecuentemente, es cómo crear un numerador automático para facturas o recibos en hojas de Excel. Si observan la plantilla de la factura, verán que la celda C5 contiene el número de factura.


numerador de facturas

Lo que queremos hacer es que este número se actualice cada vez que emitimos una factura, de manera que la siguiente tenga el número consecutivo (el archivo con el ejemplo se puede descargar aquí aunque recomiendo el nuevo modelo que incluye base de datos de las facturas producidas).

Esto se puede hacer de varias maneras, pero todas implican usar macros.

Una solución sencilla es agregar un botón al que le asociamos una macro. El botón lo creamos copiándolo de la barra de formularios.

numerador de facturas

Pulsamos el botón Nuevo, lo que abre un módulo de Vba con el evento Sub Botón3_AlHacerClic(). Aquí escribimos este código

[C5] = [C5] + 1

numerador de facturas

Ahora, cuando apretamos el botón el valor en la celda C5 se incrementará en 1.

Esta técnica es muy sencilla, pero no ofrece ninguna ventaja frente al sencillo método de cambiar el valor en la celda manualmente. Además, si nos olvidamos de presionar el botón, la próxima factura saldrá con el mismo número.

Una forma de lograr algún tipo de control es ligar el botón a la acción de sumar los importes de la factura. Es decir, hasta que no apretemos el botón no aparecerá la suma total de la factura en la celda correspondiente (la celda C35 en nuestra plantilla).

Empezamos por eliminar la fórmula en la celda C35. Teniendo en cuenta que el rango de los montos de las líneas de la factura es C18:C34, modificamos nuestro código, para que sume los valores de las celdas del rango y luego cambie el número de factura

Sub Botón3_AlHacerClic()
[C35] = WorksheetFunction.Sum(Range("C18:C34"))
[C5] = [C5] + 1
End Sub

numerador de facturas

Otra alternativa es que el número de factura cambie automáticamente en las circunstancias debidas, por ejemplo antes de imprimirla.

Para esto debemos usar un tipo de macro especiales llamadas "eventos".
Eventos son macros que actúan cuando, como su nombre lo sugiere, algo sucede en la hoja, o el objeto, al cual están ligadas. Los eventos serán tema de una futura nota, como vengo prometiendo. En esta nota nos limitaremos a un ejemplo práctico.

Para saber qué eventos existen ligados al objeto, en nuestro caso el cuaderno que contiene la hoja con la factura, pasamos al editor de Vba y hacemos doble clic al icono ThisWorkbook,

numerador de facturas

Abrimos la lista desplegable de la ventanilla donde aparece General y elegimos Workbook

numerador de facturas

Abrimos la ventanilla contigua para ver qué eventos están a nuestra disposición

numerador de facturas

Como podemos ver, existe un evento BeforePrint, es decir "antes de imprimir". Ponemos el código anterior en este evento

Private Sub Workbook_BeforePrint(Cancel As Boolean)

[C35] = WorksheetFunction.Sum(Range("C18:C34"))

[C5] = [C5] + 1

End Sub

Ahora, cuando queramos imprimir la factura, ya sea con el icono de impresión o con el menú Archivo-Imprimir, se disparará el evento, el número de la factura aumentara en 1 y el total será recalculado.
Para mejorar nuestro evento, podemos incluir la posibilidad de cancelar la impresión. Lo que haremos es agregar algunas líneas de código


Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp
    Dim dlgPrint As Boolean
    
    Mensaje = "El total es " & [C35] 'Total
    Mensaje = Mensaje & " Imprimir?"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)

    On Error GoTo errNoPrint

    If Resp = vbYes Then
    Application.EnableEvents = False
    [C5] = [C5] + 1
     dlgPrint = Application.Dialogs(xlDialogPrint).Show
        If dlgPrint = False Then
            [C5] = [C5] - 1
            Cancel = True
            Application.EnableEvents = True
            Exit Sub
        End If
    Else
        Cancel = True
        Application.EnableEvents = True
    End If

    Application.EnableEvents = True

    
    Exit Sub

errNoPrint:
[C5] = [C5] - 1
Cancel = True
Application.EnableEvents = True
End Sub



Primero calculamos el total; luego producimos un mensaje donde exponemos el total y damos la opción de cancelar la impresión

numerador de facturas

Si el usuario aprieta No, el proceso de impresión se detiene y el número de la factura no cambia.

Como se puede ver, con algunas líneas de código puestas en el lugar correspondiente, podemos lograr una aplicación bastante práctica. El cuaderno con la factura puede descargarse aquí

Si usamos el evento BeforePrint, el botón es innecesario y puede ser eliminado.



Technorati Tags:

jueves, enero 10, 2008

Distribuir datos en hojas Excel sin macros.

Supongamos esta situación: una empresa de transporte lleva el registro de los viajes un cuaderno Excel con varias hojas. En la primera se anotan los datos (fecha, destino, conductor y ruta). Por cada ruta hay una hoja. Nuestro objetivo es que al anotar los viajes en la primer hoja, éstos aparezcan automáticamente en la hoja correspondiente por ruta.

Esta es la tabla que aparece en la primer hoja (que llamaremos "Datos")




Queremos que cada línea aparezca en otra hoja. Los viajes de la ruta 1 en una hoja que se llamará "Ruta 1", los de la ruta 2 en "Ruta 2", etc.

Hay dos formas más o menos inmediatas de resolver el problema: macros y tablas dinámicas. Con tablas dinámicas no estaríamos distribuyendo los datos, pero podríamos generar con facilidad listas por ruta.

Pero el desafío es hacerlo con fórmulas. No es que esté aburrido y no tenga lo que hacer. Pero curiosamente he recibido varias veces esta consulta en las últimas semanas. A veces se trata de transporte por rutas, como en el ejemplo, a veces una escuela de fútbol que lleva un registro de alumnos por edad, a veces una tienda que quiere manejar el inventario por tipo de producto.

Finalmente decidí aceptar el desafío, a pesar que la solución que propondré más adelante no es eficiente como el uso de tablas dinámicas o macros.

El primer paso es crear tres hojas, una para cada ruta, donde pondremos las fórmulas que reflejaran los datos correspondientes de la hoja Datos. En estas hoja ponemos los mismos encabezamientos como en Datos, pero agregamos una columna, "Orden"



En la celda A2 ponemos esta fórmula: =SI(Datos!$D2=1,Datos!A2,"")
Esta fórmula trae el contenido de la celda A2 de Datos, si el valor de la columna D de Datos es 1, es decir, la ruta 1. En la Hoja Ruta 2 copiamos la misma fórmula, pero cambiamos el argumento Datos!$D2=1 por Datos!$D2=2.

Copiamos la fórmula en las celdas B2 y C2 (prestar atención a los símbolos $ en las direcciones de la celda) y luego al rango A3:C11.
Como se puede ver, los valores que aparecen en el rango son los de la ruta 1. Sino, aparece una celda en blanco.



En la celda D2 ponemos esta fórmula, que ya explicamos en la nota sobre ordenar texto en Excel con fórmulas,

=CONTAR.SI($A$2:$A$11,"<="&A2) y la copiamos al rango D3:D11.



Como se puede apreciar, esta fórmula hace las veces de la función JERARQUIA para textos. Si bien las fechas son números, y por lo tanto podríamos usar JERARQUIA, el problema surge con las celdas en blanco. Por ese motivo usamos la fórmula señalada.


Ahora creamos una segunda tablas en el rango F1:H11. En la primer fila copiamos los encabezamientos. En la celda F2 ponemos esta fórmula

=INDICE($A$2:$E$11,COINCIDIR(FILA()-1,$D$2:$D$11,0),COINCIDIR(F$1,$A$1:$C$1,0))

que copiamos al rango F2:H11



En la nueva tabla, las líneas que pertenecen a la ruta aparecen ordenadas por fecha, y las que pertenecen a otras rutas aparecen como #N/A. Para mejorar la apariencia de la lista podemos aplicar Formato Condicional



dándole color blanco a la fuente de la celda que cumple la condición, para hacer "desaparecer" el resulta #N/A. También hemos ocultado las columnas A:E.

¿Cómo funciona la fórmula con al función INDICE? Esta función da como resultado el valor de una matriz que se encuentra en la celda determinada por el valor del segundo argumento (fila) y del tercer argumento (columna). La matriz es el rango A2:E11, que contiene también la columna Orden.
La fila es determinada por la función COINCIDIR(FILA()-1,$D$2:$D$11,0), que encuentra en que lugar del rango D2:D11 se encuentra la fila con el número de orden 1, 2 etc. El número de orden es determinado por el número de fila de la celda que contiene la fórmula, menos 1. Así, en la fila 2 aparecerán los datos que tienen el número de orden 1, en la fila tres los que tienen el número de orden 2, y así sucesivamente.
La segunda función COINCIDIR, hace que los datos en la celda correspondan a la columna indicada.

Como verán, hemos encontrado una solución con fórmulas al problema. Pero esta solución tienen dos problemas importantes, si queremos trabajar con gran cantidad de datos:
- la función FILA(), es volátil y causa que cada cambio en la hoja provoque un recálculo de toda lo hoja;
- INDICE y COINCIDIR tienden a ser lentas cuando trabajamos con gran cantidad de datos.

El archivo se puede descargar distribuir a hojasaquí




Technorati Tags:

domingo, enero 06, 2008

Cálculos con pies (feet) y pulgadas (inches) en Excel.

Hace unos días me consultaba un lector sobre cómo hacer cálculos en pies (feet) y pulgadas (inches) con Excel.
Debo confesar que nunca me había planteado esta pregunta. Dado que despertó mi curiosidad, en definitiva en los Estados Unidos siguen usando estas medidas, empecé por informarme un poco sobre el tema.
Como casi siempre en estos casos, empezamos por Wikipedia. Así nos enteramos que 1 pie (foot) equivale a 12 pulgadas (inches), la que se suele escribir: 1' = 12". Las fracciones de pulgada más comunes son: 1/2", 1/4", 1/8", 1/16", 1/32" y 1/64". Ciertas fracciones comunes son expresadas en su forma reducida, por ejemplo 6/32" es presentada como 3/16".
Según la nota de Wikipedia, las equivalencias también se presentan en forma decimal. 1/2" = .5, 1/4"=.25, 1/8"=.125, 1/16"=.0625, 1/32"=.03125 y 1/64"=.015625; de ahí, el resto de las fracciones, por ejemplo: 3/8"=.375 ó 63/64"=.984375.

Volviendo a la consulta de mi lector, se trataba de sumar 3'-4 1/2"+ 2'-2 5/8. La primera dificultad para los que crecimos y vivimos en un mundo métrico, es entender la notación. El primer número en la suma es, en letras, tres pies y cuatro y media pulgadas; el segundo es dos pies con dos cinco y ochoavos pulgadas.

Tras una breve búsqueda en la Internet, llegué al sitio de John Lacher quien ofrece descargar una función UDF para convertir pies y pulgadas a medidas métricas.

Otra alternativa es usar funciones nativas de Excel y columnas auxiliares, como mostraremos en esta nota.

Para resolver el problema empezaremos por reducir todo a pulgadas, el mínimo común denominador. En el primer número 3 pies equivalen a 36 pulgadas; así que todo el número expresado en pulgadas es 40.5. El segundo equivales a 26.65 pulgadas (2*12 + 2 + 5/8 = 24+2+0.625).

Como vemos, la conversión no es problemática. El problema es cómo indicarle a que Excel cuál es la parte del número expresado en pies y cuál en pulgadas.

Para esta tarea tendremos que recurrir a funciones texto. Empezamos por construir una plantilla




En la celda B2 ponemos esta fórmula =IZQUIERDA(A2;ENCONTRAR("'";A2)-1) y la copiamos en la celda B3. El resultado es un texto. Para poder aplicar más adelante operaciones matemáticas los convertimos en número usado la función VALOR



Para extraer la parte de pulgadas usamos la función EXTRAE combinada con la función LARGO:

=VALOR(EXTRAE(A2;ENCONTRAR("-";A2)+1;LARGO(A2)-ENCONTRAR("-";A2)-1))



Finalmente, para calcular el total de pulgadas usamos en D2 la fórmula =B2*12+C2 y la copiamos a D3. Calculamos los totales para cada columna



Todo lo que nos queda es reducir el resultado 67,125 pulgadas a su expresión en pies y pulgadas. Para esto usamos las funciones ENTERO y RESIDUO y TEXTO. En la celda D5 ponemos la fórmula

=ENTERO(D4/12)&" - "&TEXTO(RESIDUO(D4;12);"# ??/??")

Usamos la función texto, ya que tenemos que unir el resultado de la función ENTERO, que es numérico, con la parte fraccional que es texto.



A quien tenga que hacer frecuentemente cálculos con pies y pulgadas, le convendrá sin dudas descargar alguna función de la Internet, como la que ofrece Lacher.

Technorati Tags:

miércoles, enero 02, 2008

JLD en Castellano – Balance del segundo año

Hace un año atrás, hacía el balance del primer año de este blog. Ahora ha llegado el momento de presentarles el balance del segundo año.
Durante el 2007 he estado utilizando los servicios (gratuitos) de StatCounter. La ventaja de este servicio es que permite extraer datos históricos con facilidad. Sencillamente se introducen las fechas de inicio y fin del período y el sitio genera una tabla con las estadísticas diarias. El sitio también nos permite descargar la tabla a un archivo en formato Excel o csv.
Esto que parece tan trivial, se convierte en un verdadero ejercicio de manipulación de datos, cuando nuestro sistema está instalado "en castellano". En una próxima nota estaré describiendo las técnicas que tuve que utilizar con los datos de StatCounter para poder generar la información y los gráficos que muestro aquí.

Durante el 2007 han visitado mi este blog 222.328 lectores, de los cuales 171.176 lo hacían por primera vez (First Time Visitors - 77%) y 51.152 ya lo habían hecho en el pasado (Returning Visitors - 23%).

Estos 222.328 visitantes leyeron 533.567 páginas, es decir un promedio de 2.4 páginas por visitante.

Dicho en términos diarios: 609 visitantes por día, de los cuales 469 lo hacían por primera vez, y 1.462 páginas leídas por día.




En forma gráfica:






El 25 de octubre fue el día record de visitas, con 1.419 visitantes y 3.219 páginas.

En el 2006, el primer año de este blog, hubo cerca de 58.000 visitante y 163.000 páginas leídas. Es decir un crecimiento del 383% en la cantidad de visitantes y del 327% en la de páginas leídas.

A todo esto habría que sumar las suscripciones del feed del blog, que también han crecido a buen ritmo. Al final del 2006 contaba con 33 suscriptores. De acuerdo a las estadísticas de Feedburner, a fin del 2007 este blog tenía 257, es decir casi 8 veces más.

En el resumen del 2006 declaraba cuáles eran mis planes para el 2007: reunificar el blog de gráficos y presentación de datos en este blog, crear un sitio independiente que de solución a la descarga de archivos con ejemplos, mejorar la interfaz del blog y empezar a publicar una serie de guías prácticas en castellano.

Debo reconocer que de todos los planes sólo he cumplido el de mejorar, no dramáticamente debo reconocer, la interfaz del blog.
Las guías y el sitio pasan a ser las buenas intenciones para el 2008. En cuanto al blog de gráficos, sigo dudando qué hacer con él. Por ahora seguirá siendo un blog independiente.

En resumen, 2007 ha sido un año de buen crecimiento para el blog, por lo que le estoy agradecido a mis lectores. Ha sido un año en el que sentido la gratitud de muchos de ustedes, también en los momentos difíciles que me han tocado vivir en mi vida personal.

A todos, muchas gracias y mis mejores deseos de un feliz y próspero 2008.



Technorati Tags:

sábado, diciembre 29, 2007

Grafico de columnas con maximo y minimo marcados

Existen situaciones en las cuales cuando representamos una tabla de valores en un gráfico de columnas, no es fácil distinguir entre el valor máximo y el mínimo de la serie.
Una posibilidad es dar color distinto a a las columnas que representan estos valores, como mostramos en la nota de ayer.
Otra posiblidad es agregar una flecha de cloque con el texto "Max" o "Min" sobre la columna correspondiente, como en este ejemplo



La técnica para hacerlo está explicada en la nota Remarcar máximos y mínimos en gráfico de columnas de Excel, en mi blog sobre gráficos y presentación de datos.

Technorati Tags:

viernes, diciembre 28, 2007

Formato condicional en graficos Excel de columnas

En mi blog sobre gráficos y presentación de datos en Excel acabo de publicar una nota sobre cómo lograr que las columnas de un gráfico cambien de color en función del valor que representan.

Supongamos que queremos señalar en un gráfico de columnas que representa las ventas del año por meses, en que meses las ventas han estado por debajo de un mínimo esperado, en qué meses han estado en los valores aceptados y en que meses han superado estos valores. Por ejemplo, este gráfico



donde los meses con ventas por debajo de los 50.000 aparecen en rojo; los meses con ventas entre 50.000 y 80.000 en verde y los meses que superan los 80.000 en azul.

El archivo con el ejemplo se puede descargar graficos condicionalesaquí

Technorati Tags:

jueves, diciembre 20, 2007

Gráficos de columnas flotantes en Excel

En mi blog sobre gráficos y presentación de datos con Excel, acabo de publicar una nota sobre cómo construir un gráfico de columnas flotantes.

La nota surgió como respuesta a una consulta de uno de mis lectores

llevo semanas investigando si se puede hacer una gráfica donde cada barra sea un rango de valores... es decir, por ej la primera barra vaya de 30 a 50, la segunda barra de 90 a 234 y la tercera de -23 a 45...


Espero que encuentren la nota útil.

Technorati Tags:

martes, diciembre 18, 2007

Escala logarítmica en gráficos de Excel

Supongamos que tenemos esta serie de datos que queremos representar en un gráfico de Excel




Elegimos el gráfico de dispersión y este es el resultado



Como pueden ver el gráfico, por decirlo con suavidad, no sirve para nada y en el mejor de los casos sólo puede crear confusión.
A pesar que el punto 2 es dos veces y media más grande que el punto 1, ambos en el gráfico ambos parecen tener la misma magnitud. Peor todavía con el punto 4 que es 12,5 veces mayor que el punto 1.
Ahora hagamos lo siguiente: seleccionamos el eje de la Y y abrimos el menú de formato del eje



En la parte inferior del diálogo marcamos la opción Escala Logarítmica. El resultado será el siguiente:



Como pueden ver, tenemos ahora un gráfico claro y explicativo. Excel permite en cierto tipo de gráficos usar escalar logarítmicas lo que nos permite representar en un gráfico valores de magnitudes distintas, como el de nuestro ejemplo.
Para mejorar aún más el gráfico podemos agregar rótulos con los valores



Intuitivamente entendemos que el gráfico representa los puntos de acuerdo a sus magnitudes. Pero si queremos corregir la escala del eje de las Y, de manera que el máximo sea 15000 y no 100000, veremos que no podemos hacerlo con las opciones nativas de Excel.


Si queremos que la escala del eje de las Y de nuestro gráfico se extienda del 0 a 15000, tendremos que usar otra técnica.
Empezamos por calcular los logaritmos de los valores de la tabla (no tengan miedo, Excel tiene la función LOG para esta tarea)



Y representamos estos nuevos datos en un gráfico de dispersión



Ahora borramos de nuestro gráfico de las líneas de división y las marcas del eje



quedando este gráfico



Ahora tenemos que crear una serie de valores para las líneas de división del eje de las Y. En una tabla ponemos los valores que queremos que aparezcan en la escala de la Y, y calculamos sus logaritmos. Entre ambos valores ponemos una serie de valores 0



Seleccionamos Valores X y Log Y de la tabla y los agregamos al gráfico, seleccionándolo y abriendo el menú Gráfico—Agregar Datos



y luego



El resultado se verá de la siguiente manera



Ahora tenemos que ocuparnos de la nueva serie que acabamos de agregar para crear la escala y las líneas de división del eje de la Y. Empezamos por seleccionar la serie y abrir el diálogo de Formato de serie de datos



poniendo los valores de Línea y Marcador a "ninguno". En Rótulo de datos señalamos Valor de X



Vamos a la pestaña de Barras de Error y en la opción Valor Fijo ponemos 8



El resultado es un tanto desalentador, pero enseguida lo corregiremos



Seleccionamos las barras de error y abrimos el diálogo de Formato de Barras de Error. Allí ponemos un formato más conveniente



Ahora nos tenemos que ocupar de los rótulos de la Y, que por ahora aparecen todos como 0.
Empezamos por cambiar la ubicación de los rótulos a la izquierda del eje



Ahora, seleccionamos el primer rótulo de la serie (con un segundo clic), en la barra de las fórmulas ponemos el signo = y seleccionamos la celda que contiene el valor de la línea (en nuestro caso A11).



Repetimos el procedimiento para el resto de las líneas de división y obtenemos este gráfico



Si no estamos satisfechos con el resultado, podemos cambiar los valores en la tabla y obtener mejores resultados visuales. Por ejemplo, las líneas divisorias del 10 y del 15 quedan muy cerca una de la otra. Cambiamos el 10 en la tabla por 5



Y obtenemos este gráfico mejorado



Este gráfico es "semilogarítmico", es decir, sólo uno de los ejes tiene una escala logarítmica. También podemos crear gráficos "doble logarítmicos" donde ambos ejes tienen una escala logarítmica.



Technorati Tags: