Alguna funcion Tipo: "Buscar" mas eficiente.

Me da un gusto saludarte.

Ya hace mucho tiempo No te molesto con mis inquietudes, pero ya hoy necesito me ayudes con tu ingenio para encontrar una manera eficiente para resolver mi problema.

Te explico lo mejor que pueda:

Imagina que en la celda B2 pones un nombre de un producto y en la celda D2 ocupas que aparesca el respectivo precio del producto que se ingrese en B2.

¿Cómo puedo hacer con una macro o codigo VBA para que esto ocurra eficientemente, sin ocupar la funcion BuscarV o otra? Para poderlo usar en varias Hojas.

Saludos ! Y espero tu ayuda.

1 Respuesta

Respuesta
1

Por ejemplo, escribes en la celda B2 "lápiz".

¿Quieres qué busque la palabra "lápiz" en todas las hojas?

¿En qué columna de las otras hojas tienes la palabra "lápiz" y en cuál columna tienes el precio?

Te anexo la macro, cambia columns("A") por la columna en donde están los productos, cambia "B" por la columna en donde están los precios.

La macro la tienes que poner en los eventos de tu hoja, esa hoja es en donde vas a poner un producto en la celda B2.

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Target.Address(False, False) = "B2" 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
                    [D2] = h.Cells(b.Row, "B")
                    existe = True
                    Exit For
                End If
            End If
        Next
        '
        If existe = False Then
            [D2] = ""
            MsgBox "Producto no en contrado", vbExclamation
        End If
    End If
End Sub

Sigue las Instrucciones para poner la macro en los eventos de worksheet

  1. Abre tu libro de excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. Del lado izquierdo dice: VBAProject, abajo dale doble click a worksheet(tu hoja)
  4. Del lado derecho copia la macro

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

Si es lo que necesitas.

Muchas gracias Dante. Por la pronta respuesta.

Ya hice la prueba del código, funciona muy bien, note que busca en todas las hojas del Libro, es correcto verdad ?

Solo que se me escapo mencionarte que esto lo debo de llenar en una tabla con varios productos, este codigo aplica solo a que se ponga el nombre el Una sola celda, pero tengo que llenar hasta abajo. por ejemplo desde B2 hasta B30.

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, Columns("B")) 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 en contrado", 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.

¡Gracias! DANTE. Grande como siempre.

Pero solo como ultima molestia siempre con este código. como defino si es desde "B2" hasta "B30" que quiero que llene. por que asi busca en toda la hoja y si ocupo que por ejemplo en "B35" poner otro texto me lanza el mensaje de error ya que lo que se escribe no es el nombre de ningun producto.

Así quedaría

Private Sub Worksheet_Change(ByVal Target As Range)
'Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B2:B30")) 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 en contrado", vbExclamation
        End If
    End If
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas