Numerador automático para facturas o recibos en Excel

jueves, enero 17, 2008

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.

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í).

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 Total As Double


Total = WorksheetFunction.Sum(Range("C18:C34"))


Mensaje = "El total es " & Total
Mensaje = Mensaje & " Imprimir?"
Resp = MsgBox(Mensaje, vbQuestion + vbYesNo)
If vbNo Then
Cancel = True
Exit Sub
End If


[C35] = Total


[C5] = [C5] + 1


End Sub

Actualización (30-01-12): el código anterior no toma en cuenta la posibilidad que el usuario apriete el botón Cancelar del diálogo de impresión de Excel. Esto ha sido corregido en este 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.

16-02-2008:El archivo del ejemplo contenía un error y ha sido reemplzado



Technorati Tags:

108 comments:

Daniel,  18 enero, 2008 01:30  

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.

Federico /Arg),  18 enero, 2008 01:52  

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

Jorge L. Dunkelman 18 enero, 2008 14:48  

Daniel

puedes mandarme tu cuaderno para que le de un vistazo.

Anónimo,  23 enero, 2008 16:34  

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.

Jorge L. Dunkelman 23 enero, 2008 17:51  

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

JD 28 noviembre, 2009 12:35  

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

Jorge L. Dunkelman 28 noviembre, 2009 20:37  

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.

Anónimo,  05 abril, 2010 22:48  

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

millton cuervo 06 octubre, 2010 15:49  

el archivo funciona pero no imprime

Jorge L. Dunkelman 06 octubre, 2010 18:02  

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.

Anónimo,  20 octubre, 2010 19:30  

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

Jorge L. Dunkelman 20 octubre, 2010 21:40  

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

Anónimo,  21 octubre, 2010 19:28  

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!

Anónimo,  21 octubre, 2010 20:27  

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?

Jorge L. Dunkelman 21 octubre, 2010 23:13  

Elías,
mandame el archivo por mail privado.

hector,  22 octubre, 2010 01:08  

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

Jorge L. Dunkelman 22 octubre, 2010 07:05  

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.

Anónimo,  31 octubre, 2010 01:21  

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

Anónimo,  30 agosto, 2011 15:35  

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.

Jorge L. Dunkelman 02 septiembre, 2011 22:58  

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.

Anónimo,  17 noviembre, 2011 00:02  

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.

Jorge L. Dunkelman 17 noviembre, 2011 16:23  

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

JORGE ARTURO 03 enero, 2012 04:52  

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

Jorge L. Dunkelman 03 enero, 2012 07:00  

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?

Anónimo,  05 enero, 2012 22:51  

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!

Jorge L. Dunkelman 06 enero, 2012 07:40  

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?

Anónimo,  16 enero, 2012 17:53  

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

Jorge L. Dunkelman 16 enero, 2012 19:43  

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.

Anónimo,  16 enero, 2012 23:30  

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

Jorge L. Dunkelman 17 enero, 2012 07:20  

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?

josolceb 26 enero, 2012 23:00  

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

Jorge L. Dunkelman 27 enero, 2012 10:07  

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

Anónimo,  30 enero, 2012 05:36  

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

Zedreks 30 enero, 2012 06:26  

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

Jorge L. Dunkelman 30 enero, 2012 10:48  

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.

nicolas,  21 marzo, 2012 19:43  

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

Jorge L. Dunkelman 23 marzo, 2012 19:19  

Nicolás,

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

LeoBO,  24 abril, 2012 23:40  

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.

Jorge L. Dunkelman 25 abril, 2012 07:07  

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".

Anónimo,  24 mayo, 2012 10:43  

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!!

Jorge L. Dunkelman 26 mayo, 2012 11:48  

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

Dorozco Navarro 14 junio, 2012 22:18  

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

Jorge L. Dunkelman 17 junio, 2012 15:10  

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.

Anónimo,  28 junio, 2012 03:55  

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.

Jorge L. Dunkelman 01 julio, 2012 06:52  

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

Jorge Andrés Rojas Hernández 14 julio, 2012 00:54  

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!

Jorge L. Dunkelman 15 julio, 2012 19:04  

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

Redactor 17 julio, 2012 21:55  

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é

Jorge L. Dunkelman 18 julio, 2012 18:35  

¿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.

Redactor 18 julio, 2012 23:29  

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

Jorge L. Dunkelman 19 julio, 2012 00:03  

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

Redactor 20 julio, 2012 20:50  

Estupendo. Muchísimas gracias Jorge. Saludos, Jose

Anónimo,  09 agosto, 2012 23:24  

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?

Jorge L. Dunkelman 18 agosto, 2012 12:12  

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

jose Gavanzo 22 agosto, 2012 06:50  

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

Jorge L. Dunkelman 23 agosto, 2012 14:59  

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

F.Osu,  24 septiembre, 2012 14:12  

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?

Jorge L. Dunkelman 25 septiembre, 2012 13:53  

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

HERNAN AGUDELO 28 diciembre, 2012 17:36  

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

Javier Rodríguez 06 enero, 2013 02:22  

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

mayiwapa 15 enero, 2013 11:02  

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.

alejandro garza 01 febrero, 2013 19:11  

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.

Jorge L. Dunkelman 04 febrero, 2013 19:49  

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.

Anónimo,  07 febrero, 2013 20:13  

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???

Jorge L. Dunkelman 09 febrero, 2013 17:40  

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

Leonardo Fabio Villa Alvarez 20 febrero, 2013 05:17  

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

Jorge L. Dunkelman 20 febrero, 2013 13:42  

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

Jorge Grimaldo 23 febrero, 2013 15:58  

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

M.M 23 febrero, 2013 17:20  

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

Jorge L. Dunkelman 23 febrero, 2013 20:37  

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

Yuli pabon hernandez 08 marzo, 2013 23:14  

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

Jorge L. Dunkelman 10 marzo, 2013 20:58  

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

Anónimo,  16 abril, 2013 21:17  

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

Jorge Dunkelman 17 abril, 2013 16:30  

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.

Darwin Baez 15 mayo, 2013 20:43  

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..??

Jorge Dunkelman 16 mayo, 2013 07:08  

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.

Unknown 29 mayo, 2013 05:54  

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

Anónimo,  29 mayo, 2013 21:53  

Buenas tardes,

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

Gracias y saludos!!

Jorge Dunkelman 30 mayo, 2013 08:23  

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.

Jorge Dunkelman 30 mayo, 2013 08:35  

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.

Josep M.Martinez 23 julio, 2013 11:09  

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?

Anónimo,  24 julio, 2013 19:32  

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

Jorge Dunkelman 25 julio, 2013 07:21  

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).

Jorge Dunkelman 25 julio, 2013 07:28  

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.

jagg1973 27 julio, 2013 14:21  

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. :-)

Jorge Dunkelman 27 julio, 2013 20:26  

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.

camila 09 septiembre, 2013 04:45  

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

Dino Giménez 20 septiembre, 2013 13:59  

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?

Jorge Dunkelman 20 septiembre, 2013 17:55  

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.

Natalie Guillen 30 septiembre, 2013 18:05  

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

Jorge Dunkelman 01 octubre, 2013 06:54  

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.

Mario Renzetti,  04 octubre, 2013 16:37  

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

Jorge Dunkelman 04 octubre, 2013 21:15  

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")

Mario Renzetti,  09 octubre, 2013 15:06  

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

Onix,  22 octubre, 2013 14:09  

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?

Anónimo,  22 octubre, 2013 14:37  

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

Anónimo,  31 enero, 2014 03:08  

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

Jorge Dunkelman 31 enero, 2014 10:19  

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.

Anónimo,  31 enero, 2014 11:03  

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.

Jorge Dunkelman 31 enero, 2014 15:20  

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.

Alcides Gonzalez 16 febrero, 2014 19:24  

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

Jorge Dunkelman 23 febrero, 2014 15:20  

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.

yina riveros,  25 febrero, 2014 16:22  

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

yina riveros,  26 febrero, 2014 18:07  

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

Jorge Dunkelman 27 febrero, 2014 07:59  

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

^-^ 07 marzo, 2014 02:53  

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.

Jorge Dunkelman 07 marzo, 2014 12:08  

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?

Jorge Dunkelman 09 marzo, 2014 19:19  

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.

Publicar un comentario

Seguidores

Google+ Followers

Google+ Badge

Términos Legales

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP