** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Campos llenos
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoCampos llenos

 Responder Responder Página  12>
Autor
Mensaje
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Tema: Campos llenos
    Enviado: 07/Junio/2024 a las 11:04
Buenos días.
Tengo un formulario con 58 campos de texto. Me justaría mandar un mensaje cuando todos los campos estén completados, si hay alguno que no lo esta, no hacer nada.
Tengo el siguiente codigo al evento "Al activar registro":

Private Sub Form_Current()
Dim ctrl As Control
' evito la actualización de pantalla
DoCmd.Echo False
   ' recorro todos los controles
   For Each ctrl In Me.Controls
   tr = 0
      ' en el caso de los cuadros de texto
      If ctrl.ControlType = acTextBox Then
      ' quito los controles que no me interesan
        If ctrl.Name <> "txtYear" Or ctrl.Name <> "Fecha" Or ctrl.Name <> "fechactu" Or ctrl.Name <> "idb" Or ctrl.Name <> "tr" Or ctrl.Name <> "ID" Then
         If Not ctrl = vbNullString Then
         ' si el control está lleno
         ctrl.BackColor = vbYellow 'Le pongo color para diferenciarlo
         tr = 1
         Else
         'si el control está vacio
         ctrl.BackColor = vbGreen 'Le pongo color para diferenciarlo
         tr = 0
         GoTo fin
      End If
      End If
      End If
   Next ctrl

   If tr = 1 Then
   MsgBox "Las citas para este dia estan completadas", vbInformation, "CITAS COMPLETAS"
   End If
   
fin:
End Sub

Después de mil pruebas no hay manera de que funcione como yo quiero. Lo miro y remiro pero no veo donde estoy fallando
No se lo que estoy haciendo mal.
Podríais ayudarme?
Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 11:27
... ¿y el fallo es?

Por cierto, en ese IF siempre se cumple condición ...

If ctrl.Name <> "txtYear" Or ctrl.Name <> "Fecha" Or ctrl.Name <> "fechactu" Or ctrl.Name <> "idb" Or ctrl.Name <> "tr" Or ctrl.Name <> "ID" Then

Si el control se llama "Fecha" cumple que es distinto de txtYear con lo que el If se va por el valor verdadero.

Podrías plantearlo:
If Ctlr.name = "xxx" or ctlr.name = "yyy" .... then
Else
.... aquí tus instrucciones
End if



Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 11:40
El fallo es que de la manera que esta ahora el código no me muestra nunca el mensaje.
He probado de mil maneras y o no lo muestra o lo muestra siempre, estén los campos llenos o alguno vacío.
Esa linea que dices la he quitado porque no me importa que lea esos campos también. Pero sigue sin funcionar.
El código esta así:

Private Sub Form_Current()
Dim ctrl As Control
' evito la actualización de pantalla
DoCmd.Echo False
   ' recorro todos los controles
   For Each ctrl In Me.Controls
   tr = 0
      ' en el caso de los cuadros de texto
      If ctrl.ControlType = acTextBox Then
      ' quito los controles que no me interesan
          If Not ctrl = vbNullString Then
         ' si el control está lleno
         ctrl.BackColor = vbYellow 'Le pongo color para diferenciarlo
         tr = 1
         Else
         'si el control está vacio
         ctrl.BackColor = vbGreen 'Le pongo color para diferenciarlo
         tr = 0
         GoTo fin
      End If
      End If
   Next ctrl
   If tr = 1 Then
   MsgBox "Las citas para este dia estan completadas", vbInformation, "CITAS COMPLETAS"
   End If
fin:
End Sub
Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 11:46
... que raro veo yo esto:

       If Not ctrl = vbNullString Then

prueba así:

      If Nz(ctrl, "") = "" then
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 11:55
He cambiado a tu opción pero hace lo mismo.
Lo curioso es que el bucle para siempre en el segundo campo, y en alguna de las pruebas que he hecho si que me marcaba todos los campos.

Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 12:48
¿que es para?

Estoy más adivinando que sabiendo lo que te ocurre ...
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 13:01
Tengo el formulario con los 58 campos, si tengo el código como lo envié, al cambiar de registro me colorea los dos primeros campos del registro. Si cambio el código quitando le "goto fin" me colorea todos los campos, en verde los vacíos y en amarillo los llenos.
La solución creo que pasa por al detectar el primer campo vacío salir del bucle. Pero no se como hacerlo sin que me afecte a la opción de campo lleno.
Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 13:07
Para salirte de un bucle:

          Exit For
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 13:19
Hola.
He puesto el código  así:
Private Sub Form_Current()
Dim ctrl As Control
' evito la actualización de pantalla
DoCmd.Echo False
   ' recorro todos los controles
   For Each ctrl In Me.Controls
   tr = 0
      ' en el caso de los cuadros de texto
      If ctrl.ControlType = acTextBox Then
          If Not ctrl = vbNullString Then
         ' If Nz(ctrl, "") = "" Then
         ' si el control está lleno
         ctrl.BackColor = vbYellow 'Le pongo color para diferenciarlo
         tr = 1
         Else
         'si el control está vacio
         ctrl.BackColor = vbGreen 'Le pongo color para diferenciarlo
         tr = 0
         Exit For
      End If
      End If
   Next ctrl
   If tr = 1 Then
   MsgBox "Las citas para este dia estan completadas", vbInformation, "CITAS COMPLETAS"
   End If
End Sub

Hace lo mismo que con el "Goto". 
Un registro con todos los campos llenos solo colorea los dos primeros campos y con uno que tiene solo dos o tres campos llenos también colorea los dos primeros solamente.

Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 13:47
La imagen siguiente es con la salida del bucle al encontrar el primer campo vacío en un registro  con cuatro campos llenos.


Esta es con un registro totalmente lleno y salida del bucle igual que la anterior.


Las dos siguientes son sin el "Exit for"


Es muy raro lo que ocurre.
Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5990
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 14:51

En lugar de controlar visualmente por colores, prefiero que controle VBA:


Private Sub CommandButton1_Click()

  Dim L_txt#

  L_txt = vacios

  If L_txt = 0 Then

    ' aquí las acciones a realizar.

  End If

End Sub


Private Function vacios()

  Dim miObjeto As Object

  For Each miObjeto In UserForm1.Controls

    If Left(miObjeto.Name, 7) = "TextBox" Then

      vacios = vacios - (miObjeto.Text = "")

    End If

  Next miObjeto

End Function



Saludos desde Tenerife.
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 15:43
Hola AnSanVal, gracias a ti también por intentar ayudarme.
he adaptado tu código así:

Private Function vacios()
  Dim miObjeto As Object
 For Each miObjeto In Me.Controls
    If Left(miObjeto.Name, 7) = "TextBox" Then
      vacios = vacios - (miObjeto.Text = "")
    End If
  Next miObjeto
End Function

Private Sub Form_Current()
'Dim ctrl As Control
'Dim tr As Integer
'' evito la actualización de pantalla
'DoCmd.Echo False
'   ' recorro todos los controles
'   For Each ctrl In Me.Controls
'   tr = 0
'      ' en el caso de los cuadros de texto
'      If ctrl.ControlType = acTextBox Then
'          If Not ctrl = vbNullString Then
'         ' If Nz(ctrl, "") = "" Then
'         ' si el control está lleno
'         ctrl.BackColor = vbYellow 'Le pongo color para diferenciarlo
'         tr = 1
'         Else
'         'si el control está vacio
'         ctrl.BackColor = vbGreen 'Le pongo color para diferenciarlo
'         tr = 0
'         Exit For
'      End If
'      End If
'   Next ctrl
'    If tr = 1 Then
'   MsgBox "Las citas para este dia estan todas asignadas", vbInformation, "CITAS COMPLETAS"
'   End If
Dim L_txt#
  L_txt = vacios
  If L_txt = 0 Then
    ' aquí las acciones a realizar.
    MsgBox "Las citas para este dia estan todas asignadas", vbInformation, "CITAS COMPLETAS"
  End If
End Sub


Así sale el mensaje siempre, este el registro con todos los campos llenos o vacíos.
Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5990
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 20:43
Sospecho que tus Cuadros de texto NO se llaman: TextBox1, TextBox2, TextBox3, etc.

Si estoy en lo cierto, nunca se cumplirá If Left(miObjeto.Name, 7) = "TextBox" Then... y al no encontrar coincidencias
«vacios» siempre regresará valiendo cero y por tanto If L_txt = 0 Then siempre será VERDADERO y siempre mostrará el mismo mensaje.




Editado por AnSanVal - 07/Junio/2024 a las 20:48
Saludos desde Tenerife.
Arriba
a.alf Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 19/Octubre/2006
Localización: Castello España
Estado: Sin conexión
Puntos: 508
Enlace directo a este mensaje Enviado: 07/Junio/2024 a las 22:40
AnsaVal estas en lo cierto. Mis campos se llaman: l800, l815, l830, l845, l900 ...


Un saludo.

Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
Arriba
AnSanVal Ver desplegable
Administrador
Administrador
Avatar

Unido: 16/Marzo/2005
Localización: España
Estado: Sin conexión
Puntos: 5990
Enlace directo a este mensaje Enviado: 08/Junio/2024 a las 17:43
Campos y Cuadros de texto son conceptos diferentes.

Si los nombres de tus Cuadros de texto son los que estás llamando campos,... el código que te ofrecí no te funcionará.

Saludos desde Tenerife.
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable