factura en excel con visual 2
DESCRIPTION
Factura en Excel Con Visual 2TRANSCRIPT
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 1
EJERCICO PASO A PASO DE VISUAL EN EXCEL
Consideraciones - el código VBA es el mismo de Visual Basic 6, por lo que debe
funcionar también en versiones anteriores a Excel 2010.
. Se podría escribir un código bastante robusto y optimo pero eso incrementaría
las líneas al triple y podría causar confusión a los lectores novatos en
programación.
FORMATEANDO LAS HOJAS
bueno, primero abra Excel y de inmediato guarde el libro como factura.xls o
factura xlsm.
en excel 2010 debes guardarlo como libro con ejecución de macros ( xlsm )
ahora, el libro nos crea automáticamente 3 hojas. vamos a cambiarles el nombre
como sigue:
hoja1 = clientes
hoja2 = productos
hoja3 = facturas
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 2
bien, ahora inserte una hoja más y le pone el nombre de impresión
- lo siguiente son los encabezados.
en la hoja clientes vamos a escribir lo siguiente en las celdas siguientes:
A1 = razon, B1 = rfc, C1 = direccion
ingresar unos cuantos datos
la hoja productos
A1 = clave, B1 = descripcion, C1 = precio
ingresar unos cuantos datos
la hoja facturas
A1 = factura, B1 = fecha, C1 = razon, D1 = descripcion, E1 = precio, F1 =
cantidad, G1 = total
- ahora va la hoja de la impresión.
Aquí debera hacer una réplica de su factura de papel en la hoja de excel, pero
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 3
solo vamos a tomar en cuenta los lugares que hay que llenar, ya que en el papel
están marcados las líneas. En pocas palabras, excel solo va a imprimir lo que
debería escribir a mano.
Por ejemplo, supongamos que nuestra factura de papel en blanco es la siguiente:
AJUSTANDO LA HOJA DE IMPRESION
En Excel vamos a hacer una plantilla idéntica a la factura, la llenamos con datos
ficticios y luego la imprimimos en una hoja reciclada (no en la hoja de la factura).
Luego transparentamos la hoja reciclada con la factura y checamos que los
espacios que llenamos están en el lugar correcto que corresponde al papel de la
factura.
Este paso hay que repetirlo hasta que, cuando transpongamos la hoja reciclada
con la factura original, los lugares queden perfectamente alineados.
Finalmente, para comprobar que la plantilla de Excel corresponde al papel de tu
factura, sácale una copia fotostática a su factura e imprime la plantilla de Excel en
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 4
la copia. Si todo corresponde, entonces podemos pasar al siguiente paso.
Guarde el archivo para que no pierda los cambios, (murphy dice que windows solo
falla cuando se tiene algo sin guardar en pantalla)
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 5
DISEÑO DE LOS FORMULARIOS
Pulsa ALT + F11 y se abre la ventana de VBA.
Los formularios a crear son:
- Captura de clientes
- Captura de productos
- Impresión de factura
- Catálogo de productos
- Catálogo de clientes
- Menú
Sin embargo, la captura de datos simples ya se explicó en el taller anterior, por lo
que la captura de clientes y de productos la vamos a omitir para centrarnos en la
impresión de la factura.
La creación de los formularios omitidos los debe hacer por su cuenta.
La manera de cambiar las propiedades también esta explicado con anterioridad,
también vamos a omitir esa explicación.
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 6
La creación de formularios e inserción de controles también será omitida..
Los prefijos que vamos a usar para los controles son:
lbl = etiqueta o label
txt = cuadro de texto o textbox
cmb = cuadro combinado o combobox
lst = cuadro de lista o listview
grb = marco o frame (grb de groupbox, )
chk = casilla de verificacion o checkbox (el cuadrito que le pones o quitas una
palomita)
FACTURACION
- Agregue un nuevo formulario y le coloca el nombre de frmFacturacion y caption -
IMPRESION DE FACTURA
- Inserta los siguientes controles con los siguientes nombres/propiedades:
grbDatosCliente con caption = Datos del Cliente, width = 444 y height = 78 (Amplie
el form )
-----Dentro de grbDatosCliente vas a insertar 5 etiquetas y 5 cuadros de texto
-----lblRazon con caption = Razon
-----lblDireccion con caption = Direccion
-----lblRFC con caption = RFC
-----lblFecha con caption = Fecha
-----lblNoFactura con caption = No. Factura
-----txtRazon
-----txtDireccion
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 7
-----txtRFC
-----txtFecha
-----txtNoFactura
recuerde que a una etiqueta le corresponde a su lado un cuadro de texto con el
mismo nombre, por ejemplo, txtRazon va ubicado al lado derecho de lblRazon.
Acomode los espacios de manera que todo quede bien a la vista del usuario:
- Ahora inserte 4 cuadros de lista afuera y por debajo del grbDatos Cliente con los
siguientes atributos
lstCantidad con width = 54 y height = 162
lstDescripcion con width = 227.25 y height = 162
lstPrecio con width = 67.55 y height = 162
lstImporte con width = 77.25 y height = 162
en el orden de creación, ubíquelos a la misma altura uno junto de otro.
Además, inserte una etiqueta arriba de cada lista para que el usuario sepa que
contiene cada columna:
arriba de lstCantidad coloca una lblCantidad con caption Cantidad
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 8
Arriba de lst Descripcion pones un lblDescripcion con caption descripcion
y así con las otras dos listas restantes.
- Continuamos con la última parte de su diseño:
inserte tres cuadros de texto debajo inmediato de lstImporte con los siguientes
atributos:
txtSubtotal con width = 61.5 y enabled = false
txtIVA con width = 61.5 y enabled = false (estoy en México, se nota????)
txtTotal con width = 61.5 y enabled = false
(Cuando enabled es falso el control está bloqueado para su uso, cuando es true
se puede usar)
-A estos tres txt's ubiqueles sus etiquetas, ejemplo al txtSubtotal le ubica a su
izquierda un lblSubtotal con caption = Subtotal, y así con los tres txt's
- Además, inserte un txtLetras debajo del lstCantidad y estiras su tamaño hacia la
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME 9
derecha hasta llegar a la lblSubtotal y luego estiras hacia abajo hasta coincidir con
lblIVA. Le pone multiline = true, enabled = false. Este txt no lleva etiqueta.
-Agregar un botón de comando llamado cmdBuscar con caption = Buscar Cliente y
lo ubicamos en la parte de más abajo del formulario a la izquierda.
- Agregue un botón de comando llamado cmdProductos con caption = Productos y
ubíquelo a la derecha de cmdBuscar
- Agregue un botón de comando llamado cmdAceptar con caption = Aceptar y
ubíquelo a la derecha de cmdProductos
- Agregue una casilla de verificación o checkbox con nombre chkImprimir y caption
= Imprimir al aceptar y ubíquela a la derecha de cmdCancel este es el aspecto
final que debe tener el formulario:
PROGRAMANDO LOS EVENTOS
- Hacer doble click encima del form en alguna región donde no tenga ningún
control.
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
10
- Aparece la ventana de código. si se fija, en la parte de arriba del lado izquierdo
tiene el nombre de todos los controles que contiene el formulario, incluyendo el
propio formulario pero con el nombre de UserForm, y del lado derecho están los
eventos de los mismos. Entonces para programar un evento, escogemos en el
lado izquierdo el control y del lado derecho el evento a programar.
- Escoger el control UserForm (el formulario)
- Luego escoger el evento ACTIVATE
- VBA va a insertar el encabezado y final del evento activate. Las líneas de código
en ese espacio se van a ejecutar cuando el formulario se active.
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
11
Las líneas de abajo del evento click se pueden eliminar para no causar confusión.
Y luego, digite dentro del evento activate del formulario las siguientes líneas:
Private Sub UserForm_Activate()
Me.txtFecha.Text = Date
End Sub
A continuación pulse F5 y verifica que en el txtFecha se ha escrito la fecha
automáticamente.
Si hasta aquí todo va bien, continuamos con los eventos de los demás controles
como sigue:
control cmdAceptar, evento Click
Private Sub cmdAceptar_Click()
If MsgBox( “finalizar la captura de la factura?", vbQuestion + vbYesNo) = vbNo
Then Exit Sub
guardarFactura
MsgBox (chkImprimir.Value)
If Me.chkImprimir.Value = True Then ImprimirFactura
End Sub
Control cmdBuscar, evento Click
Private Sub cmdBuscar_Click()
frmBuscarCliente.Show ' mostrar el formulario de buscar clientes
End Sub
Control cmdProductos, evento Click
Private Sub cmdProductos_Click()
frmAgregarProducto.Show ' mostrar el formulario de agregar productos
End Sub
Control UserForm, evento activate
Private Sub UserForm_Activate()
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
12
Me.txtFecha.Text = Date ' para poner la fecha cuando se ejecute el form
End Sub
Al final de la ventana de código, se van a crear tres procedimientos que no están
ligados al evento de ningún control, y que pueden ser ejecutados cuando se
requiera, aun sin ejecutar ningún evento.
Public Sub sumarImporte() ' suma solo la última lista ( los importes)
Dim i As Integer
Dim dTotal As Double
dTotal = 0
For i = 0 To Me.lstImporte.ListCount - 1
dTotal = dTotal + Val(Me.lstImporte.List(i))
Next
Me.txtSubtotal.Text = dTotal
If dTotal > 0 Then ' aquí se hacen los cálculos para el subtotal, iva y total
Me.txtIVA.Text = Round((Val(Me.txtSubtotal.Text) / 100) * 16, 2)
Me.txtTotal.Text = Val(Me.txtSubtotal.Text) + Val(Me.txtIVA.Text)
End If
End Sub
Private Sub guardarFactura()
Dim i As Integer
Sheets( "facturas “ ).Activate ' activamos la hoja en la que vamos a trabajar
If Trim(Range( "A2" ).Value) = "" Then ' localizamos la celda en donde vamos a
empezar a insertar
Range( "A2" ).Activate
Else
Range( “ A1 “ ).End(xlDown)(xlDropDown).Activate
End If
ActiveCell.Value = Me.txtNoFactura.Text ' insertamos los datos
ActiveCell.Next.Value = Me.txtFecha.Text
ActiveCell.Next.Next.Value = Me.txtRazon.Text
For i = 0 To Me.lstCantidad.ListCount
ActiveCell.Next.Next.Next.Value = Me.lstDescripcion.List(i)
ActiveCell.Next.Next.Next.Next.Value = Me.lstPrecio.List(i)
ActiveCell.Next.Next.Next.Next.Next.Value = Me.lstCantidad.List(i)
ActiveCell.Next.Next.Next.Next.Next.Next.Value = Me.lstImporte.List(i)
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
13
Next
End Sub
Private Sub ImprimirFactura() ' esta hace lo mismo pero con la hoja de impresión
Dim i As Integer
Sheets( “IMPRESION” ).Activate
Range( "a1:h25" ).ClearContents ' limpiamos la hoja para la nueva impresión (esta
línea es necesaria)
Range( “g2” ).Value = Me.txtFecha.Text
Range( “C2” ).Value = Me.txtRazon.Text
Range( “C3” ).Value = Me.txtDireccion.Text
Range( “b8” ).Select
For i = 0 To Me.lstCantidad.ListCount - 1
ActiveCell.Value = Me.lstCantidad.List(i)
ActiveCell.Next.Value = Me.lstDescripcion.List(i)
ActiveCell.Next.Next.Value = Me.lstPrecio.List(i)
ActiveCell.Next.Next.Next.Next.Value = Me.lstPrecio.List(i)
ActiveCell.Next.Next.Next.Next.Next.Value = Me.lstImporte.List(i)
ActiveCell(xlDropDown).Activate
Next
Range( “g19” ).Value = Me.txtSubtotal.Text
Range( “g20” ).Value = Me.txtIVA.Text
Range( “g21” ).Value = Me.txtTotal.Text
Range( “b20” ).Value = Me.txtLetras.Text
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True,
IgnorePrintAreas:=False
End Sub
- Las capturas
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
14
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
15
Y eso es todo con respecto a la facturación.
CARGAR CLIENTES
- cierra el formulario frmFacturacion
- agrega otro formulario llamado frmBuscarCliente con caption = Buscar Cliente
- agregale los siguientes controles.
lblClientes con caption = Clientes
cmbClientes con style = 2 frmStyleDropDownList (lista para escoger items)
cmdAceptar con caption = Aceptar
Ubíquelos de la siguiente manera:
lblClientes en la parte más arriba, luego abajo el cmbClientes y abajo de este
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
16
coloque el cmdAceptar.
Los eventos:
control cmdClientes, evento Change
Private Sub cmbClientes_Change()
Cells.Find(What:=Me.cmbClientes.Text, After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
End Sub
Control cmdAceptar, evento Click
Private Sub cmdAceptar_Click()
With frmFacturacion
.txtRazon.Text = ActiveCell.Value
.txtRFC.Text = ActiveCell.Next.Value
.txtDireccion.Text = ActiveCell.Next.Next.Value
End With
Unload Me
End Sub
Control UserForm, evento Activate
Private Sub UserForm_Activate()
Dim sUltimaCelda As String
Me.cmbClientes.Clear
Sheets( “CLIENTEs” ).Activate
If Trim(Range( “A2” ).Value) = "" Then Exit Sub
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
17
If Trim(Range( “A3” ).Value) = "" Then
Me.cmbClientes.AddItem (Range( “A2” ).Value)
Exit Sub
End If
sUltimaCelda = Range( “A1” ).End(xlDown).Address
For Each f In Range( “A2:" & sUltimaCelda).Cells
Me.cmbClientes.AddItem (f.Value)
Next
End Sub
Asi se debe ver en la ventana de codigo
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
18
Ya se pueden cargar a los clientes en la factura.
AGREGAR PRODUCTOS a la factura es similar a cargar los clientes, solo que
vamos a llenar las listas.
- Cierre los formularios abiertos
- Agregue un nuevo formulario llamado frmAgregarProducto y le coloca caption =
Agregar Productos
- insertale los siguientes controles:
cmbClave con style = 2 frmStyleDropDownList
txtDescripcion con enabled = false
txtPrecio con enabled = false
txtCantidad
cmdAgregar con caption = Agregar
A los txt's y al cmb les ubica los respectivos lbl's , se puede observar el diseño:
Código de los eventos:
Private Sub cmbClave_Change()
If Me.cmbClave.Value = "" Then Exit Sub
Dim sUltimaCelda As String
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
19
Me.txtDescripcion.Text = ""
Me.txtPrecio.Text = ""
If Me.cmbClave.ListCount > 1 Then
sUltimaCelda = Range( “A1” ).End(xlDown).Address
Else
sUltimaCelda = "A2"
End If
Range( “A2:" & sUltimaCelda).Select
Selection.Find(What:=Trim(Me.cmbClave.Text), After:=ActiveCell,
LookIn:=xlValues _
, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Activate
With Me
.txtDescripcion.Text = ActiveCell.Next.Value
.txtPrecio.Text = ActiveCell.Next.Next.Value
End With
End Sub
Private Sub cmdAgregar_Click()
If Trim(Me.txtCantidad.Text) = "" Then MsgBox ( “ ingresar la cantidad!!” ): Exit Sub
If Me.txtDescripcion.Text = "" Then MsgBox ( “ elegir un producto!!” ): Exit Sub
With frmFacturacion
.lstCantidad.AddItem (Me.txtCantidad.Text)
.lstDescripcion.AddItem (Me.txtDescripcion.Text)
.lstPrecio.AddItem (Me.txtPrecio.Text)
.lstImporte.AddItem (Str(Val(Me.txtCantidad.Text) * Val(Me.txtPrecio.Text)))
End With
frmFacturacion.sumarImporte
Me.txtDescripcion.Text = ""
Me.txtPrecio.Text = ""
Me.txtCantidad.Text = ""
Me.cmbClave.ListIndex = -1
Me.cmbClave.SetFocus
End Sub
Private Sub txtCantidad_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
' esto es para que el textbox solo acepte números
If KeyAscii < 48 Or KeyAscii > 57 Then
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
20
KeyAscii = 0
End If
End Sub
Private Sub UserForm_Activate()
Dim sUltimaCelda As String
Me.cmbClave.Clear
Sheets( “PRODUCTOS" ).Activate
If Trim(Range( “A2” ).Value) = "" Then Exit Sub
If Trim(Range( “A3” ).Value) = "" Then
Me.cmbClave.AddItem (Range( “A2” ).Value)
Exit Sub
End If
sUltimaCelda = Range( “A1” ).End(xlDown).Address
For Each f In Range( “A2:" & sUltimaCelda).Cells
Me.cmbClave.AddItem (f.Value)
Next
End Sub
- Aquí están las capturas para que vean la identación (tabulación)
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
21
- EL MENU es para finalizar el ejemplo:
TALLER DE FORMULARIOS EN EXCEL
FABIO G GARCIA R. – CME
22
-Inserta un form con nombre frmMenu y caption = Menu
-Inserte tres botones
cmdFacturar con caption = Facturar
cmdCapturaCliente con caption = Agregar Cliente
cmdCapturaProducto con caption = Agregar Producto
- ubíquelos en el orden de creación uno al lado de otro, se visualiza:
- En el evento Click del control cmdFacturar digite:
Private Sub cmdFacturar_Click()
frmFacturacion.Show
End Sub