Imprimir página | Cerrar ventana

Problema con vbYesNoCancel

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85473
Fecha de impresión: 29/Marzo/2024 a las 09:48


Tema: Problema con vbYesNoCancel
Publicado por: luixin
Asunto: Problema con vbYesNoCancel
Fecha de publicación: 03/Septiembre/2020 a las 18:46
Hola, 

Tengo un problema con todos los formularios, pensaba que funcionaban bien pero no es asi. Os explico mi problema. 
Tengo un formulario para dar de entrada reparaciones, en el cual relleno todo y hasta ahi perfecto. El problema digamos viene por ejemplo cuando entro a modificar algo y le doy al boton salir que tiene el siguiente codigo: 

Dim MensajeQuieresCerrar, EstiloQuieresCerrar, TítuloQuieresCerrar, RespuestaQuieresCerrar
MensajeQuieresCerrar = " ESTAS A PUNTO DE CERRAR EL FORMULARIO " & vbCrLf & vbCrLf _
        & " ¿ SEGURO QUE QUIERES CERRARLO ? " ' Define el mensaje.
EstiloQuieresCerrar = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.
TítuloQuieresCerrar = "¡¡ ATENCION !!" ' Define el título.
RespuestaQuieresCerrar = MsgBox(MensajeQuieresCerrar, EstiloQuieresCerrar, TítuloQuieresCerrar)
If RespuestaQuieresCerrar = vbYes Then
    DoCmd.Close acForm, Me.name
If RespuestaQuieresCerrar = vbNo Then
    End
End If

Este por si solo si no he modificado nada en el formulario funciona bien, si le marco NO no sale y se queda en el sitio. Pero el problema viene cuando por ejemplo le doy a que si y he hecho cambios. Ahi es cuando actua el evento Form_BeforeUpdate que tengo otro mensaje de si quiero guardar los cambios con vbYesNoCancel el cual el vbYes guarda cambios, el vbNo logicamente no guarda, pero ahora viene el tema, cuando le doy a vbCancel que tengo puesto el END el sigue cerrando el formulario y guardando los datos. El codigo del evento Form_BeforeUpdate es el siguiente: 

Dim MENSAJE, Estilo, Título, Respuesta
MENSAJE = " ESTE REGISTRO HA SIDO MODIFICADO " & vbCrLf _
        & " ¿ CONFIRMAR LOS CAMBIOS ? " ' Define el mensaje.
Estilo = vbYesNoCancel + vbQuestion + vbDefaultButton1 ' Define los botones.
Título = "¡¡ ATENCION !!" ' Define el título.
Respuesta = MsgBox(MENSAJE, Estilo, Título)
If Respuesta = vbYes Then
   Exit Sub
If Respuesta = vbNo Then
    Me.Undo
If Respuesta = vbCancel Then
    End
End If
End If
End If


Que estoy haciendo mal? He probado de todo sin exito, siempre acaba cerrandose.

Muchas gracias por delantado.

Saludos
Luis



Respuestas:
Publicado por: Mihura
Fecha de publicación: 03/Septiembre/2020 a las 19:09
Los IF's no están bien encadenados:

If RespuestaQuieresCerrar = vbYes Then
    DoCmd.Close acForm, Me.name
If RespuestaQuieresCerrar = vbNo Then
    End
End If

El control de si es No sólo se hace si cumple que es Yes ... lo cuál es obviamente imposible.

IF .... Then
 ....
End IF
IF .... Then
 ....
End IF


o
IF ... Then
   ....
elseIF .... then
   ...
end if



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: luixin
Fecha de publicación: 03/Septiembre/2020 a las 20:11
Acabo de cambiarlo asi y tampoco, sigue cerrando, eso si, ahora creo que no guarda aunque lo cierre.


Publicado por: xavi
Fecha de publicación: 04/Septiembre/2020 a las 00:05
Pon un punto de interrupción y sigue paso a paso el código para ver como se comporta.

Por cierto: la declaración de variables es mejorable. Te falta indicar el tipo. Tal como están ahora todas son de tipo Variant (cuestión de eficiencia)


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: luixin
Fecha de publicación: 04/Septiembre/2020 a las 08:22
Buenas, gracias por tu respuesta.

A lo de la interrupción no se a qué te refieres, y sobre lo de las variables podrías darme un ejemplo? Todo lo que sea mejorar y optimizar es de ayuda.

Saludos
Luis


Publicado por: javier.mil
Fecha de publicación: 04/Septiembre/2020 a las 18:38
Buenas

Abres el IDE  (ventana de VBE)  pulsando la combinación de teclas ALT + F11

Pulsas click con el ratón encima de la linea de código que quieres que el código se pare

Luego ejecutas el código te posiciones al inicio de la función o procedimiento y luego pulsa la tecla F5  para pasar a la siguiente linea pulsa F8 ,........

otra opción seria ejecutando el formulario en cuestión (teniendo el punto de interacción a marcado en rojo como en la siguiente imagen) y el código se pararía en ese punto.



punto de interrupcion




 


-------------
https://www.accessdemo.info" rel="nofollow - https://www.accessdemo.info





Publicado por: luixin
Fecha de publicación: 05/Septiembre/2020 a las 12:06
Ya lo he hecho y se para en el End, pero no entiendo para que sirve, si ya sabia que el End no lo hacia. 


Publicado por: jilo
Fecha de publicación: 05/Septiembre/2020 a las 12:22
Hola,
Sólo por intentarlo, porque no cambias el
End
por
Cancel=true

La instrucción End, yo siempre la he usado asociada a la Intrucción Open y mirando en la ayuda, dice:

"Finaliza la ejecución inmediatamente. Nunca se requiere por sí mismo, pero se puede colocar en cualquier lugar de un procedimiento para finalizar la ejecución del código, cerrar los archivos abiertos con la instrucción https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/open-statement" rel="nofollow - Open y borrar https://docs.microsoft.com/es-es/office/vba/language/glossary/vbe-glossary#variable" rel="nofollow - las variables ."

Al estar dentro del evento BeforeUpdate, igual viene de ahí el problema.
Saludos


-------------
Espero te sirva !!!!!!
Iñaki


Publicado por: luixin
Fecha de publicación: 05/Septiembre/2020 a las 14:05
Publicado originalmente por jilo jilo escribió:

Hola,
Sólo por intentarlo, porque no cambias el
End
por
Cancel=true

La instrucción End, yo siempre la he usado asociada a la Intrucción Open y mirando en la ayuda, dice:

"Finaliza la ejecución inmediatamente. Nunca se requiere por sí mismo, pero se puede colocar en cualquier lugar de un procedimiento para finalizar la ejecución del código, cerrar los archivos abiertos con la instrucción https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/open-statement" rel="nofollow - Open y borrar https://docs.microsoft.com/es-es/office/vba/language/glossary/vbe-glossary#variable" rel="nofollow - las variables ."

Al estar dentro del evento BeforeUpdate, igual viene de ahí el problema.
Saludos

Eso ya lo probe y sin exito. Lo que he probado hoy que si que me funciona es  en el boton de salir que me pregunta si quiero cerrar si le doy al SI hacer un Call Form_BeforeUpdate(0) entonces si le doy a cancelar si que me cancela. Pero si le doy a que si que quiero guardar me vuelve a pedir si quiero guardar otra vez, osea que se repite, pero lo por demas el funcionamiento seria el correcto.

Tambien he cambiado la estructura de los Msgbox como comentabais de la siguiente manera, a ver que os parece.

If Me.Dirty Then
Dim GuardarCambios As Integer
GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
Select Case GuardarCambios
Case 6 'Yes
     Exit Sub
Case 7 'No
    Me.Undo
Case 2 'Cancel
    Cancel = True
    End
End Select
End If

Saludos
Luis




Publicado por: Mihura
Fecha de publicación: 05/Septiembre/2020 a las 15:29
Sin analizar nada más .... ese End ¿que pinta ahí?.

Por cierto, si se hace la sangría al código se lee mucho mejor:

    If Me.Dirty Then
        Dim GuardarCambios As Integer
        GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
        Select Case GuardarCambios
            Case 6 'Yes
                Exit Sub
            Case 7 'No
                Me.Undo
            Case 2 'Cancel
                Cancel = True
                End -> borrarla
        End Select
    End If


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: luixin
Fecha de publicación: 06/Septiembre/2020 a las 10:39
El End se me ha pasado que estaba haciendo pruebas. 

Creo que alf ianl lo he solucinado de la siguiene manera, aunque si le doy al si me lo vuelve a preguntar si guardar cambios, asi que creo que tendria que cambiar el Exit Sub del Yes por Domd.Save por ejemplo no?

Esto para el boton de salir:

'SALIR
If Me.NewRecord Then
    DoCmd.Close acForm, Me.name
Else
Call Form_BeforeUpdate(0)
Dim Salir As Integer
Salir = MsgBox("ESTAS A PUNTO DE CERRAR EL FORMULARIO" & vbCrLf & vbCrLf & "¿SEGURO QUE QUIERES CERRARLO?", vbCritical + vbYesNo, "¡¡ATENCION!!")
Select Case Salir
Case 6 'Yes
    DoCmd.Close acForm, Me.name
Case 7 'No
    Cancel = True
End Select
End If

Y esto para el evento Form_BeforeUpdate

'GUARDAR CAMBIOS
If Me.Dirty Then
Dim GuardarCambios As Integer
GuardarCambios = MsgBox("ESTE REGISTRO HA SIDO MODIFICADO" & vbCrLf & "¿CONFIRMAR LOS CAMBIOS?", vbInformation + vbYesNoCancel, "¡¡ATENCION!!")
Select Case GuardarCambios
Case 6 'Yes
     Exit Sub
Case 7 'No
    Me.Undo
Case 2 'Cancel
    End
End Select
End If

Como lo veis? funcionar funciona.

Saludos
Luis


Publicado por: Mihura
Fecha de publicación: 06/Septiembre/2020 a las 10:58
Uno de los teoremas básicos de la informática es:

      "Si funciona, ... ¿pa'que lo arreglas?"

Vamos que si te funciona, dedica tu tiempo a otros problemas, que seguro que los tienes.  Wink

Un saludo.


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es



Imprimir página | Cerrar ventana