Búsqueda de datos VBA, a perfeccionar

Anteriormente me ayudaste con este código, lo pongo para que te recuerdes:

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:B10")) Is Nothing Then ‘
        For Each h In Sheets
            If h.Name <> ActiveSheet.Name Then
                Set b = h.Columns("A").Find(Target, lookat:=xlWhole)
                If Not b Is Nothing Then
                    Cells(Target.Row, "D") = h.Cells(b.Row, "B")
                    existe = True
                    Exit For
                End If
            End If
        Next
        '
        If existe = False Then
            Cells(Target.Row, "D") = "" 
            MsgBox "Producto  No Encontrado", vbExclamation
        End If
    End If
End Sub

Solo que mira que ahora tengo un problema, y es que los productos tienen diferencia de envase. Ejemplo:

Ese es el problema que tengo, que el código me tiene que ayudar a buscar el precio del producto que quiero, pero el precio de su respectiva medida. Ya que es obvio que el precio debe cambiar por que son envases más pequeños/Grandes.

Espero de tu gran ayuda y habilidad Dante, para encontrarle la solución a este problema.

1 respuesta

Respuesta
1

Entiendo que en una hoja "x", en el rango "B2:B10" estás capturando el producto, ¿en qué rango vas a capturar el envase?

Lo que hace la macro es buscar el producto en la columna "A" de todas las hojas, ¿en qué columna está el envase?

Pon 2 imágenes de la hoja "x" y un ejemplo de una hoja con productos y precios

Hola dante disculpa la tardanza.

Ok. Antes que nada el código que arriba puse solo es como referenci para que te recordaras, NO se si se aplica al actual libro de excel en cuastion.

Te incluyo las capturas de pantalla de las hojas que pediste:

y la otra:

Espero tu respuesta...

Te anexo la macro, tienes que ponerla en los eventos de la hoja "Operaciones".

Primero tienes que capturar en la columna A el envase y después en la columna "B" el Producto.

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:C10")) Is Nothing Then
        For Each h In Sheets
            If h.Name <> ActiveSheet.Name Then
                Set r = h.Columns("A")
                Set b = r.Find(Target, lookat:=xlWhole)
                If Not b Is Nothing Then
                    ncell = b.Address
                    Do
                        If Cells(Target.Row, "A") = h.Cells(b.Row, "C") Then
                            Cells(Target.Row, "D") = h.Cells(b.Row, "B")
                            existe = True
                            Exit Do
                        End If
                        Set b = r.FindNext(b)
                    Loop While Not b Is Nothing And b.Address <> ncell
                End If
            End If
        Next
        '
        If existe = False Then
            Cells(Target.Row, "D") = ""
            MsgBox "Producto  No Encontrado", vbExclamation
        End If
    End If
End Sub

S a l u d o s . D a n t e   A m o r

Recuerda valorar la respuesta.

Hola Dante, gracias por tu tiempo, y disculpa mi molestia.

Te comento: el código funciona bien, lo único malo que encontré es el hecho que en la hoja "Operaciones" cambia los precios solo si uno modifica el Nombre del producto NO el envase.

O sea:

Si en la celda A2 tengo "Kilo", y en B2 Aceite de oliva -> el código hace perfecta su función y me lanza en D2 su respectivo precio. Pero si yo modifico en A2 a "Galon", NO cambia el precio en D2; sino hasta que escriba en B2 otra vez el nombre del producto.

Espero tu respuesta, y gracias por tu tiempo...

Te anexo la macro actualizada

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("A2:C10")) Is Nothing Then
        If Target.Column = 1 Then
            If Cells(Target.Row, "B") = "" Then Exit Sub
        End If
        If Target.Column = 2 Then
            If Cells(Target.Row, "A") = "" Then Exit Sub
        End If
        '
        For Each h In Sheets
            If h.Name <> ActiveSheet.Name Then
                Set r = h.Columns("A")
                Set b = r.Find(Cells(Target.Row, "B"), lookat:=xlWhole)
                If Not b Is Nothing Then
                    ncell = b.Address
                    Do
                        If Cells(Target.Row, "A") = h.Cells(b.Row, "C") Then
                            Cells(Target.Row, "D") = h.Cells(b.Row, "B")
                            existe = True
                            Exit Do
                        End If
                        Set b = r.FindNext(b)
                    Loop While Not b Is Nothing And b.Address <> ncell
                End If
            End If
        Next
        '
        If existe = False Then
            Cells(Target.Row, "D") = ""
            MsgBox "Producto  No Encontrado", vbExclamation
        End If
    End If
End Sub

S a l u d o s . D a n t e   A m o r

Recuerda valorar la respuesta.

DANTE eres grande, me ayudaste mucho con este código.

Formulare otra pregunta, siempre relacionada a este tema, para que me ayudes ;)

¡Gracias! 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas