Mensaje al guardar en VBA, cancelarlo si se guardo previamente

Tengo el siguiente código, el cual funciona como dice, el tema es que en el mismo formulario tengo un botón que guarda, y al guardar el registro mediante el botón, al salir del formulario me vuelve a preguntar si deseo guardar.

Los códigos son:

Al salir, o cambiar de registro por ejemplo.

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
DoCmd.RunCommand acCmdUndo
End If
End Sub

Y este es el boton que uso para que el usuario guarde:

Private Sub GUARDAR_Click()
MsgBox "Los cambios se han guardado correctamente", vbInformation, "Gestion de pacientes JANIES"
DoCmd.Save , "F_Paciente"
End Sub

lo que quisiera es que si el usuario ya hizo click en el boton "guardar", no se ejecute el codigo que puse al principio. Es redundante.

2 respuestas

Respuesta
2

Esteban: Si quieres evitar el mensaje de arriba, pero conservar la opción de que no se salga sin guardar, modifica un poco lo que tienes, encerrando el If que tienes en otro.

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.Dirty Then
    If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
        DoCmd.RunCommand acCmdUndo
    End If
End If
End Sub

En cualquier caso si tienes los controles vinculados a un Origen de datos, no necesitas ningún código, ya que Access por omisión guarda cualquier cambio, siempre que se cumpla lo anterior.

Un saludo >> Jacinto

Pasa que lo quisiera hacer "parecido al Word" por ejemplo, que si uno ya guardo y no hay cambios, al salir no pregunte nada. Ahora si salís y no guardaste, te pregunte. La verdad Jacinto que no tengo ni idea de como hacerlo, si no es mucha molestia te agradeceré que me lo ejemplifiques.

Esteban: En principio el código que te he puesto debería de funcionar, porque la pregunta te la hace si sales sin guardar las modificaciones. Si las has guardado no te pregunta.

¿Quizá lo has probado y no funciona?. Si es así me comentas. Un saludo >> Jacinto

ahhh perdon no habia prestado atencion pense que era el mismo. Mira ahi lo probe, a pesar de guardar con mi boton Guardar, me sigue preguntando.

Llevas razón Esteban: Ahora he de ausentarme y lo miro a mi regreso.

A veces las prisas están reñidas con los aciertos. Un saludo >> Jacinto

Esteban: Veo que Icue te ha ampliado y por lo que veo, resuelto el problema.

Un saludo a los dos Esteban e Icue>> Jacinto

¡Gracias! Bueno al final perseverando pude armar lo que quería. Lo expongo aquí por si alguien más lo necesita. Es una cuestión de gusto y diseño de la BBDD, no es ni mejor ni peor de una manera u otra, simplemente una opción:

Yo quería que en el formulario que poseo, haya un botón "guardar" y los botones habituales, como "volver atrás", por ejemplo.

Para que el usuario entre información, la guarde apretando "guardar", le avise que se han guardado los cambios, y luego al salir del formulario con el botón "volver atrás" no le pregunte nada, solo cierre. Si no han habido cambios desde que se oprimió "guardar" y luego "volver atrás", sale del formulario sin preguntar nada. Si los hubo, pregunta si desea guardar los cambios. Lo mismo, si quiere salir del formulario, con el botón "volver atrás" y han habido cambios, pregunta si se quiere guardar.

Para el botón guardar:

Private Sub NOMBREDETUBOTON_Click()
MsgBox "Los cambios se han guardado correctamente u otra cosa similar", vbInformation, "Aqui va lo que quieras"
DoCmd.Save , "NOMBREDETUFORMULARIO"
DoCmd.RunCommand acCmdRefresh
End Sub

para el boton "volver atras" o "salir del formulario"

Private Sub NOMBREDETUBOTON_Click()
If NewRecord Then
If MsgBox("¿Desea guardar los cambios o lo que quieras poner?", vbYesNo, "Lo que quieras poner tu") = vbNo Then
Me.Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
Else
If Dirty Then
If MsgBox("¿lo que te plazca?", vbYesNo, "lo que te plazca") = vbNo Then
Me.Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
End If
End If
DoCmd.Close acForm, "NOMBREDETUFORMULARIO"
End Sub

le tengo que agradecer enormemente la ayuda a Icue y a Jacinto, que me allanaron el camino.

Me olvide de comentar que si se selecciona NO en el mensaje, no se guarda nada.

Esteban: Gracias por la parte que me toca y estupendo que que lo hayas resuelto en la dirección que tu buscabas. Además ha sido bueno que lo compartas, porque como bien dices puede haber alguien interesado en algo similar. Mis saludos >> Jacinto

Respuesta
2

El problema te lo veo en que no le dices realmente lo que quieres que haga en caso de decir No. Me explico, en caso de que elijas No quieres:

1º Que el cursor se vuelva al mismo registro para que corrijas algo

2º Que te elimine completamente ese registro que acabas de escribir

3º Que haga otra cosa

De entrada, la instrucción la pondría en el evento Despues de actualizar

En el primer caso pondría

If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
DoCmd.SetWarnings False
DoCmd.cancelevent
End If

En el segundo

If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
End If

En el tercero

If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
DoCmd.SetWarnings False
DoCmd....lo que quieres que haga
End If

De todas formas te mando un ejemplo

Evidentemente no estoy entendiendo. En mi instrucción original, si ponía no hacia un Undo. Pero si ponía "si", guardaba. Mi problema es que si yo guardaba anteriormente con mi botón "guardar", igualmente se ejecutaba la acción. Y eso es lo que quisiera evitar. No tengo mucho conocimiento de VBA, es básico, quizá se me este pasando algo muy obvio pero evidentemente no lo veo.

La idea seria que ese código pregunte si se quieren guardar los cambios antes de cerrar el formulario (en caso de haberlos). Pero si ya se guardo previamente mediante el botón guardar, que no pregunte nada (porque no ha habido cambios). Igual a lo que seria el Word por ejemplo. Nuevamente les agradezco el interés y la ayuda

En tu instrucción no le estás diciendo que debe hacer en caso de que pulses SI. Lo guarda porque como te ha dicho Jacinto y te he remarcado en el ejemplo enviado, Access, por defecto, si no le dices nada en contra lo guarda todo.

Prueba a rellenar algo en un par de cuadros de texto de un registro. Si no tienes puesto absolutamente nada en contra, cierra el formulario y en su tabla origen verás como te ha guardado esos valores que has escrito.

Por otro lado, en el ejemplo que te envié, si no quieres que te lo pregunte en el momento de elegir un valor, puedes poner un botón de comando Cerrar formulario y en el evento Al hacer clic poner

If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord

else

docmd.close
End If

O sea, que si le dices no te borra el registro y se va a uno nuevo y si le dices Si te cierra el formulario y, aunque no te lo creas, te guarda esos valores.

Bueno ahora me quedo claro, voy a sacar el botón guardar que ya tengo, y solo a poner este código aal hacer click en el botón de cerrar formulario. Si pongo si cierra y guarda, si pongo no, borra el registro. Gracias. Ahí vi el ejemplo me es útil.

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas