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.