No me permite salir sin grabar y tampoco limpiar el formulario en VBA de Excel

Tomé esta rutina publicada hace ya un tiempo por el experto Dante y me funciona muy bien. Ahora, si no tiene una fecha válida no me permite salir sin grabar por medio de un commandbutton y lo mismo ocurre si quiero limpiar el formulario... ¿qué salida puedo tener a este problema?

La rutina que estoy utilizando es la siguiente:

Private Sub Txt_MesAno_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Valida formato de fecha en un textbox
'Por.Dam
On Error Resume Next
Txt_MesAno.Text = Format(CDate(Txt_MesAno), "dd/mm/yyyy")
fechaentrada = Txt_MesAno.Value
fecha = Txt_MesAno.Value
For i = 1 To 10
If Mid(fecha, i, 1) = "/" Or Mid(fecha, i, 1) = "-" Or Mid(fecha, i, 1) = "." Then
fecha = Left(fecha, i - 1) & Mid(fecha, i + 1)
End If
Next
If Len(fecha) <> 8 Then
MsgBox "fecha invalida_a " & fechaentrada
Cancel = True
Else
fecha = Left(fecha, 2) & "/" & Mid(fecha, 3, 2) & "/" & Right(fecha, 4)
fecha = DateValue(fecha)
If Err.Number <> 0 Then
MsgBox "fecha invalida_b " & fechaentrada
Cancel = True
Else
Txt_MesAno.Value = fecha
End If
End If
End Sub

1 respuesta

Respuesta
1

[Hola

No se entiende ya que hablas "grabar" y "limpiar" pero no muestras/explicas que y/o cómo haces eso y el dilema real está en eso además no explicas la relación real de eso con el código que has enviado, o sea, hablas de una "fecha válida" pero no explicas cuándo es válida o cuándo no ya que en realidad lo que ha enviado, pongas el número/s que pongas, fuerza una fecha siempre.

Abraham Valencia

Gracias por responder y al leer tu respuesta caigo de que realmente mi pregunta no estaba bien enfocada!!! Voy a intentar explicar mejor mi problema!

Cuando hablo de "salir sin grabar" me refiero a un botón de comando que hace lo siguiente:

Private Sub Com_Salir_Click()
'Salir sin hacer nada
End
End Sub

Y "limpiar" es otro botón  de comando que lo que hace básicamente en poner en cero todo el formulario:

Private Sub Com_Borrar_Click()
' Limpiar el formulario
Txt_MesAno.Text = Empty
Txt_Vcont.Text = "0"
Txt_VcredPr.Text = "0"
Txt_VcredPu.Text = "0"
Txt_AvenPr30.Text = "0"
Txt_AvenPr60.Text = "0"
Txt_AvenPr90.Text = "0"
Txt_AvenPr120.Text = "0"
Txt_VenPr30.Text = "0"
Txt_VenPr60.Text = "0"
Txt_VenPr90.Text = "0"
Txt_VenPr120.Text = "0"
Txt_AvenPu180.Text = "0"
Txt_VenPu180.Text = "0"
Txt_VenPu270.Text = "0"
Txt_VenPu360.Text = "0"
' Vuelve al principio de la carga
Txt_MesAno.SetFocus
End Sub

La rutina, que te había pasado antes es la que valida el ingreso de fecha en un textbox de un formulario para impedir que pueda grabarse por ej. "31/02/2018" o "02/0k/2018" y al pulsar el boton "salir sin grabar" igual me sale el mensaje de fecha invalidada, tal como se ve en la imagen:

[Hola

Coloca el archivo en algún "Drive" y comparte por aquí el enlace ya que parece que hay "algo" que sigues sin mostrar y que es lo que probablemente hace que ocurra algo como lo que comentas.

Abraham Valencia

https://1drv.ms/x/s!AqNBGOJKhopsg0zS_U6btrrruiVY 

Acá va el link para que veas la planilla de excel,  la rutina está inserto el formulario form_carga...

Gracias por dedicarme tiempo en un domingo!

Saludos desde Paraguay!

[Hola

Ya vi tu archivo y lo que ocurres es que se genera un bucle "casi" infinito. En el evento "Exit" del "Txt_MesAno" has colocado que cuando no tiene ocho caracteres (cuando está vacío por ejemplo) se cancela el evento lo que hace que el foco regrese a "Txt_MesAno", entonces al dar click en tu botón de "salir sin guardar", el evento "exit" y el "cancel" retornan siempre al mismo "Txt_MesAno".

En general los programadores recomendamos no usar los eventos "Exit" o "Change" para dar/forzar formatos, así como también se recomienda de preferencia no usar "On Error Resume Next" (a menos que sea estrictamente necesario) así como también ser recomienda usar controladores de error ( If Err. Number <> 0...) solo cuando realmente se quiere saber que error ocurre y no como parte de un código de validación u otro.

Pero bueno, después de la teoría vamos a la solución. Para que no estés cambiando muchas cosas y que mantengas lo mismo que ya estás aplicando, borra los "Cancel = True" y reemplázalos por "Exti Sub" (obviamente sin las comillas). Luego agrega esto al módulo del "UserForm":

Private Sub Com_Salir_Enter()
End
End Sub

Prueba y comenta.

Abraham Valencia

PD: Ojo, yo no lo haría así pero insisto, son salidas para que no tengas que cambiar casi nada

¡Gracias Abraham! 

Con esa solución sale del bucle, aunque eso hace que no valide correctamente, lo cual de alguna manera era de esperar por los errores desde su concepción como tu bien lo señalas. Gracias de nuevo y buen inicio de semana para ti!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas