Jump to content

Macro Control de Inventario


Recommended Posts

Hola,

Hice una macro para gestionar el stock de almacén. La tabla está ordenada por producto y por fecha. Con un condicional le digo que si la fila corresponde a una entrada y justo la anterior también, me ponga en la columna stock acumulado las unidades del día de hoy más las que figuran en el stock acumulado del día anterior. (si una salida... que lo reste, etc.). Hago lo mismo con el precio.

Hasta ahí la macro me va bien. El problema es que no sé cómo añadir que para el primer registro de cada producto (que siempre es de entrada) ponga que el stock es igual a las Unidades de la misma fila. Como podéis ver en la tabla se queda en blanco, así que me arrastra el error hasta el final.

¿Alguna idea de cómo añadir esto a la macro? Os la he dejado en el fichero en Hoja “Inventario”.

Por otro lado, en la pestaña Inventario 2, está la misma tabla pero con el listado de varios productos. Una vez que tenga lo anterior ¿Cómo añado que pase la macro para cada cambio de producto en columna A?

Muchísimas gracias de antemano.

Ej_Inventario.xlsm

Link to comment
Share on other sites

Hola @Maria_80

Puedes agregar un control para que si es el primer ingreso actue como pediste.
Te dejo el código propuesto para que lo juntes con tu código ya existente (módulo 1) y pruebes.

Sub ctrl_primer_ingreso()
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

cpase = 0: cfila1 = 0: cfila1 = Hoja1.Cells(i, 1).Row
cvalor = 0: cvalor = Hoja1.Cells(i, 1).Value
If Cells(i, 2).Value = "Entrada" Then
    For j = 2 To cfila1
        If Hoja1.Cells(i, 1).Value = cvalor Then
            ccnt = ccnt + 1
            If ccnt > 1 Then cpase = 1: Exit Sub
            If j = cfila1 Then cpase = 0: Exit Sub
        End If
    Next j
Else
    Exit Sub
End If

With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
End With
End Sub

En tu código ya existente, efectúa estas modificaciones:
Revisa bien los condicionales (para cuando son "Entrada") y agrega la condición cpase=0 para que Excel sepa que es el primer registro de dicho código.

Sub Control_Inventario()
With Worksheets("Inventario")
    ccnt = 0
    For i = 2 To .UsedRange.Rows(.UsedRange.Rows.Count).Row
        Call ctrl_primer_ingreso
        If Cells(i, "B").Value = "Entrada" And Cells(i - 1, "B").Value = "Entrada" And cpase = 0 Then


Suerte!

 

Link to comment
Share on other sites

7 hours ago, tierra_pampa said:

Perdón @Maria_80 me olvidé de avisar que modifiqué las variables así:
 

Public cfila1 As String, ufila1 As String
Public i As Integer, cpase As Integer, ccnt As Integer

Suerte!

Hola, Pampa.

Primero muchas gracias por tu respuesta. Pegué el código dentro del mismo módulo, modifiqué lo de Hoja1 por Sheets("Inventario"). También probé ha dejarlo como Hoja1 por si acaso. He puesto arriba las variables que modificaste y no entendí muy bien si dentro de todas mis condiciones tengo que añadir al final esto (cpase = 0), pero se me para aquí... dice error definido por la aplicación u objeto... todavía no controlo tanto y no he sido capaz de adaptarlo. ¿Esto sería para un producto, verdad? Tendría que añadir luego otra cosa para que lo ejecute según van cambiando el grupo de productos de hoja Inventario2? Mil gracias.

cfila1 = Hoja1.Cells(i, 1).Row
 
Link to comment
Share on other sites

6 minutes ago, Maria_80 said:

Hola, Pampa.

Primero muchas gracias por tu respuesta. Pegué el código dentro del mismo módulo, modifiqué lo de Hoja1 por Sheets("Inventario"). También probé ha dejarlo como Hoja1 por si acaso. He puesto arriba las variables que modificaste y no entendí muy bien si dentro de todas mis condiciones tengo que añadir al final esto (cpase = 0), pero se me para aquí... dice error definido por la aplicación u objeto... todavía no controlo tanto y no he sido capaz de adaptarlo. ¿Esto sería para un producto, verdad? Tendría que añadir luego otra cosa para que lo ejecute según van cambiando el grupo de productos de hoja Inventario2? Mil gracias.

cfila1 = Hoja1.Cells(i, 1).Row
 

Mira, te lo adjunto con todas las modificaciones. Ahora no se me para, pero solo me rellena la fila dos del producto 1 como si ese fuera el primer ingreso. Al resto de condiciones le añadí (cpase <> 0) pero no entra en ellas...

He estado investigando para que ejecute esto por cada grupo de productos de la columna 1, pero no encuentro la manera...

Ej_Inventario - v2.xlsm

Link to comment
Share on other sites

Prueba con esta macro:

Sub ObtenerSaldos()
Dim Producto, Stock, Valor
Application.ScreenUpdating = False
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
   If Not Range("A" & x) = Producto Then
      Producto = Range("A" & x)
      Stock = 0
      Valor = 0
   End If
   If UCase(Range("B" & x)) = "ENTRADA" Then
      Stock = Stock + Range("D" & x)
      Valor = Valor + Range("E" & x)
   Else
      Stock = Stock - Range("D" & x)
      Valor = Valor - Range("E" & x)
   End If
   Range("F" & x) = Stock
   Range("G" & x) = Valor
Next
End Sub

 

Link to comment
Share on other sites

21 minutes ago, Antoni said:

Prueba con esta macro:

Sub ObtenerSaldos()
Dim Producto, Stock, Valor
Application.ScreenUpdating = False
For x = 2 To Range("A" & Rows.Count).End(xlUp).Row
   If Not Range("A" & x) = Producto Then
      Producto = Range("A" & x)
      Stock = 0
      Valor = 0
   End If
   If UCase(Range("B" & x)) = "ENTRADA" Then
      Stock = Stock + Range("D" & x)
      Valor = Valor + Range("E" & x)
   Else
      Stock = Stock - Range("D" & x)
      Valor = Valor - Range("E" & x)
   End If
   Range("F" & x) = Stock
   Range("G" & x) = Valor
Next
End Sub

 

Qué sencillo y qué efectivo! Mil millones de gracias como siempre! Y funciona para todos los productos! ;).

Link to comment
Share on other sites

  • Crear macros Excel

  • Posts

    • Si me haces el favor de enviarme la macro para  intentarlo te lo agradeceré enormemente... sirve que aprendo también un poco. 
    • Buenas noches a todos los Foristas. Hola JSD, eso está PERFECTO, de hecho es más de lo que tenía pensado. Verdaderamente ustedes saben y yo trato de aprender cada día. Qué más puedo decir? Gracias mil por todo este  trabajo. Otra cosa, descuide, que si yo acudo a ustedes es porque he agotado los pocos conocimientos que tengo. Realmente sólo requiero de un ligero "empujón", un ejemplo de la duda que tengo para yo continuar con el trabajo, porque de esa manera aprendo, fijándome en el código, analizándolo y después lo desarrollo a mis necesidades. No tengo palabras para agradecerle el gesto y el trabajo realizado. Estoy en deuda con usted y porqué no, con otros miembros de este Maravilloso FORO. Doy por cerrado el tema. Un abrazo a todos y en especial a usted JSD por su paciencia y dedicación para conmigo. Nunca lo olvidaré, por eso dije en una ocasión que lo consideraba Mi Amigo, aun cuando ni siquiera nos conocemos, pero es que su comportamiento, su manera de enfocar los temas, su actitud siempre positiva y su altruismo tienen consecuencia y esa consecuencia es  decirle AMIGO. Salud y bendiciones Un abrazo. Pino
    • 1. Tu tienes forma de convertirlos a TXT? 2. Si comprimes todos los archivos RTF a RAR o ZIP  cuanto pesan Te lo pregunto porque la macro me funcion de TXT a Excel, no e podido hacerlo directamente desde RTF.  
    • Es correcto!! Esa es la idea.
    • Cordial saludo Estimados tengan un excelente día, favor su ayuda con lo siguiente: La idea aquí es sacar la variación de cada día sobre el tiempo que se gastó cada usuario: Ejemplo, el día domingo en la semana 42 el usuario gasto en cierta actividad 16 horas y 22 minutos, mientras que el otro domingo duro 11 horas y 46 minutos, entonces es sacar la variación, el resultado es -28%. Ayuda como lo logro en la tabla dinámica. De antemano muchas gracias, Dios los bendiga Saludos,    Variaciones.xlsm
  • Recently Browsing

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Privacy Policy