¿Cómo registrar un producto según la fecha más antigua, con una macro?

Pues aquí nuevamente dando lata, espero me puedas ayudar nuevamente Dante.

Quiero registrar mi venta buscando un producto por ejemplo “Libreta Prof. Raya” en la hoja “Ventas” celda E6.

Además, ingreso otros datos:

  • Número de artículos vendidos, en la celda E8
  • Precio venta, en la celda E10
  • Utilidad, en la celda E12
  • Fecha de venta, en la celda E4

Aquí mi hoja "Ventas"

aquí mi hoja "BD"

Lo que quiero que haga la macro es que el producto que le estoy indicando en la hoja “Ventas” celda E6, lo busque en la hoja “BD” (el campo producto se encuentra en la columna D) deberá buscar el registro más antiguo o los registros más antiguos según el número de productos vendidos y les deberá registrar en la hoja “BD”

  • La fecha de venta, columna N
  • el precio de venta, columna O
  • la utilidad, columna P (la cual deberá calcular con el precio de venta menos el precio que encontró en el registro para dicho producto).

1 respuesta

Respuesta
1

H o l a Rhossi:

Tengo algunas dudas.

En la celda E12 (utilidad) de la hoja ventas, ¿vas a capturar algo?

Siguiendo con tu mismo ejemplo, puedes poner en la hoja BD el resultado que esperas.

En la hoja ventas capturas en las celdas o en un textbox, qué tipo de texbox (de formulario o de controlactivex).

Gracias por la pronta respuesta Dante.

Respecto a la celda E12 de la hoja de ventas, quiero que calcule la utilidad o ganancia,  con el precio de venta del producto menos el precio de venta que le indico en la celda E10. Y pensándolo, tal vez no seria necesario ese campo en la hoja "VENTAS", sólo que registre el resultado en la hoja "BD" columna P. 

Así seria mi captura en "VENTAS" por ejemplo:

Y en la hoja "BD" quedaría de esta forma

Los datos de la hoja "VENTAS" los capturo en las celdas.

Te anexo la macro

Sub Registrar_Ventas()
'   Por Dante Amor
'
'   Cómo registrar un producto según la fecha más antigua
'
    Set h1 = Sheets("VENTAS")
    Set h2 = Sheets("BD")
    '
    'VALIDACIONES
    '
    If h1.Range("E4").Value = "" Then
        MsgBox "Falta la fecha"
        Exit Sub
    End If
    If h1.Range("E6").Value = "" Then
        MsgBox "Falta el producto"
        Exit Sub
    End If
    If h1.Range("E8").Value = "" Or Not IsNumeric(h1.Range("E8").Value) Then
        MsgBox "Falta el número de artículos"
        Exit Sub
    End If
    If h1.Range("E10").Value = "" Or Not IsNumeric(h1.Range("E1").Value) Then
        MsgBox "Faltan los ingresos"
        Exit Sub
    End If
    cuenta = WorksheetFunction.CountIf(h2.Columns("D"), h1.Range("E6").Value)
    If cuenta = 0 Then
        MsgBox "No existe el producto"
        Exit Sub
    End If
    If cuenta < h1.Range("E8").Value Then
        MsgBox "El número de artículos vendidos es inferior al número en BD"
        Exit Sub
    End If
    '
    precio = h1.Range("E10").Value / h1.Range("E8").Value
    Set r = h2.Columns("D")
    Set b = r.Find(h1.Range("E6").Value, LookAt:=xlWhole)
    If Not b Is Nothing Then
        celda = b.Address
        Do
            'detalle
            h2.Cells(b.Row, "N").Value = h1.Range("E4").Value
            h2.Cells(b.Row, "O").Value = precio
            h2.Cells(b.Row, "P").Value = precio - h2.Cells(b.Row, "F").Value
            ganancia = ganancia + (precio - h2.Cells(b.Row, "F").Value)
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> celda
    End If
    h1.Range("E12").Value = ganancia
    MsgBox "Venta registrada." & vbCr & vbCr & _
           "Ganancia neta : " & ganancia, vbInformation, "VENTAS"
    h1.Range("E4:E12").Value = ""
End Sub


Ya entendí lo de la ganancia neta, también pone la ganancia en la celda E12, si no quieres que la ponga, entonces quita esta línea de la macro:

 H1. Range("E12").Value = ganancia

Al final la macro borra las celdas, si no quieres que las borre, entonces quita esta línea de la macro:

    h1.Range("E4:E12").Value = ""

'.[Sal u dos. Dante Amor. No olvides valorar la respuesta. 

Muchas Gracias Dante.

Sólo un detalle,  no respeta el número de artículos que le indico; registra venta en todos las filas que coincidan con el nombre del producto. Si tengo 5 "Libretas Prof. Cuadro" y le indico que sólo vendo 3, marca la venta en las 5.

Por lo demás, todo bien. 

Aquí tienes un problema que no has mencionado.

Siguiendo con tu ejemplo, si tienes 5 libretas y vendes 3, cuáles 3 de esas 5 le vas a realizar el registro. A las primeras 3, a las 3 de en medio, ¿o a las últimas 3?

La macro no contempla revisar si tienen existencia.

Te actualizo la macro para registrar en los primeros registros.

Sub Registrar_Ventas()
'   Por Dante Amor
'
'   Cómo registrar un producto según la fecha más antigua
'
    Set h1 = Sheets("VENTAS")
    Set h2 = Sheets("BD")
    '
    'VALIDACIONES
    '
    If h1.Range("E4").Value = "" Then
        MsgBox "Falta la fecha"
        Exit Sub
    End If
    If h1.Range("E6").Value = "" Then
        MsgBox "Falta el producto"
        Exit Sub
    End If
    cant = h1.Range("E8").Value
    If cant = "" Or Not IsNumeric(cant) Then
        MsgBox "Falta el número de artículos"
        Exit Sub
    End If
    If h1.Range("E10").Value = "" Or Not IsNumeric(h1.Range("E1").Value) Then
        MsgBox "Faltan los ingresos"
        Exit Sub
    End If
    cuenta = WorksheetFunction.CountIf(h2.Columns("D"), h1.Range("E6").Value)
    If cuenta = 0 Then
        MsgBox "No existe el producto"
        Exit Sub
    End If
    If cuenta < cant Then
        MsgBox "El número de artículos vendidos es inferior al número en BD"
        Exit Sub
    End If
    '
    precio = h1.Range("E10").Value / cant
    Set r = h2.Columns("D")
    Set b = r.Find(h1.Range("E6").Value, LookAt:=xlWhole)
    n = 0
    If Not b Is Nothing Then
        celda = b.Address
        Do
            'detalle
            If n = cant Then Exit Do
            h2.Cells(b.Row, "N").Value = h1.Range("E4").Value
            h2.Cells(b.Row, "O").Value = precio
            h2.Cells(b.Row, "P").Value = precio - h2.Cells(b.Row, "F").Value
            ganancia = ganancia + (precio - h2.Cells(b.Row, "F").Value)
            n = n + 1
            Set b = r.FindNext(b)
        Loop While Not b Is Nothing And b.Address <> celda
    End If
    h1.Range("E12").Value = ganancia
    MsgBox "Venta registrada." & vbCr & vbCr & _
           "Ganancia neta : " & ganancia, vbInformation, "VENTAS"
    h1.Range("E4:E12").Value = ""
End Sub

Si quieres verificar la existencia a definir algún criterio para realizar específicamente el registro en los materiales, deberás explicarme con ejemplos cómo lo quieres. Pero deberás valorar esta respuesta y crear una nueva pregunta, con todo gusto te ayudo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas