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

Respuesta
1

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

Tabaré: Mañana repaso el código y te comento ya que hoy aquí estarde. Mis saludos >> Jacinto

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas