Como puedo colocar fechas según el stock

No logro concretar una fórmula

Tengo un libro donde en una hoja se va debitando un stock de articulo cada ves que hay una salida o impresión de ese articulo,

Quiero colocarle una fecha al lado de la columna del stock según se vaya debitando o disminuyendo el stock

Es decir si hoy se vendieron 5 artículos, de 20 en total, quedan 15,, ok, pero que me emuestre al lado de esa columna la fecha de su ultima salida, para saber que día fue la ultima salida de ese producto

Lo intente hacer con formato condicional pero no logro concretar una fórmula

Ya le muestro en una imagen

1 Respuesta

Respuesta
2

Pega este código en el modulo de la hoja:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim StockCol As Range
    Set StockCol = Range("G4:G" & Rows.Count)
    If Not Application.Intersect(StockCol, Range(Target.Address)) Is Nothing Then
        If Not IsEmpty(Target.Value) Then
            Target.Offset(0, 2).Value = Now
            Target.Offset(0, 2).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
        Else
            Target.Offset(0, 2).ClearContents
        End If
    End If
End Sub

Cada vez que cambie el valor en la columna G (Stock) se pondrá la fecha y hora del cambio en la columna I (fecha de la ultima venta). Si solo quieres la fecha elimina el formato de hora en la linea Target.Offset(0, 2).NumberFormat

¡Gracias! 

andy  excelente,,, 

Revisando la pregunta, creo que solo quieres poner la fecha cuando se resta el stock, pero mi código pone la fecha también cuando se agrega stock. Para hacerlo solo cuando se resta, sustituye el código anterior por estos:

Private prvStock As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim StockCol As Range
    Set StockCol = Range("G4:G" & Rows.Count)
    If Not Application.Intersect(StockCol, Range(Target.Address)) Is Nothing Then
        If Not IsEmpty(Target.Value) And IsNumeric(Target.Value) Then
            If Target.Value < prvStock Then
                Target.Offset(0, 2).Value = Now
                Target.Offset(0, 2).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
            End If
        Else
            Target.Offset(0, 2).ClearContents
        End If
    End If
    prvStock = 0
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim StockCol As Range
Set StockCol = Range("G4:G" & Rows.Count)
    If Not Application.Intersect(StockCol, Range(Target.Address)) Is Nothing Then
        If Not IsEmpty(Target.Value) And IsNumeric(Target.Value) Then
        prvStock = Target.Value
        End If
    End If
End Sub

Andy

Un detalle, el segundo método solo funciona si el stock se cambia manualmente entrando en la celda. No dijiste como se actualizan los datos, así que de eso dependerá.

Hola

conicidencialmente estaba pensando en eso,, pues no se como alimentar el stock cuando este apunto de terminarse, es decir, cuando queden 1 o 2 artículos en la hoja(solo tengo un formato condicional que me avisa en otra columna poniéndome la celda en rojo y colocando un mesj "Agotado"), tendría que hacer manualmente, es decir cuando llegue más mercancía, sumarla ala que tengo actual, en este caso, por ejemplo, me quedan 2 artículos y llegan 20,, serian entonces 22,, pero lo haría manual y me dijeron que así no es lo apropiado,, sino que debo darle un ingreso.. es decri estoy un poco enredado,, quiero hacer el aplicativo lo más funcional posible,,

Implementare el nuevo código que me enviaste, y comento,,

Si desea te envío el nuevo libro,, esta un poco mejorado y cambiado

Me confirmas

Gracias

Mira como ha quedado con el primer código

Explícame bien como funciona el según código,,, pues el que me enviaste primero esta perfecto,, muestra la fecha y hora cada ves que se debitan los artículos.. ¿pero el segundo cual es la diferencia?

Implemente el segundo código que me enviaste y no sucedió nada,, es decir,, no mostró ninguna fecha

Tuve que poner el anterior y si tienes razón,, debe mostrar la fecha solo cuando se vende o se debita un producto, el procedimiento sucede cuando se imprime o se guarda desde la factura,, automáticamente se restan los artículos en la hoja inventario, y la idea es motrar la fecha y hora al lado de la columna del stock,, no se si seria prudente que mostrara fecha si también si fuera lo contrario,,

El primer código, funcionara siempre que en la columna Stock se cambie el texto, sea para debitar, sea para aumentar, incluso si escribes con letras, cualquier cambio en la celda dispara la fecha (y esto interpreto que no es lo que necesitas). El segundo código, mira que el dato sea numero y que sea menor al dato que había anteriormente, el punto es que solo funciona cuando entras a la celda y cambias el dato manualmente (seguramente tampoco es lo ideal para ti). Todo depende de cómo actualizas los datos. Lo que tu quieres hacer hay mil maneras de hacerlo. Yo lo haría con formulario. Puedes lanzar un formulario que reste del stock y ese formulario entonces ejecute lo de la fecha. También puedes convertir el libro en en formulario poniendo botones en la cinta Ribbon, etc etc. Tu tienes que decidir como lo quieres hacer. Cuando vas a hacer un proyecto así, tienes que tener un plan, consistencia, y un poco de conocimiento.

Hola andy

Dices lo sgt:

" El segundo código, mira que el dato sea numero y que sea menor al dato que había anteriormente, el punto es que solo funciona cuando entras a la celda y cambias el dato manualmente " <---- andy

Ok,,, resulta que implemente el segundo código y no hace absolutamente nada,, modifico los valores manualmente en la celda, y no muestra ninguna fecha,,,, no entiendo,,,,, ok no importa

Bueno la idea es hacer algo simple,,, sin tanto código ni formularios,,, ya que gestionar un kardex es muy complejo en excel,

asi q hice algo asi en otro libro , lo q falta es q al imnprimir la factura se debite del invetario, es decir pienso conbinar este con el anterio libro     te muestro

Este otro proyecto,, es así,, la tabla productos se alimenta de las otras 2, E/S de forma automática, solo es menester de digitar las entradas y las salidas,, es simple,, pero siempre va haber algo que falte,, en este si me gustaría implentar un formulario que llene las tablas, pero pregunto seria necesario,, yo más bien lo veo es por estética, ¿pues digitar en la misma celda da lo mismo que en un formulario,, q dices?


Bueno, espero lo hayas visto,,, lo que busco en este libro gestion1 es hacer una macro que me inserte la fecha actual en la celda correspondiente por medio de un botón o autoforma, para no estar digitandola, pero sucede que al hacer la macro

La fecha se me inserta en todas la columna fecha reptiendose en toda la celda.. pero al borrarla, y agregar otra fecha allí si funciona la macro perfectamente,,

Envío el archivo

https://drive.google.com/open?id=1AYDJaQ_jQNFc1WPjJIuOoCgeCxphDGgY 

Ok,,, resulta que implemente el segundo código y no hace absolutamente nada,, modifico los valores manualmente en la celda, y no muestra ninguna fecha,,,, no entiendo,,,,, ok no importa

Apuesto que pegaste todo debajo de otra macro y por eso no te funciona. Si te fijas en la segunda opción que te mandé, comienza con Private prvStock As Integer

Eso es una variable de ámbito de Modulo, significa que tiene que estar en la cima del modulo, no puede haber nada por encima de eso. Si mi segunda opción la copiaste y la pegaste debajo de algo mas que hayas tenido de antes, NO FUNCIONA. Como te dije, para lanzarte a hacer estas cosas debes tener un conocimiento básico. Las variables globales van siempre arriba de cualquier otro código o no funcionaran.

De todas formas, la respuesta a tu pregunta está en cualquiera de las dos opciones que te di. Tu quieres poner fecha en una columna, el código para hacerlo esta ahí, a modo general, solo tienes que adaptarlo a tus necesidades.

mmmm,

Parece que hay 2 códigos,,, pero así como lo pego aquí así lo pegue allá

Este fue el código que copie y pegue en la hoja de inventario

Private prvStock As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim StockCol As Range
    Set StockCol = Range("G4:G" & Rows.Count)
    If Not Application.Intersect(StockCol, Range(Target.Address)) Is Nothing Then
        If Not IsEmpty(Target.Value) And IsNumeric(Target.Value) Then
            If Target.Value < prvStock Then
                Target.Offset(0, 2).Value = Now
                Target.Offset(0, 2).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
            End If
        Else
            Target.Offset(0, 2).ClearContents
        End If
    End If
    prvStock = 0
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim StockCol As Range
Set StockCol = Range("G4:G" & Rows.Count)
    If Not Application.Intersect(StockCol, Range(Target.Address)) Is Nothing Then
        If Not IsEmpty(Target.Value) And IsNumeric(Target.Value) Then
        prvStock = Target.Value
        End If
    End If
End Sub

Como no puedo eliminar la pregunta una es enviada (debería el admor del sitio agregar esa opción, así como en el foro ayuda excel,,) pero si tienes razón,, o puse allí, ya que el anteiror código me funciono pegándolo allí debajo de las otros procedimientos,, creí que los código de los botones no afectaban, ok, ya coregi el error y ahora si salen cuando se van restando

Gracias,,

Todos los días se aprende algo y no me sabia que el Private prvStock As Integer debía estar al inicio de un la escritura de un modulo,, lo tendré encuenta para una próxima

Cuando veas una variable declarada fuera de un sub, significa que es una variable "global" hay dos tipos de variables globales, las de ámbito de modulo que comienzan con Private o Dim (es igual, pero por un tema de facilidad de lectura del código se recomienda usar Private para distinguirla rápidamente), y las de ámbito realmente Global que las puedes usar desde cualquier modulo en el libro y se declaran con la palabra Public. Esas variables siempre deben estar arriba de cualquier otra macro, no puede haber nada encima de ellas o VBA no las tomara en cuenta (si usas Option Explicit te avisa)

Private NombreVariable As String <-variable que puedes usar en todas las macros de ese modulo

-

Public NombreVariable As String <-variable que puedes usar en todas las macros del libro

Repito siempre y cuando estén fuera de cualquier Sub y arriba de todos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas