Campos llenos
Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86944
Fecha de impresión: 26/Marzo/2026 a las 17:41
Tema: Campos llenos
Publicado por: a.alf
Asunto: Campos llenos
Fecha de publicación: 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á.
|
Respuestas:
Publicado por: Mihura
Fecha de publicación: 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.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: Mihura
Fecha de publicación: 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.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: Mihura
Fecha de publicación: 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.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: Mihura
Fecha de publicación: 07/Junio/2024 a las 13:07
|
Para salirte de un bucle:
Exit For
------------- Jesús Mansilla Castells. Saludos desde Móstoles.
http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones http://www.tecsys.es" rel="nofollow - Tecsys.es
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: AnSanVal
Fecha de publicación: 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.
------------- Saludos desde Tenerife.
|
Publicado por: a.alf
Fecha de publicación: 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á.
|
Publicado por: AnSanVal
Fecha de publicación: 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.
|
Publicado por: a.alf
Fecha de publicación: 08/Junio/2024 a las 19:13
|
Asi es llamo ,mal llamados , campos a los cuadros de texto. Gracias de todos modos por tu tiempo.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: AnSanVal
Fecha de publicación: 08/Junio/2024 a las 19:15
¡Perdona a.alf! , al leer TxtBox, yo interpreté un formulario VBA, olvidé que un formulario Access es algo diferente. 
Para eso es mucho más fiable la ayuda del Sr. Miura (u otros del foro).
------------- Saludos desde Tenerife.
|
Publicado por: pitxiku
Fecha de publicación: 08/Junio/2024 a las 23:53
|
En tus primeros códigos tienes una variable: tr. A esa variable le asignas un valor en cada iteración con los cuadros de texto. Pero como le vas cambiando el valor, tendrás el estado dependiente del último cuadro de texto, no de los que te interesan.
Tienes que: o asignarle el valor sólo en una parte del If, o restar (o sumar) como te decía Ansaval:
Private Sub Form_Current() Dim ctl As Control Dim b As Boolean For Each ctl In Me.Controls If TypeOf ctl Is TextBox Then If Nz(ctl, "") = "" Then b = True Exit For End If End If Next If Not b Then MsgBox "Todos los cuadros de texto están rellenados" End If End Sub
|
En el código puedes poner lo del color de fondo, o puedes usar el formato condicional, con lo que se actualizará conforme escribas.
|
Publicado por: a.alf
Fecha de publicación: 09/Junio/2024 a las 09:17
Buenos días pitxiku. Gracias por interesarte por el tema. He utilizado tu código y al cambiar de registro no saca nunca el mensaje, ni estando todos los texbox llenos o vacíos. Si cambio la condición de comparación, lo muestra siempre.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: pitxiku
Fecha de publicación: 09/Junio/2024 a las 12:04
|
Antes de subir el código, lo probé en un formulario con una docena de cuadros de texto y funcionó correctamente. Verifica que cuando tiene que aparecer el mensaje, todos los cuadros de texto están rellenos, incluso aquellos que puedan estar ocultos; si es necesario, discrimina por nombre o por otra propiedad (Tag suele ser útil para estos casos). Si aún así no se muestra el mensaje, tendrás que revisar los cuadros de texto en el código, tomar su valor y longitud de texto, cargarlo en una lista o tabla, para ver luego el por qué.
|
Publicado por: a.alf
Fecha de publicación: 09/Junio/2024 a las 15:18
|
Tenias razón pitxiku. Tengo un campo oculto y no me había dado cuenta. Funciona correctamente.
Gracias a todos por ayudarme otra vez. Podéis cerrar el hilo.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
Publicado por: a.alf
Fecha de publicación: 08/Agosto/2024 a las 11:22
a.alf escribió:
Tenias razón pitxiku.Tengo un campo oculto y no me había dado cuenta. Funciona correctamente.
Gracias a todos por ayudarme otra vez. Podéis cerrar el hilo. |
Se puede cerrar el hilo.
------------- Un saludo.
Si alguien te regala su tiempo, agradecelo eternamente, ya que te está dando algo que nunca recuperará.
|
|