:-S ¿Y tu me llamas cabezón a mi, MAÑO !!!? :-P Te cuento...aunque me enrolle un poco. (Todo en esta vida tiene una explicación y un por qué.) El comportamiento de Value y Text lo tengo claro, bastante claro, diría que clarísimo en VBA de Access, palabrita del niño jesús. Tambien tengo claro la utilizacion de Isnull() y la de Len (Ver contestacion que di a Victor Delgadillo) para determinar enVBA si un control texto (A) tiene algun caracter (B)o está vacio con la cadena «""» (C) o es «Null» Entonces...¿Donde ha estado el problema de todo esto, de este hilo que he abierto ? Aquí: Normalmente cuando hago un ejemplo, le hago dual, es decir en VBA+Access y en Visual Basic. En Visual Basic, genero un ejecutable ya que ocupa menos, se ejecuta mas rápido etc etc y para mi es mas facil de probar.... Si el ejemplo que me sale es bueno y le quiero utilizar yo, utilizo el EXE de VB y no la MDb de Access. La MDB la cuelgo en la pagina y yo utilizo el EXE Bien. Dicho esto, intento que los códigos de ambos sean lo más identicos posible, dentro de las diferencias sintacticas de ambos entornos, a fin de que, si quiero modificar/ampliar/rectificar algo, lo hago con un copy paste del codigo de VB al de VBA y/o viceversa. Bien, me pongo a hacer el ejemplo que nos ocupa (y que tu *NO* has probado por que no te ha salido de cierto sitio) y comienzo haciendole en VB. En VB estoy acostumbrado a utilizar la propiedad predeterminada de los TextBox, que no es otra que la «Text». En VB, no hace falta que el control tenga el foco para referirme a dicha propiedad. Dicho esto, pongo el codigo este para ver si los controles de texto de un determinado formulario estan o no vacíos y funciona perfectamente en VB: Dim C As Control For Each C In Controls If TypeOf C Is TextBox Then If Len(C.Text) = 0 Then MsgBox C.Name & " dicho campo hay que rellenarle", vbCritical Exit Sub End If End If Next efectivamente es,creo, un buen metodo para recorrer los «N» controles de un formulario y forzar al usuario que les rellene todos y no tener que estar pasando un Isnull(NombreCOntrol) uno por uno.(Imaginate un formulario con 20 controles, por ejemplo). Hombre, para formularios de Access con un control TextBox a controlar, pues sinceramente es mejor utilizar el Isnull() +Len si procede y listo.(O como dice Chea, el NZ) Vale. Cojo el codigo de VB y le pego en el proyecto de VBA. Como ya sabemos, no puedo utilizar la propiedad TEXT, ya que no es factible si el control no tiene el enfoque. Pues nada...cojo y planto: For Each C In Me.Controls If TypeOf C Is TextBox Then If Len(C.Value) = 0 Then MsgBox C.Name & " debe rellenar este dato.", vbCritical, "AVISO" Exit Sub End If End If Next si te das cuenta, solo he cambiado Text por Value, pues soy consciente de que enVBA hay que hacerlo asi, por lo del foco que te he comentado antes. Y de esta forma, tanto el codigo de VBA y VB son practicamente identicos a un 99%, que es lo que me interesa por cuestiones de mantenimiento. En esos momentos, que pruebo el codigo, sé a ciencia cierta que los controles que estén vacíos, son NULL seguro y no tienen cadena "" ya que les paso a través de una tabla y si alguno está vacío, seguro que es un NULL . (Esto explica lo que ha pasado a Juan, que ha borrado en tiempo de ejecución el texto de algun control de mi ejemplo y ha pasado a ser "" y no NULL, de ahi que le funcionara. Yo sin embargo, pasaba un NULL seguro, ya que cargaba desde una tabla con un campo vacioNULL, no con "") Pero lo que tambien es cierto es que en esos momentos, no me doy cuenta (AQUI estuvo mi fallo), que en esta situacion, aún no produciendo error, la expresion: Len(C.Value) = 0 no sirve para nada, efectivamente, pues C.Value es NULL en mi caso (No en el caso de Juan que es ""). Pero ponte en mi situacion...estoy haciendo simultaneamente el ejemplo en VB y en VBA y se me pasa por alto este detalle. Le doy vueltas y vueltas y vueltas...y no encuentro la explicacion. Corto por lo sano y pongo el codigo de mi primer post, como bueno, en el proyecto de Access, es decir: If IsNull(Me.TxtHost) Or IsNull(Me.TxtUsuario) Or IsNull(Me.TxtPassword) Then MsgBox "Rellene todos los datos del servidor de correo.", vbCritical, "AVISO" Exit Sub End If y efectivamente funciona perfectamente en el ejemplo VBA de Access. Entonces...aunque ya tenia funcionando el ejemplo de VB con el For Next y el de Access con el Isnull(), planto la duda aquí. Me piro al pueblo Regreso por la tarde-noche y me encuentro con vuestras respuestas. Me las leo etc etc y es cuando me doy cuenta que en VBA Len(C.Value) = 0 con C.Value=Null es un error de programacion (Insisto, el compilador no produce error y eso fue lo que me despistó.) Por eso muchas veces, que el compilador te suelte un error es MUY IMPORTANTE, por que te das cuenta donde estas metiendo la pata. Pero en este caso, se traga la sintaxis sin rechistar, sin producir error, peeeeeeeeero no funciona como yo quería. Esa ha sido la historia. Si has sido capaz de llegar hasta aquí sin dormirte y entender lo que quería decir, ya tiene su mérito, la verdad. Luego, despues de leer todo...me he dado cuenta que la mejor forma de compatibilizar sendos codigos en VB y VBA y que la labor de mantenimiento entre ambos programas, sea minima, en efecto, con poner en VBA C.SetFocus, soluciono el problema. Pero ojo, solo para este caso concreto que deseo que ambos codigos sean lo mas parecidos posibles. Arghhhhhh...se me han cansado los dedazos de escribir, MAÑO !!!