Como abrir un UserForm con una condición de celda

Ruego me ayuden con este problemilla:

Tengo un formulario (UserForm1) con el que selecciono desde un combobox "factura" o "Cotización" esto se va inmediatamente a una celda (ejemplo A1) cuando cambia la celda quiero abrir otro Form, pero esto es dependindo de la condición en la celda si es OC (el userform2) si es CO (userfom3)...

Lo intente con

Sub Worksheet_Change(ByVal Target As Range)
If Range("A1") = "OC" Then

UserForm2.Show
End If
If Range("A1") = "CO" Then

UserForm3.Show
End If
End Sub

El problema es que cuando abre ok el form2 por ejemplo al llenar los datos en el form2 me arroja un error por que no se puede abrir el form2 2 veces...

1 respuesta

Respuesta
1

Pero dices que llenas los datos en el form2, y qué haces en el form2, ¿escribes algo en la hoja?

Prueba con lo siguiente

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1")) Is Nothing Then
If Range("A1") = "OC" Then
UserForm2.Show
End If
If Range("A1") = "CO" Then
UserForm3.Show
End If
End If
End Sub

Saludos. Dam
Si es lo que necesitas.

Hola, perdoname si no me explique bien, te comento:

no me funciono tu aplicación lo mas probable es que yo haya hecho algo mal, te adjunto el código que estoy fabricando:

Sub Worksheet_Change(ByVal Target As Range)
Rem si la celda b64 = 0, seleccionara rango de imprresión 1
If Range("B64") = "0" Then
ActiveSheet.PageSetup.PrintArea = "$D$1:$P$106"
End If
Rem si la celda b64 = 1, seleccionara rango de imprresión 2
If Range("B64") = "1" Then
MsgBox ("Haz Seleccionado mas de 30 Items en el Registro, se guardarán 2 páginas")
ActiveSheet.PageSetup.PrintArea = "$D$1:$P$84,$D$87:$P$106"
End If
Rem si se introduce un dato en las celda Q89 = advertencia (msgbox)
If Range("Q89") = "1" Then
MsgBox ("Haz puesto un % descuento Adicional")
End If
Rem si se introduce un dato en las celda Q90 = advertencia (msgbox)
If Range("Q90") = "1" Then
MsgBox ("Haz puesto un $ Recargo Adicional")
End If
Rem si en la celda R1 = SI, se abre el formulario Nº 4
If Range("R1") = "SI" Then
UserForm4.Show
End If
Rem si en la celda S1 = SI, se abre el formulario Nº 6
If Range("S1") = "SI" Then
UserForm6.Show
End If
End Sub

Lo que necesito es que cuando cambie el valor de una celda se abra un formulario en este caso la celda R1 llama al formulario Nº 4, todo funciona bien hasta que comienzo a usar el formulario Nº 4 (el que se acaba de abrir) cuando selecciono un combobox o un texbox (lo que sea) me arroja un error 400 dice "El formulario ya esta mostrado, no se puede mostrar en formato modal", espero haber sido mas especifico, te agradeceré me puedas ayudar, saludos.

Lo que pasa es que debes delimitar la modificación de celdas, te pongo el siguiente ejemplo de secuencia de pasos, según lo que veo en el código que me enviaste,
1. La hoja tiene prendido el evento Worksheet_Change, esto significa que cada vez que modifiques una celda, la que sea, puede ser la A1 o la MM50000, cualquier celda que modifiques el evento se activa y entonces entra en ejecución el código.
2. Si modificas la celda R1 y escribes la palabra "SI", que sucede: estás modificando una celda, entonces inicia el paso 1 (¿recuerdas?, cualquier celda que modifiques se activa el evento).
3. En el código tienes esto:
If Range("R1") = "SI" Then
UserForm4.Show
End If
4. Como en la celda “R1” tienes “SI”, Se activa el userform4
5. No tengo el código de lo que haces en el userform4, pero puedo asegurarte que tienes una actualización a la hoja en alguna celda.
6. Entonces si el usrform4 hace una modificación a una celda, ¿qué sucede?, pues que estás NUEVAMENTE modificando una celda, entonces inicia el paso 1 (¿recuerdas?, cualquier celda que modifiques se activa el evento).
7. Como nuevamente activaste el evento se ejecuta el código:
If Range("R1") = "SI" Then
UserForm4.Show
End If
8. Y como la celda R1 sigue en “SI”, intenta activar el userform4, pero como ya está activo, entonces error 400 "El formulario ya está mostrado, no se puede mostrar en formato modal".
Toda la secuencia de pasos anteriores, igual y ya lo sabías, pero quería explicarlo para decirte cómo solucionarlo.
Debes distinguir o identificar o establecer las celdas que cuando se modifiquen, entonces que se ejecute el evento, como lo tienes ahora, cualquier celda, repito y perdona que insista, pero cualquier celda que modifiques, entonces el evento se activa.
Continuando con esta explicación, en la pregunta original que pusiste en el foro, la celda identificada era la A1, por eso te di esta instrucción:
If Not Intersect(Target, Range("A1")) Is Nothing Then
Pero ahora me envías otra macro con otras celdas con otras condiciones y dices: “no me funciono tu aplicación”, pues claro que no va a funcionar, porque son diferentes tu petición inicial y la macro que posteriormente pusiste.
Ahora suponiendo que la macro que me enviaste es la efectiva, por lo que puedo ver, las celdas identificadas que deben determinar si se ejecuta o no el evento son estas: “Q89”, “Q90”, “R1” y “S1”
Entonces si se actualiza o se introducen datos en estas celdas : “Q89”, “Q90”, “R1” y “S1”, se debe activar el evento Worksheet_Change.
Lo anterior es una suposición, no tengo todo el contexto de lo que quieres hacer, lo único que sé, es que tienes un error, por querer abrir un formulario que ya tienes abierto, lo que te voy a plantear es una solución para el problema en específico.
Tienes que poner lo siguiente en el código
If Not Intersect(Target, Range("Q89, Q90, R1, S1")) Is Nothing Then
'tu código
End If
End Sub
Si tienes un código en el userform4 que modifica alguna de estas celdas “Q89”, “Q90”, “R1” y “S1”, o estas celdas tienen una fórmula, tendría que reformularse la solución.

Añade tu respuesta

Haz clic para o