Punto de Venta en Excel – Facturar y Mostrar Imagen del Articulo
Este ejemplo es una parte del que hemos denominado Punto de Ventas en Excel, en este post se muestra como facturar un articulo y mostrar la imagen del producto, al seleccionar el articulo se muestra la imagen o foto del producto en el formulario.
Aprende a operar Excel en forma fácil y rápido, hazlo en forma fácil y sencilla, click acá, si quieres aprender sobre Excel en inglés, entonces debes hacer click here. Si lo que necesitas es aprender o profundizar sobre la programación de macros con VBA este es unos de los mejores cursos on line que he visto en internet, te lo recomiendo no te arrepentirás.
Mira la macro en acción, una explicación más detallada de su codificación y funcionamiento, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestro canal de You Tube, mira el playlist con vídeos relacionados donde podrás ver la macros relacionadas en acción con una explicación en forma visual que ayudará a entender el ejemplo en forma más fácil.
PUNTO DE VENTA COMO SELECCIONAR ARTÍCULOS Y MOSTRAR IMAGEN
Para mostrar el formulario para facturar en el ejemplo punto de venta, se debe presionar el botón que tiene como icono un carro de compras color verde, se muestra un formulario con tres pestañas debiendo seleccionar la pestaña de facturación, el código se ingresa en el textbox que dice «Ingrese código de producto».
La macro al ingresar el código del articulo, procede a buscarlo en la base de datos que esta en Access, una vez encontrado el código procede a cargar en el Listbox los datos relacionados con el registro.
En forma predeterminada siempre factura una unidad, procediendo a realizar el cálculo de la cantidad por el precio para obtener el total del producto y colocarlo en la columna correspondiente del listbox.
Para facturar más de una unidad se debe presionar el botón que se encuentra al lado del Textbox donde se ingresan los códigos, se muestra un pequeño formulario con un Textbox donde se debe ingresar la cantidad a facturar al cerrar el formulario guarda automáticamente el dato en un Label que está en el mismo formulario, pero no visible, la macro detecta que existe un dato en ese Label y factura la cantidad que figura en él en vez de uno que es la cantidad a facturar por defecto.
Al cargar en el Listbox los registros relacionados del código ingresado también se procede a cargar la imagen del producto.
Al recorrer los items o elementos del listbox ya sea haciendo click o con las fechas del teclado, en forma automática se va mostrando la imagen asociada al producto seleccionado, en el control de imagen que está en el formulario.
En los textbox destinado a ello se muestra el subtotal, descuento, impuesto y el total de la factura.
Explicación del código que muestra imagen del articulo facturado
Cuando se ingresa el código se procede a buscar en la base de datos de Access el código ingresado una vez encontrado recupera los datos relacionados, para ello se debe crear una conexión a la base de datos de Access.
Previo a iniciar la búsqueda la macro valida que se haya ingresado por lo menos tres caracteres en el textbox y recién inicia la búsqueda de datos en access, se usa el siguiente código:
If Len(UserForm1.TextBox14) > 2 Then
La conexión a Access con el siguiente código, previo se crea el objeto conexión «cn» y el objeto «rs» que contendrá los datos encontrados en la búsqueda.
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & ThisWorkbook.Path & «\1000 DBTSPuntoVenta.accdb;»
Se crea la SQL o string de consulta, en este caso se puede leer: «Selecciones los camos indicados de la hoja artículos cuando el campo «Cod_Arti» se igual a lo ingresado en el userform destinado a ingresar los códigos de los productos:
sql = «SELECT Cod_Arti,Detalle_Arti,Marca_Arti,PUV_Arti,Imagen_Arti FROM DB_Articulos WHERE Cod_Arti = ‘» & UserForm1.TextBox14 & «‘»
Se ejecuta la SQL guardando los datos en memoria en el objeto Recorset, que llamamos «rs».
Set rs = cn.Execute(sql)
Se limpia el Listbox2, se establece la cantidad de columnas del Listbox y el ancho de cada columna, con el siguiente código:
‘UserForm1.ListBox2.Clear
UserForm1.ListBox2.ColumnCount = 6
UserForm1.ListBox2.ColumnWidths = «70 pt;280 pt;110 pt;70 pt;70 pt; 110 pt»
Se agrega las cabeceras de las columnas del Lisbox2 de la siguiente manera:
‘Adiciona un item al listbox reservado para la cabecera
If UserForm1.ListBox2.ListCount <> 0 Then GoTo salta:
catireg = 0
UserForm1.ListBox2.AddItem
UserForm1.ListBox2.List(0, 0) = «Código»
UserForm1.ListBox2.List(0, 1) = «Articulo»
UserForm1.ListBox2.List(0, 2) = «Marca»
UserForm1.ListBox2.List(0, 3) = «Cantidad»
UserForm1.ListBox2.List(0, 4) = «PU»
UserForm1.ListBox2.List(0, 5) = «Total»
catireg = 1
salta:
Se determina si se ha ingresado una cantidad distinta a 1 para facturar, leyendo el valor del label destinado al ingreso de la cantidad a facturar, si tiene valor ese «Label21» se toma el numero ingresado sino se establece que la cantidad a facturar es 1.
Igualmente si no se ha determinado una cantidad distinta a 1, pero se quiere facturar dos o mas unidades solo bastará marcar el código las veces que se requiera y se obtiene el mismo resultado, pero con una mayor cantidad de registros; el código usado es el siguiente:
If UserForm1.Label21.Caption = Empty Then
QV = 1
Else
QV = UserForm1.Label21.Caption
UserForm1.Label21.Caption = Empty
End If
Con los siguientes códigos se cargan en el Listbox2 los registros relacionados con el código ingresado:
Do While Not rs.EOF
UserForm1.ListBox2.AddItem rs.Fields(0).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 1) = rs.Fields(1).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 2) = rs.Fields(2).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 3) = Format(QV, «#,##0.00;-#.##0,00»)
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 4) = Format((rs.Fields(3).Value), «#,##0.00;-#.##0,00»)
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 5) = Format((rs.Fields(3).Value * QV), «#,##0.00;-#.##0,00»)
mypat = rs.Fields(4).Value
Image1.Picture = LoadPicture(mypat)
rs.MoveNext
Loop
Por último se suma la columna del Listbox2 con el importe total, así:
For x = 1 To UserForm1.ListBox2.ListCount – 1
t = CDec(UserForm1.ListBox2.List(x, 5))
tot = tot + t
t = 0
Next x
Se carga en los Textbox destinados el subtotal, descuento, impuesto y total de los artículos facturados, con el siguiente código, en pos posteriores se explayará sobre estos cálculos y formatos dados a los Textbox.
subtototal = tot
Desc = CDec(UserForm1.TextBox28)
If IsNull(Desc) Or Desc = Empty Then Desc = 0
Impu = (subtototal – Desc) * 0.16
Total = subtototal – Desc + Impu
UserForm1.TextBox27 = Format(subtototal, «#,##0.00;-#.##0,00»)
UserForm1.TextBox28 = Format(Desc, «#,##0.00;-#.##0,00»)
UserForm1.TextBox29 = Format(Impu, «#,##0.00;-#.##0,00»)
UserForm1.TextBox30 = Format(Total, » «»€»» #,##0.00 «)
Hasta este momento se buscaron los registros asociados al código ingresado en el Textbox y se cargaron los datos en el Listbox2, se cargó la imagen y se calcularon los totales.
Para navegar y ver la imagen de los distintos articulos facturados y que figuran en el Listbox2, se puede hacer click en cada articulo o recorrerlos presionando la flecha del teclado, se irá mostrando por cada articulo la imagen del mismo en el control de imagen que está en el formulario.
El código se encuentra en el evento click del listbox y es el siguiente.
Primero se crea la conexión a Access como siempre con estos códigos:
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & ThisWorkbook.Path & «\1000 DBTSPuntoVenta.accdb;»
Se busca en la base de datos el valor que está en el listbox2 de la fila que se seleccionó, de la siguiente manera:
busco = (UserForm1.ListBox2.List(ListBox2.ListIndex, 0))
Se crea la SQL y busca el código del articulo de la base de datos con el objeto de recuperar la dirección de la imagen que esta en el cambo «Imagen_Arti»
sql = «SELECT Imagen_Arti FROM DB_Articulos WHERE Cod_Arti = ‘» & busco & «‘ «
Set rs = cn.Execute(sql)
Encontrado el dato correspondiente se carga la imagen en el control imagen del formulario, con el siguiente código:
mypat = rs.Fields(0).Value
Image1.Picture = LoadPicture(mypat)
Descarga el Libro PUNTO DE VENTA EN EXCEL
Descarga el libro usado en este ejemplo denominado Punto de Venta en Excel, para entender lo dicho en forma más fácil, igualmente recomiendo ver el vídeo asociado, el mismo es totalmente gratuito y libre su uso, solicito aportar para sostener esta web, si está dentro de tus posibilidades, desde ya muchas gracias.
Código Formulario para Facturar en Post de Venta en Excel
Código que se ingresa en un Userform1 Listbox2
Private Sub ListBox2_Click()
On Error Resume Next
Dim cn As ADODB.Connection, rs As ADODB.Recordset, sql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & ThisWorkbook.Path & «\1000 DBTSPuntoVenta.accdb;»
busco = (UserForm1.ListBox2.List(ListBox2.ListIndex, 0))
If busco <> codigo Or busco <> Empty Then
sql = «SELECT Imagen_Arti FROM DB_Articulos WHERE Cod_Arti = ‘» & busco & «‘ «
Set rs = cn.Execute(sql)
mypat = rs.Fields(0).Value
Image1.Picture = LoadPicture(mypat)
Set rs = Nothing
cn.Close
Set cn = Nothing
End If
End Sub
Código que se ingresa en un Userform1 Textbox14
Private Sub TextBox14_AfterUpdate()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim cn As ADODB.Connection, rs As ADODB.Recordset, QV As Long
On Error Resume Next
If UserForm1.TextBox14 = Empty Then
UserForm1.Label8.Visible = True ‘hace visible el label
Else
UserForm1.Label8.Visible = False
End If
If Len(UserForm1.TextBox14) > 2 Then
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cn.Open «Provider=Microsoft.ACE.OLEDB.12.0; » & «data source=» & ThisWorkbook.Path & «\1000 DBTSPuntoVenta.accdb;»
sql = «SELECT Cod_Arti,Detalle_Arti,Marca_Arti,PUV_Arti,Imagen_Arti FROM DB_Articulos WHERE Cod_Arti = ‘» & UserForm1.TextBox14 & «‘»
Set rs = cn.Execute(sql)
‘UserForm1.ListBox2.Clear
UserForm1.ListBox2.ColumnCount = 6
UserForm1.ListBox2.ColumnWidths = «70 pt;280 pt;110 pt;70 pt;70 pt; 110 pt «
‘Adiciona un item al listbox reservado para la cabecera
If UserForm1.ListBox2.ListCount <> 0 Then GoTo salta:
catireg = 0
UserForm1.ListBox2.AddItem
UserForm1.ListBox2.List(0, 0) = «Código»
UserForm1.ListBox2.List(0, 1) = «Articulo»
UserForm1.ListBox2.List(0, 2) = «Marca»
UserForm1.ListBox2.List(0, 3) = «Cantidad»
UserForm1.ListBox2.List(0, 4) = «PU»
UserForm1.ListBox2.List(0, 5) = «Total»
catireg = 1
salta:
‘Set rs = cn.Execute(sql)
If UserForm1.Label21.Caption = Empty Then
QV = 1
Else
QV = UserForm1.Label21.Caption
UserForm1.Label21.Caption = Empty
End If
If rs.EOF = True Then
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
‘UserForm1.ListBox2.Visible = False
Exit Sub
Else
rs.MoveFirst
Do While Not rs.EOF
UserForm1.ListBox2.AddItem rs.Fields(0).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 1) = rs.Fields(1).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 2) = rs.Fields(2).Value
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 3) = Format(QV, «#,##0.00;-#.##0,00»)
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 4) = Format((rs.Fields(3).Value), «#,##0.00;-#.##0,00»)
UserForm1.ListBox2.List(UserForm1.ListBox2.ListCount – 1, 5) = Format((rs.Fields(3).Value * QV), «#,##0.00;-#.##0,00»)
mypat = rs.Fields(4).Value
Image1.Picture = LoadPicture(mypat)
rs.MoveNext
Loop
End If
Set rs = Nothing
cn.Close
Set cn = Nothing
End If
For x = 1 To UserForm1.ListBox2.ListCount – 1
t = CDec(UserForm1.ListBox2.List(x, 5))
tot = tot + t
t = 0
Next x
subtototal = tot
Desc = CDec(UserForm1.TextBox28)
If IsNull(Desc) Or Desc = Empty Then Desc = 0
Impu = (subtototal – Desc) * 0.16
Total = subtototal – Desc + Impu
UserForm1.TextBox27 = Format(subtototal, «#,##0.00;-#.##0,00»)
UserForm1.TextBox28 = Format(Desc, «#,##0.00;-#.##0,00»)
UserForm1.TextBox29 = Format(Impu, «#,##0.00;-#.##0,00»)
UserForm1.TextBox30 = Format(Total, » «»€»» #,##0.00 «)
Select Case Total
Case Is > 1000000
UserForm1.TextBox30.Font.Size = 11
Case Is > 100000
UserForm1.TextBox30.Font.Size = 16
Case Is < 10000
UserForm1.TextBox30.Font.Size = 22
End Select
UserForm1.TextBox14 = Clear
Application.DisplayAlerts = True
Application.ScreenUpdating = True
UserForm1.TextBox14.SetFocus
End Sub
Código que se ingresa en Userform2
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error Resume Next
If KeyCode = 13 Then
UserForm1.Label21.Caption = UserForm2.TextBox1
Unload UserForm2
UserForm1.TextBox14.SetFocus
End If
End Sub
Si te fue de utilidad puedes INVITARME UN CAFÉ y de esta manera ayudar a seguir manteniendo la página, CLICK para descargar en ejemplo en forma gratuita.
If this post was helpful INVITE ME A COFFEE and so help keep up the page, CLICK to download free example.
Donate:
Cuenta Paypal: https://paypal.me/programarexcel
Cuenta Bitcoin: 1KBGGb8fyDzyR3X1Rie6m7VguzaAfngNbd
Cuenta Ether: 0x41Bbd24556914C83a31217eBb3BC49789b66e407