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:

130 comentarios:

  1. Hola Maestro, no me resulto, segui los pasos con otras celdas solamente y nada despues copie el codigo del blog cambien las celdas de Total y Nº que incrementa mas el rango y tampoco me imprime ni me muestra la suna ni el nº, solo me arroja el resultado en el mensaje.

    Genial su blog y lo mejor en español
    ojala podamos chekiar mas macros de eventos aca.

    Saludos.

    ResponderBorrar
  2. Muy claro Jorge, gracias por seguir compartiendo tus habilidades en la materia.

    ResponderBorrar
  3. Daniel

    puedes mandarme tu cuaderno para que le de un vistazo.

    ResponderBorrar
  4. Hola Jorge, mi nombre es Felipe, tengo dificultades para condicionar los colores de las celdas , la situación es al siguiente, confeccione una carta Gantt en una hoja de Excel y en la otra un checklist , la idea es que a medida que valla llenando el listado se modifiquen los colores de la planificación, cuento con Excel 2007, espero que puedas ayudarme, gracias de ante mano.

    ResponderBorrar
  5. Hola,
    tendrías que mandarme el archivo para que me de un aidea de lo que quieres hacer.

    ResponderBorrar
  6. Hola Jorge, me encantaria seguirte pero no se por donde empezar con las macros y demas...no se agregar botones, etc etc..podrias ayudarme? Necesito que cada vez que habra la plantilla se enumere sola...podrias ayudarme porfavor??Gracias

    ResponderBorrar
  7. Hola,
    toda la ayuda la trato de dar a través del blog, que escribo en mi tiempo libre. Ayuda en implementar modelos, y más si es para fines comerciales, lo considero trabajo de consultoría. Para trabajos de consultoría puedes ponerte en contacto conmigo a través del correo electrónico.

    ResponderBorrar
  8. Le estoy muy agradecido, y espero que su fuerza de voluntad de realizar este blog da mas que sus frutos,
    Es genial

    ResponderBorrar
  9. el archivo funciona pero no imprime

    ResponderBorrar
  10. Milton,
    el archivo utiliza el mecanismo de impresión de Excel, por lo que tal vez tengas un problema con la impresora, con el driver o con alguna definición.

    ResponderBorrar
  11. Hola, no habra algun codigo para regresar el numerador a cero si otra celda cambia? haber si me pueden ayudar con eso :)

    ResponderBorrar
  12. Por supuesto, de la misma manera creas un evento que cuando la celda determinada cambia el valor del contador vuelve a cero.

    ResponderBorrar
  13. Hola Jorge, mi nombre es Elias la verdad no soy bueno en Visual Basic y menos con estos macros. Necesito un poco de ayuda con un codigo que lo quiero para lo siguiente: quiero que el numerador vuelva a 0 cuando la fecha cambie. la fecha la tengo en otra celda con el codigo =si(A1<>"";Ahora();). entonces cuando cambie la fecha, quiero que el contador vuelva a 0 pero no se como,estoy desesperado!

    ResponderBorrar
  14. El codigo corre bien hasta el cuadro de mensaje, si le doy SI o NO igual no hace nada. Mi compu imprime bien desde excel o cualquier otro programa. Que podria ser??? como podria solucionar esto?

    ResponderBorrar
  15. Elías,
    mandame el archivo por mail privado.

    ResponderBorrar
  16. Hola Jorge muy buenas tus soluciones habra alguna manera de que cada vez que se cambie el numero me guarde por ejemplo el nombre del cliente junto con el numero de factura en otra hoja, esto para llevar como un informe de todas las facturas que genere? y claro cada vez que se genere un registro en otra hoja no borre el anterior

    ResponderBorrar
  17. Héctor,

    fijate en la técnica que muestro en esta nota.
    Este tema se repite en varias consultas por lo que posiblemente publique una nota sobre el tema.

    ResponderBorrar
  18. Excelete publicación voy a intentarlo ya que necesito hacer lo mismo

    ResponderBorrar
  19. Saludos Jorge, acabo de aplicar el macro para incrementar en 1 el numero de un formato que tengo para solicitar cotizaciones o presupuestos. El detalle esta que el numero tambien se me incrementa al darle VISTA PRELIMINAR y esto siempre debo hacerlo antes de imprimir en pdf o en fisico, pues a veces debo ajustar medidas de la hoja pues dependiendo de la cantidad de informacion, trato que queden en la menor cantidad de hojas posible. Como hago para que no se me incremente el numero del correlativo al visualizar previamente el documento.

    ResponderBorrar
  20. No conozco ninguna manera de capturar el evento de vista preliminar. La única forma que se me ocurre es abrir un cuadro de texto preguntando al usuario si está imprimiendo o viendo una vista preliminar. En caso de tratarse de una vista preliminar no incrementar el contador de las facturas.

    ResponderBorrar
  21. hola jorge segui los pasos y logre mi numerador automatico gracias.
    ahora quiero preguntarte como hacer para tener el numerador automatico consecutivo en varios formatos de factura. si pudieras ayudarme te lo agredeceria mucho.

    ResponderBorrar
  22. Te sugiero que me envies la conslta por mail privado, con un ejemplo de lo que quieres hacer.

    ResponderBorrar
  23. maestro como puedo hacer que me de subtotal, iva y total me ayudaria mucho gracias

    ResponderBorrar
  24. Jorge

    desgaras el archivo con el ejemplo; en la celda B35 pones Subtotal en lugar de Total; en la celda C36 pones la fórmula =C35*21% (o la tasa de IVA correspondiente) y en C37 la fórmula =C35+C36
    Sencillo, no?

    ResponderBorrar
  25. Jorge, cómo va?

    No se podría tener una celda en un archivo aparte (xls, txt, etc) que lleve el contador y ante cada emisión de factura tome el valor de ahí e incremente 1 antes de imprimir?

    Cómo podría armarse eso?

    Gracias!
    Genial el blog!

    ResponderBorrar
  26. El contador está en la celda C5 en la hoja de la factura. Se puede poner el contador en cualquier otra celda de cualquier otra hoja y de ahí tomar el valor. Pero, ¿por qué complicar las cosas?

    ResponderBorrar
  27. HOLA JORGE MUY BUEN APORTE TE FELICITO...TENGO UNOS PROBLEMITAS, CUANDO QUIERO IMPRIMIR Y LE DOY "NO", IGUAL SE ACUMULA EL CONTADOR, COMO PUEDO HACER PARA QUE ME FUNCIONE BIEN...DE ANTEMANO GRACIAS..
    ATTE: PABLO

    ResponderBorrar
  28. Pablo,
    asegurate de poner el evento Befor_Print en el módulo de la hoja que contiene la factura. Este evento es el que asegura que el contador no avance cuando cancelamos la impresión.

    ResponderBorrar
  29. OK GRACIAS...UNA PREGUNTA MAS, COMO HAGO PARA QUE AL MOMENTO DE IMPRIMIR ME PIDA QUE GUARDE LA FACTURA O SOLO LO PUEDO GUARDAR MEDIANTE LA OPCION DE ARCHIVO, DE GUARDAR COMO?...O HAY UN CODIGO PARA ESO
    ATTE: PABLO

    ResponderBorrar
  30. Pablo,
    hay un código para todo...Posiblmente publique una nota ampliando el tema del manejo de facturas con Excel que incluya el código para guardar la información de la factura.

    pd.: ¿hay algún motivo en particular por el cual escribes todo en mayúsculas?

    ResponderBorrar
  31. Buen dia Jorge, le comento que baje copie el evento y lo acomode para aplicarlo a otro tipo de archivo pero cuando mando a imprimir no cambia el correlativo y no manda a imprimir.

    ATT
    Jorge Solares

    ResponderBorrar
  32. Jorge, asegurate de poner el código del evento en el módulo de la hoja que contiene la factura.

    ResponderBorrar
  33. Buenas noches Sr. Jorge me podria ayudar no puedo mandar a imprimir solo se va de largo y no imprime nada de lo que ocupo, si le doy en si aumento el contador si le doy en no de todas maneras aumenta
    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp
    Dim Total As Double

    Mensaje = "El total es " & Total
    Mensaje = " Este seguro en imprimir? si Acepta cambia numero de Recibo"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)
    Cancel = True
    If vbNo Then
    Cancel = True
    [O1] = [O1] + 1
    End If
    Exit Sub
    End Sub

    ResponderBorrar
  34. Buenas tardes me podrian ayudar no puedo imprimir y se me cambia el consecutivo cuando cancelo.


    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp

    Mensaje = " Este seguro en imprimir? si Acepta cambia numero de Recibo"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)
    If vbNo Then
    Cancel = True
    [O1] = [O1] + 1
    Exit Sub
    End If
    End Sub

    ResponderBorrar
  35. Acabo de actualizar eel código para cubrir también la posibilidad que el usuario apriete el botón de cancelar la impresión.
    También he reemplazado el archivo para descargar.

    ResponderBorrar
  36. me funciono la primera vez pero ahora ya no me cambia ni el numerador solamente me lleva a imprimir, tampoco aparece el cuadro de dialogo?
    por que puede ser? baje el archivo de prueba y tampoco funciona ahora

    ResponderBorrar
  37. Nicolás,

    en los próximos días estaré publicando una revisión de la nota.

    ResponderBorrar
  38. Muy buen aporte Jorge.
    Solo una consulta, al imprimir me tira dos copias, como hago para que solo imprima una sola copia del documento.
    Gracias.

    ResponderBorrar
  39. He vuelto a probar el modelo e imprime una sola copia, que es la definición por defecto de Excel. Asegurate que en Imprimir-Copias aparezca "1".

    ResponderBorrar
  40. Buenas! Soy nueva en ésto. La información de tu blog es muy práctica y buenísima. La hoja me funciona con el código pero tengo una duda. Si yo guardo cada factura en una carpeta en mi PC, y quiero volver a imprimir una determinada factura en concreto, al imprimirla, lo hace con el número siguiente. ¿Hay alguna forma de que imprima esa misma que he guardado con su número correcto o sólo puedo hacerlo de forma manual, poniéndole el número anterior antes de imprimirla?
    Muchas gracias de antemano. Tienes un blog maravilloso!!

    ResponderBorrar
  41. Al guardar la factura, tienes que borrar o desactivar el evento que dispara el contador de la factura.

    ResponderBorrar
  42. Que tal, buen aporte.
    La hoja me funciona muy bien, pero tengo una duda, voy a utilizar tres hojas de excel, habrá alguna forma de que el macro funcione para las tres, es decir si estando en cualquiera de las tres al imprimir modifique el correlativo para todas

    ResponderBorrar
  43. Si, por supuesto. Habría que crear una variable que contenga el número de factura y que las facturas en las distintas hojas se refieran a esta variable.

    ResponderBorrar
  44. Hola, que tal? El aporte es excelente, pero tengo un pequeño problema: Mando a imprimir y el contador aumenta correctamente, imprime correctamente, pero al terminar me vuelve a mostrar el dialogo para imprimir, utilizo Excel 2007, no se a que se deba. Gracias por tu ayuda.

    ResponderBorrar
  45. En los próximos días revisaré el código en el versión 2007.

    ResponderBorrar
  46. Saludos Sr. Jorge,

    Antes que nada, mis más sinceras GRACIAS!! Su blog ha sido muy útil para mi crecimiento profesional.

    La macro me funciona muy bien, pero quise ver en vista preliminar la factura, antes de imprimirla, pero al hacer clic en vista preliminar se activa la macro. Se debe esto a que le comando de vista preliminar es similar a una impresión? Cómo puedo cambiar eso?

    Gracias por su tiempo!

    ResponderBorrar
  47. Revisaré el código y publicaré la versión corregida.

    ResponderBorrar
  48. Hola Jorge: necesitaba una macro como la que has hecho y buscando por internet la encontré y funciona perfectamente. Muchas gracias porque me ha ayudado muchísimo.
    Sin embargo, estoy intentando ampliarla para que cuando aumenta el número de factura, guarde además una copia en una carpeta concreta y con el nombre del número de factura. ¿Me podrías echar una mano? Te lo agradecería mucho. Gracias, y un saludo. José

    ResponderBorrar
  49. ¿Por que guardar una copia en una carpeta? Sería más eficiente y práctico guardar los datos de la factura en una hoja que haga las veces de base de datos. Luego, si se necesita imprimir una copia de la factura, un código sencillo puede tomar los datos de la factura de la base de datos e imprimir la copia.
    Una ventaja adicional sería que podrías analizar las ventas por fecha, cliente, artículo, etc.

    ResponderBorrar
  50. Hola Jorge. Totalmente de acuerdo. Brillante idea. Eso sería muchísimo mejor, pero a mi se me escapa totalmente de mis posibilidades. Muchas gracias. Un saludo, Jose

    ResponderBorrar
  51. Estoy pensando en construir el modelo y ofrecerlo a través del blog. Veremos...

    ResponderBorrar
  52. Estupendo. Muchísimas gracias Jorge. Saludos, Jose

    ResponderBorrar
  53. Jorge buenas tardes, estoy utilizando un modelo como el tuyo, solamente que lo tengo integrado de tal forma que cuando doy click al boton me manda a una serie de subrutinas que hacen desde copiar datos, pegar datos, limpiar datos y mandar a imprimir entre otros, el caso es que en mi ordenador me funciona bien, el problema es que lo corri en otro ordenador y me manda error y manda precisamente a la linea [F3]=[F3]+1, solo por probar, borre la linea y me funciono todo en el otro ordenador, busque si el libro tenia vinculos raros y nada, tienes algun otro codigo que haga la misma funcion o alguna idea de por que hace eso?

    ResponderBorrar
  54. Podés porbar usar Range("F3") en lugar de [F3], aunque no creo que ese sea el problema.

    ResponderBorrar
  55. Jorge al igual que el otro compañero a mi también.
    me esta imprimiendo dos copias, como hago para que solo imprima una sola copia del documento. ya revise las propiedades de la impresora y el numero de copias y todo esta bien

    ResponderBorrar
  56. José, volveré a revisar el código.

    ResponderBorrar
  57. Hola, muy bueno tu blog.
    Seria posible modificar una plantilla para que cada vez que se ejecute se incremente el valor de una celda para que no se repita el número en cada copia generada?

    ResponderBorrar
  58. Se supone que el numerador se incrementa con cada nueva factura.

    ResponderBorrar
  59. Hola Jorge

    Tu codigo me sirvio mucho para lo que estaba necesitando, pero tenia un pequeño problema, se imprimian dos copias, y solo necesitaba una. por eso le realice algunas modificaciones y quedo asi para imprimir una copia.
    imprimia 2 hojas porque al dar click en el icono de imprimir o Ctrl P ya damos la orden de imprimir la hoja y luego en el codigo solicitamos nuevamente la orden de impresion dlgPrint = Application.Dialogs(xlDialogPrint).Show ; elileminando esta linea y sus sub procesos queda el problema resuelto.

    Muchas gracias por tu blog esta genial sigue asi.


    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp
    Mensaje = "El Consecutivo a imprimir es " & [D8] + 1
    Mensaje = Mensaje & " ¿Imprimir?"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)
    If Resp = vbYes Then
    Application.EnableEvents = False
    [D8] = [D8] + 1
    Else
    Cancel = True
    Application.EnableEvents = True
    End If
    '
    Application.EnableEvents = True
    '
    Exit Sub
    End Sub

    ResponderBorrar
  60. Buenísimo el aporte, me auxilie un poco de la ayuda de excel para poder completar el archivo y me funciona de maravilla.

    ResponderBorrar
  61. buenas yo he creado una plantilla con un numero de factura autonumerico y en Workbook y de beforesave, es decir al salvar cambie el numero, cuando yo abro en dobleclick como libro para meter datos el primero me cambia el numero, al abrir otra vez para hacer otra factura ya no me lo cambia.

    ResponderBorrar
  62. quien me podra ayudar hice mi factura muy sencilla pero no se como guardar a los clientes hacer para manejar el inventario me dedico ala renta de maquinaria entonces entran y salen y cambiar el numero de la factura gracias.

    ResponderBorrar
  63. Alejandro,
    he tocado el tema en forma indirecta en algunos de los posts. Espero publicar en breve una nota con un modelo que contempla tu consulta.

    ResponderBorrar
  64. Buenas, analice la hojita, hice varias pruebas con ella y note un detalle. Cuando realizo la factura e imprimo, el numero incrementa como se espera. Pero, cuando cierro el documento sin guardar note que el consecutivo regreso a anterior. sugiero que al imprimir e incremetar el numero de factura, tambien se guarden los cambios en el mismo proceso. como se hace esto???

    ResponderBorrar
  65. Bien, se supone que el usuario guarda el cuaderno. En tu caso hay que agregar una línea que guarde cuaderno n el evento Before_Print,

    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
    ThisWorkbook.Save
    [C5] = [C5] + 1
    dlgPrint = Application.Dialogs(xlDialogPrint).Show
    If dlgPrint = False Then
    [C5] = [C5] - 1

    ResponderBorrar
  66. El post me ha sido muy útil, desearía hacer un comentario en referencia al mismo, ya que observo lo siguiente si estoy diligenciando el consecutivo #100 al momento de generar la impresión, lo hace con el #101, lo cual no es consecuente, ya que debería imprimirme la factura con el #100 y pasar al #101. Agradezco sus comentarios y que ajustes se deben hacer a la macro para corregir esta situación.

    Leonardo Villa

    ResponderBorrar
  67. Hola Leonardo,
    gracias por los comentarios. Estoy preparando una versión nueva y corregida que espero publicar en los próximos días.

    ResponderBorrar
  68. AMIGO TU EJEMPLO ME QUEDO MUY BIEN DE ANTEMANO MUCHAS GRACIAS Y TE AGRADEZCO LO QUE HACES POR LOS QUE NO SABEMOS.

    ResponderBorrar
  69. Hola, Jorge. Felicidades por tu Blog es mucha información vital.

    Lo que sucede es lo siguiente, cree un formato de pedido y necesito que mi correlativo cuenta incluso las copias que mando a imprimir de él ya que se imprime en masa. Agradecería tu ayuda

    Atte: Manuel

    ResponderBorrar
  70. Manuel, gracias por los conceptos. Como puse en el comentario anterior, estoy preparando una nueva versión que incluirá todos los pedidos y sugerencias.

    ResponderBorrar
  71. Hola Jorge quisiera saber como puedo hacer par que en un formato de orden de compra que tengo en excel, al escribir solo el nombre del proveedor me arroje los datos adicionales como: nit, e-mail,telefono,movil,direccion, entre otros. Agradezco pronta colaboracion gracias

    ResponderBorrar
  72. Hay muchas formas de hacerlo. La más elemental, si no se trata de muchos proveedores, es usando BUSCARV.

    ResponderBorrar
  73. Jorge, tengo office 2013 y quiciera saber si el codigo funciona bien, porque copio el codigo bien, tengo las celdas que corresponden a mi factura, pero no me funciona... me podria ayudar? muchas gracias

    ResponderBorrar
  74. El modelo funciona también en Excel 2013, aunque con los mismos problemas (como puedes ver de los comentarios). En breve estaré publicando un modelo mejorado.
    Mientras tanto puedes mandarme tu archivo para que vea donde pueda estar el problema.

    ResponderBorrar
  75. feliz dia jorge, muy bien la formula de colocar automáticamente el numero de factura, pero en mi caso cada cliente tienen su archivo de excel, entonces, como amarro esta sumatoria de el numero de factura sea la misma secuencia en cada archivo diferente de cliente ... Ejemplo, tengo un archivo en excel del cliente xxx el cual la factura que genero fue la 501, pero ahora facturare a el cliente yyy que tiene su propio archivo en excel y tendría que ser el numero de factura 502..? como hacer para que todos mis clientes en archivos excel, sume la misma secuencia única de facturas con este medoto de boton en excel..??

    ResponderBorrar
  76. Hola,
    creo que la respuesta está en la pregunta :)
    No es una buena idea tener un archivo para cada cliente. Por varios motivos, uno de los cuales ya has descubierto. Otro es, por ejemplo, cuando quieras totalizar las ventas de un período o comparar entre clientes, etc.
    Un diseño más adecuado es tener un único archivo con la plantilla de la factura y el código para generarlas y en este mismo libro una hoja donde pases todos los datos de cada factura a una hoja que haga las veces de base de datos.

    ResponderBorrar
  77. Muy buenas noches Jorge!, me viene resultando muy buena tu informacion para ir entendiendo como armar las macros.
    Te hago una consulta. Yo tengo un archivo que necesitaria que me pregunte el total antes de imprimir y cuente con la posibilidad de cancelar la impresion sin incrementar el numero de la factura (tal cual como está en la macro que pusiste al principio), pero necesitaria que en vez de incrementar el numero de la factura antes de imprimir lo haga LUEGO de imprimir (para que quede lista para la proxima factura). que modificacion tendria que hacerle a tu macro? desde ya te agradezco tu respuesta

    ResponderBorrar
  78. Buenas tardes,

    ¿Cómo sería el código para hacerlo única y exclusivamente en la "Hoja 1"?

    Gracias y saludos!!

    ResponderBorrar
  79. El código de los eventos corre sólo en la hoja que lo contiene. Es decir, si ponemos el código en el módulo de la Hoja1, el código responderá sólo a eventos en esa hoja.

    ResponderBorrar
  80. Estoy haciendo una revisión del tema y espero poder publicar dentro de poco una nota completa con todas las inquietudes que he recibido de mis lectores.

    ResponderBorrar
  81. Buenos días,

    Me gustaría hacer un excel con dos pestañas:
    1-listado de 150 clientes y precios
    2-Factura, con Vlookup sobre el numerador (de 1 a 150) y el listado de clientes para generar facturas

    La idea es utilizar una macro para imprimir 150 facturas de manera que cada vez que se imprima el numerador se incremente y vuelva a imprimir hasta llegar al 150. ¿Es posible?

    ResponderBorrar
  82. Buenas Tarde Jorge,

    tu código me ha servido de mucho siempre y cuando es para la hoja 1, pero en el mismo libro tengo varias hojas que son independientes como podría hacer para que me funciones en dos hojas diferentes

    ResponderBorrar
  83. Bien, la idea es que hay una hoja con la plantilla de la factura. ¿Que hay en las otras hojas?
    Suponiendo que en cada hoja hay una platilla distinta, tienes que escribir el código para cada una de las hojas (los eventos van en módulos de la hoja y sólo funcionan con ella).

    ResponderBorrar
  84. Josep, no puede crear una contador con funciones. Por eso en la nota muestro como usar un evento para incrementar el número de factura.

    ResponderBorrar
  85. tengo un formulario y quiero una aplicacion en excel que me permita llenar los datos, que sea numerado el formulario y me guarde una copia de formulario rellenado. se puede hacer eso? como? gracias por compartir tu sabiduria. :-)

    ResponderBorrar
  86. Todo está explicado en la nota, con excepción de guardar una copia. En realidad se trata de guardar los detalles del formulario/factura, no el formulario en si misma.
    En el futuro estaré publicando una nota sobre el tema.

    ResponderBorrar
  87. muchas gracias señor jorge me sirvio muchisimo tu informacion de como realizar un macro :)

    ResponderBorrar
  88. Gracias por tus aportaciones JLD.
    Tengo un problema con el contador, mi jefe quiere que la numeración de las facturas sea algo especial, quiere el año en curso delante seguido por el número de factura (ej. 2013/01).
    He utilizado el siguiente código [C5] = left([C5], 5) & right([C5],2) + 1
    Con el pretendo inmovilizar los primeros cinco dígitos alfanuméricos (2013/), y que solo me vaya sumando 1 a los dos últimos dígitos de la derecha.
    El problema es que cuando le doy al botón cambio numeración, pasa del número 2013/01 al 2013/2 (quita el cero), y al darle al siguiente cambio me sale un error de depuración.
    He probado con este otro código [C5] = left([C5], 5) & right([C5],1) + 1, pensando que solo me modificaria el ultimo digito, aquí mejora algo el funcionamiento, pero solo hasta llegar a 10, luego vuelve a empezar de 0.
    ¿Qué estoy haciendo mal?

    ResponderBorrar
  89. Hola Dino,

    ¿qué estás haciendo mal? Bueno, casi todo :)

    En primer lugar, ¿qué contiene la celda C5? Si es la fecha no puedes usar la fórmula que estás usando ya que Excel no maneja la fechas como texto, sino como un número entero de una serie (hay varias explicaciones en mi blog sobre el manejo de fechas en Excel).
    En segundo lugar la expresión que quiere usar para numerar las facturas no es un número sino un texto. Debido a esto tu código tiene que crear una cadena de texto (sino siempre en lugar de "02" te aparecerá "2").
    Para construir el texto de la numeración de la factura tendrías que usar una variable que vaya contando el número de factura y en base a este valr crear el texto. Por ejemplo, en este código usa la celda A1 para contener el número de orden de la última factura y en base a él construyo el texto de la proxima factura

    Sub date_fact()

    [C5] = Year(Date) & "/" & Format(Range("A1") + 1, "00")

    Range("A1") = Range("A1") + 1

    End Sub

    Cada vez que cambie el año tendrías que cambiar el valor de A1 a 1. Si bien no es el código que yo usaría, da respuesta a lo que estás buscando.

    ResponderBorrar
  90. Hola! muy util la info, ahora quiero saber si me puedes orientar en lo siguiente Jorge: Quiero imprimir unas facturas utilizando siempre el mismo formato que tengo guardado en mis plantillas, pero no quiero copiar y pegar el formato una y otra vez porque pierdo mucho tiempo y quiero facturar una lista de items muy amplia. ¿Como es posible esto? no encuentro un metodo sencillo de hacerlo, seras tan amable de ayudarme? tengo dias sin encontrar solucion

    ResponderBorrar
  91. Natalie,
    en este post muestro como usar una plantilla de factura donde sólo hay que ingresar los datos. Si entendí tu consulta, ésto es exactamente lo que estás buscando hacer.

    ResponderBorrar
  92. Hola Jorge
    Buen día
    Hice un formulario en donde aplico el numerador automatico, todo perfecto gracias a tu ayuda.
    La pregunta es, si quiero proteger la celda para evitar que alguien cambie la numeración, ¿Es posible?
    Lo intenté protegiendo la hoja, pero de esa forma no funciona la macro
    Gracias por tu ayuda

    Mario Renzetti

    ResponderBorrar
  93. Mario, es posible por supuesto. En el código tenés que desproteger la hoja antes de hacer el cambio y luego volver a protegerla. Sería algo así

    Sheet(nombre de la hoja). Protect "(lo que hayas puesto de password")
    código del numerador
    Sheet(nombre de la hoja). Unprotect "(lo que hayas puesto de password")

    ResponderBorrar
  94. Gracias Maestro, eres un genio
    Logré hacerlo como me lo indicas
    Sale perfecto
    Gracias, muchas gracias de nuevo

    ResponderBorrar
  95. Tengo la formula de numeración funcionando perfectamente pero, también me gustaría que a la vez que imprimo se me guarde en un archivo PDF en una carpeta especifica. ¿Cómo se hace eso Jorge?

    ResponderBorrar
  96. Hola Jorge me llamo Onix he aplicado la formula para facturas y me funciona muy bien, me gustaría saber si se puede hacer que automáticamente después de imprimir se guarde una copia en PDF de la factura. ¿Cuál seria la formula para ello y aplicarla dentro del mismo macro?
    Gracias una vez mas por tus escritos.
    Onix

    ResponderBorrar
  97. hola jorge de ante mano muchas gracias y si quisiera que la macro me salvara la factura en alguna carpeta x se podra??? a la hora de darle la instruccion de impresion

    ResponderBorrar
  98. Si, se puede. La mejor forma de hacerlo no es guardar la factura en una carpeta (tratá de imaginarte cuando llegues a las 100 o 1000 facturas), sino guardar los datos de la factura en una tabla que haga las veces de base de datos.
    He recibido muchas consultas sobre el tema y estoy planeando publicar un modelo de facturación que incluya guardar los datos y la posbilidad de crear copias de las facturas.

    ResponderBorrar
  99. Buenos días. Tengo un libro de Excel con varias hojas de presupuesto, es decir, Presupuesto Alquiler, Presupuesto Venta, Presupuesto confección. Sea cual sea el tipo de presupuesto, lo guardo en una única carpeta y lo que quiero es crear una numeración automática pero que me incremente a partir del último presupesto hecho, sea cual sea el tipo de presupuesto, es decir si hago el presupuesto 1 en la hoja de Presupuesto Alquiler y luego tengo que hacer otro presupuesto de confección, que está en otra hoja me ponga el 2. Todos están en el mismo libro. He probado innumerables maneras y no doy con la buena. Agradezco de antemano tu ayuda.

    ResponderBorrar
  100. No me queda claro que es lo que querés hacer. ¿Guardar el archivo con el nombre más un número correlativo? Si es aspi todo lo que tenpes que hacer es usar "Guardar como" y poner el nombre más el numerador correspondiente. Si lo querés en forma autompatica hay que programar una rutina (macro, Vba). Lo mismo si cada presupuesto está en distitnas hojas de un mismo cuaderno.

    ResponderBorrar
  101. Buen Dia, Amigo Jorge, por favor indicame cual seria el metodo mas practico, para ir almacenando las facturas que imprima, para llevar un respaldo de las mismas en el pc... Gracias

    ResponderBorrar
  102. Hola Alcides, esta es una consulta que he recibido en muchas oportunidades. El principio es guardar la información de la factura, no una copia de ella. Por ejemplo, cada vez que se genera una factura, en una hoja del cuaderno se guarda la información, una fila para cada artículo que se ha vendido. De esta manera se puede crear una copia de la factura y también analizar las ventas.
    Estaré publicando una nota sobre el tema en los próximos días.

    ResponderBorrar
  103. buenos días me imprime dos veces que hago... por fa<vor ayuda
    tengo el siguiente código... favor ayudármelo a corregir

    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp
    Dim dlgPrint As Boolean

    Mensaje = "El total es " & [C19] 'Total
    Mensaje = Mensaje & " Imprimir?"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)

    On Error GoTo errNoPrint

    If Resp = vbYes Then
    Application.EnableEvents = False
    [C9] = [C9] + 1
    dlgPrint = Application.Dialogs(xlDialogPrint).Show
    If dlgPrint = False Then
    [C9] = [C9] - 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

    ResponderBorrar
  104. Buenos días don Jorge, quisiera saber si me puede indicar como se hace para que las facturas que hago me guarde una base de datos en otra hoja, como se hace, muchas gracias..

    De antemano le agradezco mucho por su post me sirvió muchísimo,..... buen aporte para nosotros que estamos aprendiendo

    ResponderBorrar
  105. Como puse en el comentario anterior, estaré publicando una nota sobre el tema en breve.

    ResponderBorrar
  106. Buenas noches Jorge, sabes tengo un documento en el que utilice lo que enseñaste, pero necesito imprimir por ejemplo 50 hojas, y cuando le pongo que me imprima 2 copias, imprime el mismo numero en cada hoja, como puedo lograr que cada hoja incluya los números correlativamente.

    ResponderBorrar
  107. Bien, según la real Academia Española copia es "Reproducción literal de un escrito o de una partitura", siendo "literal" tal como es el original. Esto incluye el número de factura. ¿O tal vez no entendí la consulta?

    ResponderBorrar
  108. En los próximos días estaré publicando una nota con una nueva versión de la factura, que incluye tambi´en una base de datos.

    ResponderBorrar
  109. que tal tengo un problema con el codigo al momento de mandar a imprimir se imprime doble pense que algo habia hecho mal pero me descarge el ejemplo de factura y hace exactamente lo mismo podria ayudarme a resolverlo o ay manera de que en vez de que mande a imprimir se solo como guardar se cambie el numero de folio?

    Private Sub Workbook_BeforePrint(Cancel As Boolean)
    Dim Mensaje, Resp
    Dim dlgPrint As Boolean

    Mensaje = "El total es " & [F42] 'Total
    Mensaje = Mensaje & " Imprimir?"
    Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)

    On Error GoTo errNoPrint

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

    Application.EnableEvents = True


    Exit Sub

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

    ResponderBorrar
  110. En los próximos días estaré publicando un nuevo modelo que resuelve ese problema.

    ResponderBorrar
  111. Jorge:

    Quisiera adjuntarte un archivo para que me orientes con lo siguiente, a partir de la hoja carga, copiando 26 flas se arma una factura, la cual debe ser impresa y a partir de ahí sabiendo que siempre son 26 filas debe copiar los datos e imprimir hasta que no haya más datos, podrías ayudarme? , podrías indicarme donde enviarte el archivo?

    Desde ya muchas gracias

    ResponderBorrar
  112. Fijate en el enlace Ayuda, en la parte superior de la plantilla del blog.

    ResponderBorrar
  113. Hola Jorge, muchísimas gracias por el tutorial, me van a quedar unas facturas magnificas. Pero tengo una cuestión. Tengo la plantilla de Excel para tener siempre el mismo modelo de factura, tengo el botón para aumentar el numero de la factura PERO cuando cierro la plantilla y la vuelo a abrir, el numero vuelve a ser el primero, no el ultimo. ¿Qué hago? por favor, sé mi spiderman y ayúdame!! muchísimas gracias!!

    ResponderBorrar
  114. Como vengo prometiendo hace un tiempo, en breve estaré publiocando un nuevo modelo. En cuanto a tu consulta, ¿estás usando el modelo publicado en esta página o solamente la plantilla de la factura? En todo caso, después de crear la factura, debes guardar el archivo.

    ResponderBorrar
  115. Hola Jorge:

    No se si es posible, pero tengo una plantilla de excel con una hoja (pestaña) por cliente (supongamos 10) y quisiera que el nº de factura de cada cliente aumentara en uno pero teniendo en cuenta que no se puede repetir el mismo nº en ninguna factura, ¿Es posible?.

    Muchas gracias y enhorabuena, muy buen aporte

    ResponderBorrar
  116. Es poosible, pero no me parece una buena idea manejar una hoja para cada cliente. ¿Que pasará cuando tengas 1000 clientes? Tendrías que manejar una única base de datos (en una hija) para todas las facturas con un campo que identifique el cliente.

    ResponderBorrar
  117. Supongo que tienes razón, auque si tubiera 1000 clientes buscaría un programa más elaborado.
    Ahora mismo estamos empezando a crecer y esto es solo para salir del paso.
    Gracias

    ResponderBorrar
  118. En los próximos días publicaré un post con un modelo que funciona de acuerdo a los principios que describí en mi comentario. Creo que te será útil.

    ResponderBorrar
  119. Hola buenas noches gracias por tu ayuda todo funciona perfecto pero cuando cierro el Excel no me guarda la macro que estaré haciendo mal si todo funciona ok

    ResponderBorrar
  120. Tendrías que describir qué es lo que estás haciendo. Es decir, después de producir la factura, ¿guardas el cuaderno?

    ResponderBorrar
  121. HOLA QUISIERA SABER COMO LE HAGO PARA QUE ME GUARDE MIS FACTURAS AUTOMATICAMENTE EN UNA SOLA CARPETA

    ResponderBorrar
  122. HOLA AMIGO GRACIAS POR EL APORTE ME FUNCIONO BIEN PERO SOLO TIENE UN DETALLE Y ES QUE SALEN DOS COPIAS AL IMPRIMIRLO Y NO SE COMO SOLUCIONARLO. GRACIAS DE ANTEMANO

    ResponderBorrar
  123. Fijate en el comentario de Hernàn Agudelo del 28/12/2012

    ResponderBorrar
  124. Hola Jorge. Me sirvió mucho tu código. Muchas Gracias

    ResponderBorrar
  125. Excelente información Maestro, de vital ayuda; hay una macro llamada GEFEX que tambien esta muy padre, solo que no la he podido instalar. Pero con esta información y más con el workbook ;) muchas gracias Maestro por sus publicaciones. Saludos desde Querétaro.

    ResponderBorrar
  126. Jorge buenas tardes tengo una factura en excel y deso quye pueda tener los numeros correlativos en forma automatica cada vez que abro lapagina y ue pueda grabar la informacion y poder volver a usarla
    Muchas gracias por tu ayuda

    ResponderBorrar
  127. Puedes usar el modelo que publico en esta nota o usar este modelo.

    ResponderBorrar
  128. Amigo buenas tardes, te comento que al día de hoy aún tengo el mismo problema del siguiente usuario:

    El post me ha sido muy útil, desearía hacer un comentario en referencia al mismo, ya que observo lo siguiente si estoy diligenciando el consecutivo #100 al momento de generar la impresión, lo hace con el #101, lo cual no es consecuente, ya que debería imprimirme la factura con el #100 y pasar al #101. Agradezco sus comentarios y que ajustes se deben hacer a la macro para corregir esta situación.

    Mi pregunta es si ya habrás corregido el inconveniente?

    De antemano muchas gracias, :)

    ResponderBorrar
  129. Fijate en el modelo mejorado (el enlace aparece al principio de esta nota).

    ResponderBorrar