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