Personalizar errores en Runtime Error de VBA

Como podría personalizar un error al ejecutarse mal un código VBA de access.

Explico: poseo un formulario basado en una tabla que posee 3 campos requeridos "SI". Tengo un botón que cierra el formulario, preguntando si deseo guardar los cambios. Si le pongo que no, cierra todo y deshace lo escrito, pero si le pongo si, guarda y cierra, pero al haber campos sin rellenar me sale venta de error de tiempo de ejecución de VBA. Quisiera que al intentar cerrar el formulario guardando, luego de apretar "si" aparezca un mensaje que diga que debo ingresar un valor en tal y tal campo, y que no cierre el formulario.

El código que manejo es el siguiente.

Private Sub VOLVER_Click()
If NewRecord Then
If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Aviso") = vbNo Then
Me.Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
Else
If Dirty Then
If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Aviso") = vbNo Then
Me.Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
End If
End If
DoCmd.Close acForm, "F_Paciente"
DoCmd.OpenForm "F_Paciente_Intro", acNormal
End Sub

1 respuesta

Respuesta
2

Así, en principio, sin analizar la instrucción podrías poner

If isnull([controlA]) or isnull([controlB]) or isnull([controlC])....then

Msgbox"Tiene controles sin rellenar","vbokonly,"No te aviso más, la próxima..."

Docmd. Cancelevent

end if

Hola Icue, me queda algo así, pero me tira el siguiente error...no entiendo

Private Sub Inicio_Click()
If Dirty Then
If IsNull([DNI]) Or IsNull([Cama]) Or IsNull([Diagnostico]) Or IsNull([F_Nacimiento]) Then
MsgBox("Debe completar los campos en blanco", vbInformation, "AVISO") = vbOK
DoCmd.CancelEvent
If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "AVISO") = vbNo Then
Me.Undo
Else
DoCmd.RunCommand acCmdSaveRecord
End If
End If
DoCmd.Close acForm, "F_Paciente"
DoCmd.OpenForm "Intro"
End Sub

"Error de compilación, la llamada a la función en la parte izquierda de la asignación debe devolver un Tipo Variant u Object"

ahi quede...

Primero, ¿porqué le pones en el primer mensaje al final =vbOk. Pero si ya partes de la premisa de que si falta algún campo por rellenar, simplemente que te lo diga y que cancele el evento. En todo caso pon VBinformation+vbok, pero como te decía, no sería necesario, ya que te tiene que ejecutar lo de cancelar de todas todas.

Por otro lado, pondría end if despues de docmd. Cancelevent, ya que que si los campos están rellenos no se ejecuta ese If, y si alguno estuviera vacío, la instrucción termina con el docmd.cancel event.

¡Gracias! Tarde pero seguro, después de las ideas que me fuiste dando quedo así:

El código esta dentro del botón para salir del formulario. Lo que haces es:

Si no hay cambios, sale sin guardar nada

Si hay cambios, pregunta si deseo guardarlos, si le pongo no: sale y cancela todo. Si le pongo que si, antes de guardar y salir, verifica cada campo que quiero que este lleno. Si alguno esta vacío, cancela y sale el mensaje de aviso. Anda todo bien.

Solo me queda una duda. Si algún campo esta en blanco desde que se abrió el formulario, el código anda bien. Ahora si el usuario llena algún carácter en el campo, y después vuelve a dejarl en blanco (borra todo el campo), ya no sale el mensaje de que debe llenarlo, guarda y cierra como si estuviese lleno.

If Dirty Then
If MsgBox("¿Desea guardar los cambios?", vbYesNo + vbQuestion, "Gestion de pacientes JANIES") = vbNo Then
Me.Undo
DoCmd.Close acForm, "F_Paciente"
DoCmd.OpenForm "F_Paciente_Intro", acNormal
Else
If IsNull([DNI]) Then
MsgBox "Debe completar el campo DNI", vbExclamation, "Gestion de pacientes JANIES"
DoCmd.CancelEvent
Else
If IsNull([Cama]) Then
MsgBox "Debe completar el campo Cama", vbExclamation, "Gestion de pacientes JANIES"
DoCmd.CancelEvent
Else
If IsNull([Diagnostico]) Then
MsgBox "Debe completar el campo Diagnostico", vbExclamation, "Gestion de pacientes JANIES"
DoCmd.CancelEvent
Else
If IsNull([F_Ingreso]) Then
MsgBox "Debe completar el campo Fecha de Ingreso", vbExclamation, "Gestion de pacientes JANIES"
DoCmd.CancelEvent
Else
If IsNull([Derivado]) Then
MsgBox "Debe completar el campo Derivado", vbExclamation, "Gestion de pacientes JANIES"
DoCmd.CancelEvent
Else
DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close acForm, "F_Paciente"
DoCmd.OpenForm "F_Paciente_Intro", acNormal
End If
End If
End If
End If
End If
End If
End If
End Sub

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