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.
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).
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.
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
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
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,
Abrimos la lista desplegable de la ventanilla donde aparece General y elegimos Workbook
Abrimos la ventanilla contigua para ver qué eventos están a nuestra disposición
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
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: MS Excel
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.
ResponderBorrarGenial su blog y lo mejor en español
ojala podamos chekiar mas macros de eventos aca.
Saludos.
Muy claro Jorge, gracias por seguir compartiendo tus habilidades en la materia.
ResponderBorrarDaniel
ResponderBorrarpuedes mandarme tu cuaderno para que le de un vistazo.
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.
ResponderBorrarHola,
ResponderBorrartendrías que mandarme el archivo para que me de un aidea de lo que quieres hacer.
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
ResponderBorrarHola,
ResponderBorrartoda 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.
Le estoy muy agradecido, y espero que su fuerza de voluntad de realizar este blog da mas que sus frutos,
ResponderBorrarEs genial
el archivo funciona pero no imprime
ResponderBorrarMilton,
ResponderBorrarel 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.
Hola, no habra algun codigo para regresar el numerador a cero si otra celda cambia? haber si me pueden ayudar con eso :)
ResponderBorrarPor supuesto, de la misma manera creas un evento que cuando la celda determinada cambia el valor del contador vuelve a cero.
ResponderBorrarHola 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!
ResponderBorrarEl 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?
ResponderBorrarElías,
ResponderBorrarmandame el archivo por mail privado.
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
ResponderBorrarHéctor,
ResponderBorrarfijate 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.
Excelete publicación voy a intentarlo ya que necesito hacer lo mismo
ResponderBorrarSaludos 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.
ResponderBorrarNo 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.
ResponderBorrarhola jorge segui los pasos y logre mi numerador automatico gracias.
ResponderBorrarahora quiero preguntarte como hacer para tener el numerador automatico consecutivo en varios formatos de factura. si pudieras ayudarme te lo agredeceria mucho.
Te sugiero que me envies la conslta por mail privado, con un ejemplo de lo que quieres hacer.
ResponderBorrarmaestro como puedo hacer que me de subtotal, iva y total me ayudaria mucho gracias
ResponderBorrarJorge
ResponderBorrardesgaras 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?
Jorge, cómo va?
ResponderBorrarNo 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!
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?
ResponderBorrarHOLA 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..
ResponderBorrarATTE: PABLO
Pablo,
ResponderBorrarasegurate 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.
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
ResponderBorrarATTE: PABLO
Pablo,
ResponderBorrarhay 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?
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.
ResponderBorrarATT
Jorge Solares
Jorge, asegurate de poner el código del evento en el módulo de la hoja que contiene la factura.
ResponderBorrarBuenas 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
ResponderBorrarPrivate 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
Buenas tardes me podrian ayudar no puedo imprimir y se me cambia el consecutivo cuando cancelo.
ResponderBorrarPrivate 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
Acabo de actualizar eel código para cubrir también la posibilidad que el usuario apriete el botón de cancelar la impresión.
ResponderBorrarTambién he reemplazado el archivo para descargar.
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?
ResponderBorrarpor que puede ser? baje el archivo de prueba y tampoco funciona ahora
Nicolás,
ResponderBorraren los próximos días estaré publicando una revisión de la nota.
Muy buen aporte Jorge.
ResponderBorrarSolo una consulta, al imprimir me tira dos copias, como hago para que solo imprima una sola copia del documento.
Gracias.
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".
ResponderBorrarBuenas! 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?
ResponderBorrarMuchas gracias de antemano. Tienes un blog maravilloso!!
Al guardar la factura, tienes que borrar o desactivar el evento que dispara el contador de la factura.
ResponderBorrarQue tal, buen aporte.
ResponderBorrarLa 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
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.
ResponderBorrarHola, 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.
ResponderBorrarEn los próximos días revisaré el código en el versión 2007.
ResponderBorrarSaludos Sr. Jorge,
ResponderBorrarAntes 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!
Revisaré el código y publicaré la versión corregida.
ResponderBorrarHola 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.
ResponderBorrarSin 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é
¿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.
ResponderBorrarUna ventaja adicional sería que podrías analizar las ventas por fecha, cliente, artículo, etc.
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
ResponderBorrarEstoy pensando en construir el modelo y ofrecerlo a través del blog. Veremos...
ResponderBorrarEstupendo. Muchísimas gracias Jorge. Saludos, Jose
ResponderBorrarJorge 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?
ResponderBorrarPodés porbar usar Range("F3") en lugar de [F3], aunque no creo que ese sea el problema.
ResponderBorrarJorge al igual que el otro compañero a mi también.
ResponderBorrarme 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
José, volveré a revisar el código.
ResponderBorrarHola, muy bueno tu blog.
ResponderBorrarSeria 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?
Se supone que el numerador se incrementa con cada nueva factura.
ResponderBorrarHola Jorge
ResponderBorrarTu 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
Buenísimo el aporte, me auxilie un poco de la ayuda de excel para poder completar el archivo y me funciona de maravilla.
ResponderBorrarbuenas 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.
ResponderBorrarquien 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.
ResponderBorrarAlejandro,
ResponderBorrarhe tocado el tema en forma indirecta en algunos de los posts. Espero publicar en breve una nota con un modelo que contempla tu consulta.
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???
ResponderBorrarBien, 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,
ResponderBorrarPrivate 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
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.
ResponderBorrarLeonardo Villa
Hola Leonardo,
ResponderBorrargracias por los comentarios. Estoy preparando una versión nueva y corregida que espero publicar en los próximos días.
AMIGO TU EJEMPLO ME QUEDO MUY BIEN DE ANTEMANO MUCHAS GRACIAS Y TE AGRADEZCO LO QUE HACES POR LOS QUE NO SABEMOS.
ResponderBorrarHola, Jorge. Felicidades por tu Blog es mucha información vital.
ResponderBorrarLo 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
Manuel, gracias por los conceptos. Como puse en el comentario anterior, estoy preparando una nueva versión que incluirá todos los pedidos y sugerencias.
ResponderBorrarHola 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
ResponderBorrarHay muchas formas de hacerlo. La más elemental, si no se trata de muchos proveedores, es usando BUSCARV.
ResponderBorrarJorge, 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
ResponderBorrarEl 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.
ResponderBorrarMientras tanto puedes mandarme tu archivo para que vea donde pueda estar el problema.
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..??
ResponderBorrarHola,
ResponderBorrarcreo 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.
Muy buenas noches Jorge!, me viene resultando muy buena tu informacion para ir entendiendo como armar las macros.
ResponderBorrarTe 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
Buenas tardes,
ResponderBorrar¿Cómo sería el código para hacerlo única y exclusivamente en la "Hoja 1"?
Gracias y saludos!!
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.
ResponderBorrarEstoy 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.
ResponderBorrarBuenos días,
ResponderBorrarMe 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?
Buenas Tarde Jorge,
ResponderBorrartu 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
Bien, la idea es que hay una hoja con la plantilla de la factura. ¿Que hay en las otras hojas?
ResponderBorrarSuponiendo 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).
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.
ResponderBorrartengo 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. :-)
ResponderBorrarTodo 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.
ResponderBorrarEn el futuro estaré publicando una nota sobre el tema.
muchas gracias señor jorge me sirvio muchisimo tu informacion de como realizar un macro :)
ResponderBorrarGracias por tus aportaciones JLD.
ResponderBorrarTengo 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?
Hola Dino,
ResponderBorrar¿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.
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
ResponderBorrarNatalie,
ResponderBorraren 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.
Hola Jorge
ResponderBorrarBuen 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
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í
ResponderBorrarSheet(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")
Gracias Maestro, eres un genio
ResponderBorrarLogré hacerlo como me lo indicas
Sale perfecto
Gracias, muchas gracias de nuevo
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?
ResponderBorrarHola 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?
ResponderBorrarGracias una vez mas por tus escritos.
Onix
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
ResponderBorrarSi, 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.
ResponderBorrarHe 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.
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.
ResponderBorrarNo 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.
ResponderBorrarBuen 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
ResponderBorrarHola 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.
ResponderBorrarEstaré publicando una nota sobre el tema en los próximos días.
buenos días me imprime dos veces que hago... por fa<vor ayuda
ResponderBorrartengo 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
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..
ResponderBorrarDe antemano le agradezco mucho por su post me sirvió muchísimo,..... buen aporte para nosotros que estamos aprendiendo
Como puse en el comentario anterior, estaré publicando una nota sobre el tema en breve.
ResponderBorrarBuenas 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.
ResponderBorrarBien, 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?
ResponderBorrarEn 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.
ResponderBorrarque 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?
ResponderBorrarPrivate 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
En los próximos días estaré publicando un nuevo modelo que resuelve ese problema.
ResponderBorrarJorge:
ResponderBorrarQuisiera 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
Fijate en el enlace Ayuda, en la parte superior de la plantilla del blog.
ResponderBorrarHola 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!!
ResponderBorrarComo 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.
ResponderBorrarHola Jorge:
ResponderBorrarNo 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
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.
ResponderBorrarSupongo que tienes razón, auque si tubiera 1000 clientes buscaría un programa más elaborado.
ResponderBorrarAhora mismo estamos empezando a crecer y esto es solo para salir del paso.
Gracias
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.
ResponderBorrarHola 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
ResponderBorrarTendrías que describir qué es lo que estás haciendo. Es decir, después de producir la factura, ¿guardas el cuaderno?
ResponderBorrarHOLA QUISIERA SABER COMO LE HAGO PARA QUE ME GUARDE MIS FACTURAS AUTOMATICAMENTE EN UNA SOLA CARPETA
ResponderBorrarFijate en esta nota.
ResponderBorrarHOLA 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
ResponderBorrarFijate en el comentario de Hernàn Agudelo del 28/12/2012
ResponderBorrarHola Jorge. Me sirvió mucho tu código. Muchas Gracias
ResponderBorrarExcelente 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.
ResponderBorrarJorge 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
ResponderBorrarMuchas gracias por tu ayuda
Puedes usar el modelo que publico en esta nota o usar este modelo.
ResponderBorrarAmigo buenas tardes, te comento que al día de hoy aún tengo el mismo problema del siguiente usuario:
ResponderBorrarEl 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, :)
Fijate en el modelo mejorado (el enlace aparece al principio de esta nota).
ResponderBorrar