Como ejecutar un procedimiento vba con el resultado de una función Buscarv

Tengo un procedimiento vba que oculta o muestra unas imágenes de acuerdo al valor de una celda, ya lo he probado y funciona perfectamente, mi problema inicia al querer que el procedimiento actúe de acuerdo al resultado de la función Buscarv.

Aquí dejó parte del procedimiento que realice, agradezco su ayuda y sus valiosos comentarios .

P.d., no soy un experto en programación vba hago lo que puedo a mi entender, muchas gracias

Private Sub Worksheet_Change(ByVal Target As Range)

Valor = Range("AG2").Value

If Valor > 7 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 0 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 1 Then
ActiveSheet.Shapes("Imagen 1").Visible = True
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 2 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = True
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 3 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = True
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 4 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = True
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 5 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = True
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = False

ElseIf Valor = 6 Then
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = True
ActiveSheet.Shapes("Imagen 7").Visible = False

Else
ActiveSheet.Shapes("Imagen 1").Visible = False
ActiveSheet.Shapes("Imagen 2").Visible = False
ActiveSheet.Shapes("Imagen 3").Visible = False
ActiveSheet.Shapes("Imagen 4").Visible = False
ActiveSheet.Shapes("Imagen 5").Visible = False
ActiveSheet.Shapes("Imagen 6").Visible = False
ActiveSheet.Shapes("Imagen 7").Visible = True

End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Direccion = ActiveCell.Address
Cambiar = True
End Sub

1 Respuesta

Respuesta
1

H o l a:

El evento Worksheet_Change se activa cuando modificas una celda; pero cuando una celda recibe el resultado de una fórmula, entonces el evento Worksheet_Change, no se activa. En este caso, supongo que en la celda AG2 tienes una fórmula BuscarV similar a esto:

=BUSCARV(F2,Hoja3!B:C, 2,0)

Supongo que la celda que modificas es la F2, entonces tendrías que dirigir el evento Worksheet_Change a la celda F2 de esta manera:

Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("F2")) Is Nothing Then
        ActiveSheet.Shapes("Imagen 1").Visible = False
        ActiveSheet.Shapes("Imagen 2").Visible = False
        ActiveSheet.Shapes("Imagen 3").Visible = False
        ActiveSheet.Shapes("Imagen 4").Visible = False
        ActiveSheet.Shapes("Imagen 5").Visible = False
        ActiveSheet.Shapes("Imagen 6").Visible = False
        ActiveSheet.Shapes("Imagen 7").Visible = False
        If IsError(Range("AG2")) Then Exit Sub
        valor = Range("AG2").Value
        Select Case valor
            Case 0
            Case 1: ActiveSheet.Shapes("Imagen 1").Visible = True
            Case 2: ActiveSheet.Shapes("Imagen 2").Visible = True
            Case 3: ActiveSheet.Shapes("Imagen 3").Visible = True
            Case 4: ActiveSheet.Shapes("Imagen 4").Visible = True
            Case 5: ActiveSheet.Shapes("Imagen 5").Visible = True
            Case 6: ActiveSheet.Shapes("Imagen 6").Visible = True
            Case 7: ActiveSheet.Shapes("Imagen 7").Visible = True
        End Select
    End If
End Sub

Si revisas la macro en esta línea: If Not Intersect(Target, Range("F2")), le estoy indicando que se ejecute lo de las imágenes si la celda modificada fue la F2, entonces si modificas cualquier otra celda la macro no se ejecuta.


El otro evento para que funcione la fórmula cada que cambia el resultado de la fórmula es el evento Worksheet_Calculate, en este evento cada que la fórmula BuscarV cambia el evento se activa, el problema con este evento, en este caso, es que cualquier cálculo que se realice en tu hoja, se va a estar ejecutando.

Si el ejemplo de la fórmula BuscarV no es similar a lo que tienes y tampoco es el evento Calculate el que te funciona, entonces explícame con más detalle qué tienes en la hoja y qué es lo que vas a modificar para que en ese momento tus imágenes se oculten y se haga visible la que necesitas.


:) 
:) 

Muchas gracias por responder Dante Amor.

El ejemplo que me das funciona de maravilla (además de que es mucho más corto el programa),solo un pequeño detalle y algo que no aclare, en tu ejemplo me dices que es f2 la celda que se modifica, en mi caso la celda que se modifica esta en otra hoja y es una validaciónde datos por criterio de lista (lista desplegable), ¿Cómo puedo dirigir el evento Worksheet_Change a esta celda? 

Muchas gracias por tu valiosa ayuda Dante Amor.

Podrías ser más específico con los datos.

¿Cómo se llama la hoja en donde tienes la fórmula?

¿Cuál es la fórmula?

Cómo se llama la hoja en dónde tienes las imágenes.

La hoja donde tengo la formula se llama Seg.vial Teoria la formula es Buscarv(Modulos!L7,Modulos!AI2:AJ11,2,0) y esta escrita en la celda AG2 y en esta misma hoja se encuentran las imagenes llamadas Imagen 1...,Imagen 7; la hoja donde tengo la lista desplegable se llama Modulos

Entonces vas a seleccionar un dato de tu lista de validación de datos. ¿Correcto?

La lista de validación de datos está en la hoja "Modulos". ¿Correcto?

Cada que cambies el dato en tu lista de validación de datos, la fórmula que tienes en la hoja "Seg.vial Teoria" cambiará y tomará un nuevo valor, ese valor es que determinará cuál de las imágenes se visualizará, ¿correcto?

Quita la macro anterior y pon esta macro en los eventos de la hoja "Modulos".

Private Sub Worksheet_Change(ByVal Target As Range)
'Act.Por.Dante Amor
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("L7")) Is Nothing Then
        Set h = Sheets("Seg.vial Teoria")
        h.Shapes("Imagen 1").Visible = False
        h.Shapes("Imagen 2").Visible = False
        h.Shapes("Imagen 3").Visible = False
        h.Shapes("Imagen 4").Visible = False
        h.Shapes("Imagen 5").Visible = False
        h.Shapes("Imagen 6").Visible = False
        h.Shapes("Imagen 7").Visible = False
        If IsError(h.Range("AG2")) Then Exit Sub
        valor = h.Range("AG2").Value
        Select Case valor
            Case 0
            Case 1: h.Shapes("Imagen 1").Visible = True
            Case 2: h.Shapes("Imagen 2").Visible = True
            Case 3: h.Shapes("Imagen 3").Visible = True
            Case 4: h.Shapes("Imagen 4").Visible = True
            Case 5: h.Shapes("Imagen 5").Visible = True
            Case 6: h.Shapes("Imagen 6").Visible = True
            Case 7: h.Shapes("Imagen 7").Visible = True
        End Select
    End If
End Sub

':)
S aludos.   D ante A mor. R ecuerda valorar la respuesta. Gracias
':) 

¡Gracias! Ha funcionado a la perfección y sin error alguno.

De antemano mil gracias Dante Amor, me haz ayudado a reducir los tiempos en mi trabajo. 

Por mera curiosidad y saber un poco más;  si quisiese que sucediera lo mismo en otra hoja nueva, bajo las mismas condiciones de que se seleccione de una lista desplegable distinta por decir una celda abajo, en la misma hoja de módulos, que habría que hacer?

En la hoja nueva hay exactamente la misma fórmula en la misma posición.

Si se puede resolver esa duda, sino de cualquier manera te sigo agradecido por tu inmensa ayuda y paciencia Dante Amor.

Con mucho gusto te ayudo con todas tus peticiones.

Crea una nueva pregunta por cada petición en el tema de microsoft excel, en el desarrollo de la pregunta escribe: "para Dante Amor".

En el desarrollo de cada pregunta, de preferencia, pon ejemplos y datos reales, es difícil entregar una respuesta, si solamente mencionas en "alguna hoja", en "alguna celda", con "alguna fórmula".

Sal u dos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas