Campos obligatorios con mensaje de error
Hoy molesto por lo siguiente:
Quiero que 8 campos de mi Formulario principal sean obligatorios (pero no requeridos en diseño de tabla). Llamémosle texto1, texto2... Texto8
Con un botón de Guardar me indique dos cosas: Si están todos esos campos llenos un MsgBox que me pregunte si estoy seguro de guardar SiNo.
Si falta alguno de ellos que ese o esos campos se coloreé de, por ejemplo, amarillo y el MsgBox diga "Falta rellenar algunos campos" (si dijera cuál sería super).
Estos campos estarían identificados por un asterisco (tipo formulario de internet) o por la etiqueta de otro color (por ejemplo roja).
Con esto mi proyecto está quedando de diez.
Abrazos
1 Respuesta
Tabaré: Tua Aplicación quedará de "Diez", pero a los demás nos tienes exhaustos. Permite la broma.
En éste caso lo que yo haría es:
'Independientemente del Origen de Control que tenga los nombras Como>> TBox1, TBox2….. TBox8 Private Sub BtnGuarda_Click() Dim Ctrl As Access.Control Dim CadenaVacios As String CadenaVacios = "" For Each Ctrl In Me.Controls If Left(Ctrl.Name, 4) = "Tbox" Then If IsNull(Ctrl.Value) Or Ctrl.Value = "" Then Ctrl.BackColor = RGB(255, 255, 0) CadenaVacios = CadenaVacios & Ctrl.Name & "/ " End If End If Next Ctrl If Len(CadenaVacios) > 4 Then CadenaVacios = Left(CadenaVacios, (Len(CadenaVacios) - 4)) MsgBox "Los controles sin datos son:" & vbCrLf & vbCrLf & CadenaVacios, vbCritical, "NOMBRE DE LOS CONTROLES SIN DATOS" End Sub
Co ésto te avisará y te informará cuando hagas Click en el Botón que he llamado >> BtnGuarda
Mis saludos >> Jacinto
Jacinto, ya lo sé, soy consciente y no lo tomo para nada como con "mala onda", de hecho si no nadie contestaría... por ahí me tomo una ventajita que ustedes lo llevan en la sangre. Pero a mi me gusta esto y gracias a ustedes he aprendido bastante.
No gano un peso por esto, lo hago en mi trabajo para ordenar la situación y fíjate que yo soy "el que sabe" así que imagínate.
Te mando un abrazo, gracias a todos y me tomaré unas vacaciones, je je.
Jacinto, he colocado todo el código y funciona cuando faltan completar los campos.
Pero luego de completarlos quedan en amarillo y continúa saliendo el cartel de "Los controles sin datos son" vacío y no sale de eso. Es decir, acepto, vuelvo a apretar el botón Guardar y vuelve a salir el MsgBox.
Es más, quedan siempre coloreados incluso cambiando de registro a registros ya existentes.
Tengo que salir del formulario y volver a entrar para que quede todo en blanco
Ok. Cuando lo revises debería suceder que no pudiera salir de ese registro hasta que no se completen los campos. Porque por ahí el operario hace "trampa" se corre a otro registro y le hace un bypass a los campos requeridos
Tabaré: En un Modulo Estandard que tengas y si no es así creas uno con el Nombre de MdlNulos o como prefieras y pones ésta Función:
Public Function ControlesNulosEnForm(Frm As Form, Cancel As Integer) As Boolean On Error GoTo ControlesNulosEnForm_TratamientoErrores For Each Ctrl In Frm.Controls 'Voy directo al TipoTextBox y ComboBox, para que sea válido en ambos casos If TypeOf Ctrl Is TextBox Or TypeOf Ctrl Is ComboBox Then If Left(Ctrl.Name, 4) = "TBox" Or Left(Ctrl.Name, 4) = "CBox" Then 'Pueden ponerse otra u otras condiciones If Not IsNull(Ctrl.Value) Then Ctrl.BackColor = RGB(0, 255, 0) ControlesNulosEnForm = False Else ControlesNulosEnForm = True Ctrl.BackColor = RGB(255, 255, 0) Ctrl.SetFocus Ctrl.Locked = False MsgBox "Encontrado Control Nulo. " & vbCrLf & "Su Nombre es: " & Ctrl.Name, vbExclamation, "CONTROL NULO" Cancel = True End Exit Function End If End If End If Next Ctrl ControlesNulosEnForm_Salir: On Error GoTo 0 Exit Function ControlesNulosEnForm_TratamientoErrores: MsgBox "Error " & Err & " en Function.: ControlesNulosEnForm de Documento VBA: MdlControles (" & Err.Description & ")", vbCritical + vbOKOnly, "ATENCION" Resume ControlesNulosEnForm_Salir End Function
Ahora en el Botón BtnGuarda
Private Sub BtnGuarda_Click() Call ControlesNulosEnForm(Me.Form, 0) End Sub
Prueba así, sin poner el código en más eventos y haz la prueba de cambiar de registro y añadir uno y si te saltara sin hacer caso del código me comentas. Asegura que el Evento Click del Botón esté activado. Mis saludos >> Jacinto
Hola Jacinto. Lo probé y pasa lo siguiente:
Cuando aprieto el BtnGuarda automáticamente salta a error con un MsgBox que dice Error de Compilación
No se ha definido la variable
Y marca en azul Ctrl de la línea For Each Ctrl In Frm Controls (tercera línea)
Tabaré: Es lógico porque se ha declarar .
En Ese módulo que te he comentado, inmediatamente después de
Option Compare Database
Option Explicit
Public Ctrl As Access.Control
Mis saludos >> Jacinto
Jacinto, no había colocado Public Ctrl As Access.Control
Bueno, ahora si está bien el control sobre el campo faltante, además es mucho mejor que lo vaya indicando en orden
Pero pasan dos cosas, una es que puedo ir para atrás (es decir, salir del registro a otro anterior o a cualquiera). Esto lo "soluciono" sacando los botones de avanzar o retroceder. pero si cargo uno nuevo, el formulario ya me aparece de cero con los campos en verde, o si busco otro registro también me aparece pintado. Tengo que salir y volver a entrar para que se limpie.
Bueno Tabaré algo vamos avanzando.
Ahora en el Evento Form_Current (Al activar registro), si no lo tienes debes crearlo le pones éstas líneas de código. Entendiendo éste evento en el Formulario donde está el Botón
If Not Me.NewRecord Then Call ControlesNulosEnForm(Me.Form, 0) Else For Each Ctrl In Me.Controls If TypeOf Ctrl Is TextBox Or TypeOf Ctrl Is ComboBox Then If Left(Ctrl.Name, 4) = "TBox" Or Left(Ctrl.Name, 4) = "CBox" Then Ctrl.BackColor = RGB(255, 255, 255) End If End If Next Ctrl End If
No elimines ni ocultes los botones de Registro anterior y Posterior
Espero que ahora te quede resuelto. Mis saludos >> Jacinto
Hola Maestro, un fenómeno. El tema está 99%
Lo estuve probando y no encontré fallas. Los campos obligatorios quedan pintados pero eso no me molesta, hasta tiene lógica. Cualquier cosa le cambio el color por uno más suave.
El 1% sería que no me permita moverme (cambiar de registro) si no completé el campo, pero eso lo haría yo con un
Private Sub TboxAlcance_Exit(Cancel As Integer)
If IsNull(TboxAlcance) Then
MsgBox ("Debe ingresar el Alcance")
Cancel = True
End If
End Sub
Repetido en todos los Tbox
Otra "necesidad" es bloquearlos que lo haría así
Private Sub Form_Current()
If IsNull(Me.Id.Value) Then
With Me
Me.TboxCarátula.Locked = False
Me.TboxNúmero.Locked = False
Me.TboxAño.Locked = False
Me.TboxAlcance.Locked = False
Me.TboxIniciado.Locked = False
Me.TboxExtracto.Locked = False
End With
Else
With Me
Me.TboxCarátula.Locked = True
Me.TboxNúmero.Locked = True
Me.TboxAño.Locked = True
Me.TboxAlcance.Locked = True
Me.TboxIniciado.Locked = True
Me.TboxExtracto.Locked = True
End With
End If
End Sub
Lo desbloqueo con un ChkBox (escondido) Porque no sé como hacerlo desde otro formulario "Permisos" que sólo tengo acceso yo con contraseña (porque el Formulario principal está cerrado cuando el de Permisos está abierto)
Private Sub DesbloqCampos_Click()
Dim ctl As Control
For Each ctl In Me.Controls
If (TypeOf ctl Is TextBox) Or (TypeOf ctl Is ComboBox) Then
If ctl.Locked = True Then
ctl.Locked = False
Else
ctl.Locked = True
End If
End If
Next
End Sub
Esto lo hago porque no quiero bloquear todos los campos si no sólo esos 8 (me falta agregar TboxPartido y un Cuadro combinado de donde sale Partido).
Espero que no se genere un conflicto de código y todo funcione aceitado.
Esta BD crecerá mucho por todo el código o sólo crece por los datos que se agregan??
Bueno, si opinás algo de esto que agrego yo escribime. Espero no molestarte (por unos días:-)). El espíritu de ayuda te hace sentir mejor y los que nos beneficiamos con lo que sabés admirados y felices.
Un abrazo
Tabaré: Las iniciativas en cualquier situación son el primer escalón para la mejora, por tanto adelante con ellas. Además la práctica proporciona bastante autoridad sobre el estudio y comprensión, comprension y solución de un problema.
La verdad es que no veo bién el Evento _Exit en cada uno de los controles, ya que en éste caso concreto tienes 8, pero imagina que tienes 68. Quizá yo lo haría en el Evento LostFocus
Lo de los bloqueos también creo que se puede simplificar, pero en ambos casos es una apreciación personal, porque no hay un solo camino para llegar al Objetivo.
Ocurre que el texto de este hilo se va haciendo muy largo y un usuario interesado me temo se canse de leer y sería contraproducente.
Mi sugerencia es que en éste caso generaras "dos" preguntas con un texto parecido a...
1.- Bucle VBA para el bloqueo de varios controles de un Form
2.- Como programar el mismo evento en varios Controles de un Form
En ambos casos explica un poco la necesidad.
Saldrás beneficiado ya que puedes recibir más de una solución y adaptar la que creas más opurtuna a tu entorno. Mis saludos >> Jacinto
- Compartir respuesta