PROGRAMAR EN VBA MACROS PARA EXCEL: Formulario ingreso y egreso de stock

Formulario ingreso y egreso de stock






En el ejemplo que se presenta a continuación encontrarás un pequeño sistema que gestiona de stock de mercadería en Excel, se realiza integralmente en Excel con ayuda de Formularios y macros de VBA, presenta formularios parra carga y descarga del stock.

Antes de seguir recomiendo leer un excelente libro sobre Excel que te ayudará operar las planillas u hojas de cálculo, haz 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.

  

El ejemplo que aquí se presenta gestiona el inventario de mercadería o stock, tiene dos formularios básicos, uno para compras y otro para ventas, con ellos se ingresa y egresa el stock respectivamente, Cuenta también el libro de Excel con cuatro hojas, denominadas stock, ventas, compras y códigos.

La forma más fácil de entender la programación de los formularios es descargar el ejemplo que se podrá hacer desde el link situado al final del post.

El Formulario de compras tiene un combobox con varios textbox y dos botones de comando, al iniciarse el formulario se carga el nombre de todos los artículos registrados en la hoja Códigos, una vez seleccionado en el combobox un articulo específico, se cargan en los textbox todos los datos correspondientes al mismo, algunos ítem los busca en la hoja códigos y otros en la hora Sctocks, como por ejemplo la cantidad de stock que se carga en el cuadro respectivo.

El formulario de compras tiene dos botones de comando, el primero sirve para guardar, este el es que contiene la mayoría del código, el otro botón es para salir o cerrar el formulario sin hacer cambios en la base de datos, los textbox tienen también una serie de programación o códigos que multiplican valores o hacen otros procedimientos, al presionar el botón aceptar, previo a guardar los datos realiza una serie de validaciones tendiente a evitar error en la carga de datos.

El botón de ventas,  funciona en forma muy parecida al formulario de compras, la diferencia básica es que permite realizar modificar o disminuir el stock cada vez que se realiza una venta; también al seleccionar un dato en el combobox, busca el registro respectivo y carga los datos en los textbox. Una diferencia importante es el textbox donde se inserta el número de factura, el código o macro determina en forma automática cual es número correlativo siguiente o número de factura siguiente, el botón aceptar realiza una serie de validaciones antes de guardar los datos, el otro botón sirve para salir o cerrar el formulario sin modificar datos en la base.

Cuando se compra mercadería se busca el dato correspondiente en la hoja de Stock y suma el Stock inicial más la compra de bienes realizada, de esta manera se actualiza la cantidad de unidades de stock vigentes, como así también el precio de compra, si es distinto al que aparece por defecto.

En el caso de ventas, la macro inserta en el formulario busca el dato correspondiente en la base de datos y lo actualiza disminuyéndolo en base a la cantidad vendida, se valida que no se pueda vender más mercadería que la que figura en stock. 

El vídeo que sigue muestra una explicación más detallada y gráfica de la macro presentada, recomiendo observar para una más fácil comprensión de la macro; suscribe a nuestra web desde la parte superior derecha de la página ingresando tu mail y a nuestro canal de You Tube para recibir en tu correo vídeos explicativos sobre macros interesantes, como  por ejemplo formulario que crea un listado de todas las hojas para poder luego seleccionarlasbuscar en listbox mientras escribes en textboxordenar hojas libro excel por su nombreconectar Excel con Access y muchos ejemplos más.





Te invito a descargar el ejemplo y analizarlo en detalle, puede servir de base para algo más complejo que estés realizando, pudiéndolo adaptar a tus necesidades, también es útil porque se podrá observar como se trabaja con combobox, textbox, formularios, si requieres otro ejemplo sobre trabajar con Formularios  haz click en el link y si requieres más ejemplos de macros, te recomiendo que mires el siguiente link click acá; si te gustó o sirvió por favor comparte con tus amigos en las redes sociales, podrás compartir el blog o el post desde los iconos del final del post.


Código que se inserta en un módulo

Sub muestrauf1()
UserForm1.Show
End Sub
Sub muestrauf2()
UserForm2.Show

End Sub





Código que se inserta en el Formulario 1

Public a, b As Long
Public vtb10 As Long
Private Sub ComboBox1_Change()
On Error Resume Next
busco = ComboBox1
Set codigo = Sheets("Códigos").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)
dire = codigo.Address(False, False)
TextBox1 = Sheets("Códigos").Range(dire).Offset(0, -2)
TextBox2 = Sheets("Códigos").Range(dire).Offset(0, -1)
TextBox3 = Sheets("Códigos").Range(dire).Offset(0, 1)
TextBox4 = Sheets("Códigos").Range(dire).Offset(0, 2)
TextBox8 = 50
TextBox9 = TextBox4.Value * (1 + (TextBox8.Value / 100))

busco = ComboBox1
Set codigo = Sheets("Stock").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)

If Not codigo Is Nothing Then
uf = codigo.Row
TextBox10 = Sheets("Stock").Cells(uf, 7)
vtb10 = TextBox10.Value
End If



TextBox1.Locked = True
TextBox2.Locked = True
TextBox3.Locked = True
TextBox4.Locked = True

TextBox1.TabStop = False
TextBox2.TabStop = False
TextBox3.TabStop = False
TextBox4.TabStop = False
TextBox6.SetFocus
End Sub

Private Sub CommandButton1_Click()
On Error Resume Next
If ComboBox1 = Empty Then
MsgBox ("Debe seleccionar producto"), vbInformation
ComboBox1.SetFocus
Exit Sub
End If

If TextBox6 = Empty Then
MsgBox ("Debe ingresar fecha"), vbInformation
TextBox6.SetFocus
Exit Sub
End If

If TextBox5 = Empty Then
MsgBox ("Debe ingresar cantidad"), vbInformation
TextBox5.SetFocus
Exit Sub
End If

busco = ComboBox1
Set codigo = Sheets("Stock").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)

If Not codigo Is Nothing Then
uf = codigo.Row

Sheets("Stock").Cells(uf, 1) = TextBox1
Sheets("Stock").Cells(uf, 2) = TextBox2
Sheets("Stock").Cells(uf, 3) = ComboBox1
Sheets("Stock").Cells(uf, 4) = TextBox3
Sheets("Stock").Cells(uf, 5) = TextBox4
Sheets("Stock").Cells(uf, 7) = Sheets("Stock").Cells(uf, 7) + TextBox5
Sheets("Stock").Cells(uf, 8) = Sheets("Stock").Cells(uf, 5) * Sheets("Stock").Cells(uf, 7)
Sheets("Stock").Cells(uf, 9) = TextBox9
TextBox9 = Format(TextBox9, "$ ##,##0.00")
Else
uf = Sheets("Stock").Range("A" & Rows.Count).End(xlUp).Row
uf = uf + 1
Sheets("Stock").Cells(uf, 1) = TextBox1
Sheets("Stock").Cells(uf, 2) = TextBox2
Sheets("Stock").Cells(uf, 3) = ComboBox1
Sheets("Stock").Cells(uf, 4) = TextBox3
Sheets("Stock").Cells(uf, 5) = TextBox4
Sheets("Stock").Cells(uf, 7) = Sheets("Stock").Cells(uf, 7) + TextBox5
Sheets("Stock").Cells(uf, 8) = Sheets("Stock").Cells(uf, 5) * Sheets("Stock").Cells(uf, 7)
Sheets("Stock").Cells(uf, 9) = TextBox9
End If


Sheets("Compras").Cells(2, 1).EntireRow.Insert
Sheets("Compras").Cells(2, 1) = TextBox6
Sheets("Compras").Cells(2, 2) = TextBox2
Sheets("Compras").Cells(2, 3) = ComboBox1
Sheets("Compras").Cells(2, 4) = TextBox3
Sheets("Compras").Cells(2, 5) = TextBox5
Sheets("Compras").Cells(2, 6) = TextBox4
Sheets("Compras").Cells(2, 7) = TextBox7


ComboBox1 = Clear

For Each t In UserForm1.Controls
If TypeName(t) = "TextBox" Then
t.Value = ""
End If
Next

'TextBox1 = Clear
'TextBox2 = Clear
'TextBox3 = Clear
'TextBox4 = Clear
'TextBox5 = Clear
'TextBox6 = Clear
'TextBox7 = Clear
Sheets("Stock").Select

End Sub
Private Sub CommandButton2_Click()
Sheets("Stock").Select
Unload Me
End Sub

Private Sub TextBox5_AfterUpdate()
On Error Resume Next
TextBox10 = vtb10 + TextBox5.Value
End Sub

Private Sub TextBox5_change()
On Error Resume Next
a = TextBox4.Text
b = TextBox5.Text
TextBox7 = Format((a * b), "$ ##,##0.00")
End Sub

Private Sub TextBox8_Change()
On Error Resume Next
TextBox9 = TextBox4.Value * (1 + (TextBox8.Value / 100))
TextBox9 = Format(TextBox9, "$ ##,##0.00")
End Sub

Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
ComboBox1.Clear
Sheets("Códigos").Select
Range("C2").Select
While ActiveCell <> Empty
ComboBox1.AddItem ActiveCell
ActiveCell.Offset(1, 0).Select
Wend
End Sub




Código que se inserta en el Formulario 2

Public a, b As Long
Public t As Object

Private Sub ComboBox1_Change()
busco = ComboBox1
Set codigo = Sheets("Códigos").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)
dire = codigo.Address(False, False)
TextBox3 = Sheets("Códigos").Range(dire).Offset(0, 1)

Sheets("Ventas").Select
If Range("b2") = Empty Then
TextBox2 = 1
GoTo ir:
End If
pf = 2
uf = Sheets("Ventas").Range("B" & Rows.Count).End(xlUp).Row
Max = Application.WorksheetFunction.CountA(Range("B" & pf & ":B" & uf))
TextBox2 = Max + 1

ir:
Sheets("Stock").Select

busco = ComboBox1
Set codigo = Sheets("Stock").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)

If Not codigo Is Nothing Then
uf = codigo.Row
TextBox5 = Sheets("Stock").Cells(uf, 9)
TextBox7 = Sheets("Stock").Cells(uf, 7)
End If



TextBox2.Locked = True
TextBox3.Locked = True
TextBox6.Locked = True
TextBox7.Locked = True

TextBox2.TabStop = False
TextBox3.TabStop = False
TextBox5.TabStop = False
TextBox7.TabStop = False
TextBox4.SetFocus




End Sub

Private Sub CommandButton1_Click()
On Error Resume Next
If ComboBox1 = Empty Then
MsgBox ("Debe seleccionar producto"), vbInformation
ComboBox1.SetFocus
Exit Sub
End If

If TextBox1 = Empty Then
MsgBox ("Debe ingresar fecha"), vbInformation
TextBox1.SetFocus
Exit Sub
End If


If TextBox4 = Empty Then
MsgBox ("Debe ingresar cantidad"), vbInformation
TextBox4.SetFocus
Exit Sub
End If

If TextBox5 = Empty Then
MsgBox ("Debe ingresar precio"), vbInformation
TextBox5.SetFocus
Exit Sub
End If



busco = ComboBox1
Set codigo = Sheets("Stock").Range("C1:C1000").Find(busco, LookIn:=xlValues, LookAt:=xlWhole)

If Not codigo Is Nothing Then
uf = codigo.Row
Sheets("Stock").Cells(uf, 7) = Sheets("Stock").Cells(uf, 7) - TextBox4

Sheets("Ventas").Cells(2, 1).EntireRow.Insert
Sheets("Ventas").Cells(2, 1) = TextBox1
Sheets("Ventas").Cells(2, 2) = TextBox2
Sheets("Ventas").Cells(2, 3) = TextBox3
Sheets("Ventas").Cells(2, 4) = ComboBox1
Sheets("Ventas").Cells(2, 5) = TextBox4
Sheets("Ventas").Cells(2, 6) = TextBox5
Sheets("Ventas").Cells(2, 7) = TextBox6
End If

ComboBox1 = Clear

'Dim t As Object
For Each t In UserForm2.Controls
If TypeName(t) = "TextBox" Then
t.Value = ""
End If
Next
Sheets("Stock").Select
End Sub
Private Sub CommandButton2_Click()
Sheets("Stock").Select
Unload Me
End Sub

Private Sub TextBox4_change()
On Error Resume Next
a = TextBox4.Text
b = TextBox5.Text
TextBox6 = Format((a * b), "$ ##,##0.00")
End Sub

Private Sub TextBox4_AfterUpdate()
If Val(TextBox4) > Val(TextBox7) Then
MsgBox ("No puede vender mayor cantidad que el stock"), vbInformation, "AVISO"
TextBox4 = Clear
TextBox6 = Clear
TextBox4.SetFocus
End If
End Sub

Private Sub TextBox5_change()
On Error Resume Next
a = TextBox4.Text
b = TextBox5.Text
TextBox6 = Format((a * b), "$ ##,##0.00")
End Sub

Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
ComboBox1.Clear
Sheets("Códigos").Select
Range("C2").Select
While ActiveCell <> Empty
ComboBox1.AddItem ActiveCell
ActiveCell.Offset(1, 0).Select
Wend
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.


Si te gustó por favor compártelo con tus amigos
If you liked please share it with your friends