Jump to content
DanielaAlcala22

USERFORM- INTERFAZ DE USUARIO

Recommended Posts

Hola a Todos! Volvi! :D ya se que me extrañaban. Esta vez traje un problema de userform o interfaz grafica. Veran, Si inician en el userform llamado "Bienvenida" veran el inicio de una sucecion de userforms que uso para intentar simular un software en excel. La secuencia de los cuadros seria la siguiente:

Bienvenida ----> Frm_Tipo (Se clickea el boton de "Rectangular" ) -----> Frm_Rect (Se clickea "Siguiente") -----> Frm_PropSuelo (Se clickea "Siguiente") -----> Eleccion_Fuerzas

Al llegar a este ultimo Userform quisiera que notaran todos los codigos que hice para que se plegaran y desplegaran controles dependiendo de las preferencias del usuario. Mi problema es que quiero que al hacer click en el boton de "Siguiente" de este ultimo UserForm (Eleccion_Fuerzas) no permita la accion de avanzar hasta que todos los campos de de datos requeridos esten rellenados y salga un cuadro de texto diciendo que no se han completado todos los campos de datos requeridos, si este es el caso. La complicacion esta en que en la seccion "Dinamica de la maquina" los campos que se deben rellenar van a depender de una serie de opciones que se le dan a elegir al usuario:

Si se pincha en el boton "Introducir manualmente" se desplegaran 6 casillas para introducir datos, mientras que si pincho el boton "Que el programa calcule" me aparece un cuadro lista que me dara otra opcio para elegir el funcionamiento de la maquina, en las cuales cada una tiene sus datos requeridos. Por ejemplo: Si elegiera "Introducir Manualmente" solo me importarian las llenar las 6 casillas que se hacen visibles al elegir esta opcion, las demas no. 

He tratado de que el codigo dicierna y ejecute la logica explicada en el parrafo anterior con ua estructura de control If... End If, mas sin embargo al probarla dejando datos faltantes en la opcion de "Rotativo" y "Reciprocante" no se muestra el mensaje informando esta situacion. Como el excel en el que estoy trabajando es algo pesado no puedo cargarlo para que lo descarguen directamente desde aqui, asi que abajo les dejare un link de descarga, para que vean por ustedes mismos de lo que hablo. De verdad apreciaria muchisimo su ayuda! de antemano muchas gracias.

https://drive.google.com/file/d/0B-oxpk4dIff-Y0V1Y3dtUEQzZ3M/view?usp=sharing

Share this post


Link to post
Share on other sites

No sé si te he entendido bien @DanielaAlcala22 : solo quieres que en el formulario Eleccion_Fuerzas, no pase al siguiente userform.

Si es así, el código sería:
 

Private Sub CommandButton1_Click()
If OptionButton1.Value = True Then
If TextBox11.Value = "" And TextBox12.Value = "" And TextBox13.Value = "" And TextBox14.Value = "" And TextBox15.Value = "" And TextBox16.Value = "" Then
MsgBox "NO DEJAR VACIOS"
End If
End If

If OptionButton2.Value = True Then
If ComboBox1.Value = "" Then
MsgBox "NO DEJAR VACIOS"
End If
End If
Unload Eleccion_Fuerzas
Frm_Circ.Show
End Sub

donde:

  • CommandButton1 es el botón que tienes en ese formulario que es "siguiente"
  • los unload y show de userforms, el al boleo, no sé cúal vendría después
  • En los MsgBox lo que tu quieras

Share this post


Link to post
Share on other sites

Te comento que para lo que solicitas yo utilizo una función UDF.

Public Function ControlesVacios(xTag As String, xForm As UserForm, Optional xContenedor As Object, Optional Switch As Boolean) As Boolean

Dim xCtrl As Control

If Switch = True Then
  For Each xCtrl In xContenedor.Controls
        If xCtrl.Tag = xTag And xCtrl = Empty Then
            ControlesVacios = True
            MsgBox "Debe rellenar el campo: " & UCase(xCtrl.ControlTipText), vbInformation
            xCtrl.SetFocus
            xCtrl.BackColor = RGB(211, 255, 211)
            Exit Function
        End If
    Next

Else

    For Each xCtrl In xForm.Controls
        If xCtrl.Tag = xTag And xCtrl = Empty Then
            ControlesVacios = True
            MsgBox "Debe rellenar el campo: " & UCase(xCtrl.ControlTipText), vbInformation
            xCtrl.SetFocus
            xCtrl.BackColor = RGB(211, 255, 211)
            Exit Function
        End If
    Next
End If

End Function

Y esta función me sirve para todos los formularios de cada proyecto.

Lo único que debes hacer es colocar el mismo texto en la propiedad TAG de cada control que quieras validar, y colocarle texto en la propiedad ControlTipText.

xContenedor y Switch están como Optional porque se usan solo si los controles que quieres validar se encuentran dentro de un Frame, por lo que si los controles que quieres validar están dentro de un Frame, debes llenar esos campos dentro de la fórmula, de lo contrario no son necesarios esos campos de la fórmula.

Cualquier duda me comentas

Share this post


Link to post
Share on other sites

@aaquino Muchas gracias por compartirme tu funcion, pero a decir verdad no la entiendo muy bien, debe ser por que mi nivel de conocimiento en los terminos y la cantidad de propiedades de  vba no es tan avanzado. Y como no lo entiendo, no se como lo podria aplicarlo a mi caso particular. Osea, me imagino que debo quitar o añadir algo ya que los excels que tu haces no pueden ser iguales al que estoy haciendo yo en este momento. Ademas, no se si leiste todo el testamento de explicacion que escribi arriba jaja xD, pero el formulario Eleccion_Fuerzas  es un poco diferente al resto y los valores que quiero validar van a depender de las opciones que haya elegido el usuario, asi que no se si aun asi podria aplicar tu funcion.

 

@Haplox, Lo que quiero hacer es que el codigo no permita que se avance al proximo formulario con un  MsgBox si falta por introducir algun valor, dependiendo de ciertas opciones. En el codigo que acabas de adjuntar veo que haces casi lo mismo que hago yo en el mio o.o, entonces no se por que a ti te funcionaria y a mi no  TToTT

Share this post


Link to post
Share on other sites

@Haplox, si notas el codigo mostrara el msgBox con el mensaje pero aun cuando el usuario no haya completado los campos se va es ejecutar de inmediato la accion 

Unload Eleccion_Fuerzas
Frm_Circ.Show

Que estas colocando justo despues del cierre del segundo If.

Edited by DanielaAlcala22

Share this post


Link to post
Share on other sites

Daniela, a ver si me he "enterao", lo que pretendes es validar la información del formulario Eleccion_Fuerzas al pulsar el botón Siguiente, en base a las opciones elegidas. ¿Cierto?

Edited by Antoni

Share this post


Link to post
Share on other sites

@Antoni, Es justamente el concepto que quiero O: Muchas gracias!.  Lo probe y si se detiene cuando faltan datos, y por lo que vi tambien si se introduce un valor que no sea numerico, Pero me estoy dando cuenta que cambiaste todo el codigo que habia puedo antes xD, asi que estoy tratando de entender bien que hiciste. 

Share this post


Link to post
Share on other sites
Hace 13 horas, DanielaAlcala22 dijo:

@Haplox, si notas el codigo mostrara el msgBox con el mensaje pero aun cuando el usuario no haya completado los campos se va es ejecutar de inmediato la accion 

Unload Eleccion_Fuerzas
Frm_Circ.Show

Que estas colocando justo despues del cierre del segundo If.

Sí, tienes razón @DanielaAlcala22 , lo hize sobre la marcha. el código sería:

Private Sub CommandButton1_Click()
If OptionButton1.Value = True Then
If TextBox11.Value = "" And TextBox12.Value = "" And TextBox13.Value = "" And TextBox14.Value = "" And TextBox15.Value = "" And TextBox16.Value = "" Then
MsgBox "NO DEJAR VACIOS"
Exit Sub
End If
End If

If OptionButton2.Value = True Then
If ComboBox1.Value = "" Then
MsgBox "NO DEJAR VACIOS"
Exit Sub
End If
End If
Unload Eleccion_Fuerzas
Frm_Circ.Show
End Sub

 

Share this post


Link to post
Share on other sites
Hace 9 horas, DanielaAlcala22 dijo:

@Antoni, ....... Pero me estoy dando cuenta que cambiaste todo el código que había puedo antes xD, asi que estoy tratando de entender bien que hiciste. 

Hace exactamente lo mismo que hacía antes, pero un poco mas estructurado y adecuado a los distintos eventos. Por ejemplo, los combos solo es necesario llenarlos una vez o solo es necesario preguntar por una opción, ya que si una de ellas está activada, es evidente que la otra no lo va a estar. si tienes alguna duda, consultas.

Share this post


Link to post
Share on other sites

@Antoni ya estudie el codigo que hiciste y ya lo termine de entender, de verdad que tu codigo es mucho mas estilizado que el mio :D como se nota que aun soy principiante en esto de la programacion en vba y me falta mucho por aprender, pero alli vamos.

@Haplox, muchas gracias por tu colaboracion, tambien observe el ultimo codigo que has compartido y me parece que de esa manera el programa tambien haria lo que quiero que haga. 

Ahora, me gustaria poder hacerles otra pregunta del mismo proyecto en el que estoy trabajando. En el UserForm llamado "Frm_Tipo" me da la posibilidad de elegir entre una cimentacion rectangular o circular, y dependiendo de cual se elija aparecera el userform "Frm_Rect" para cimentaciones rectangulares o "Frm_Circ" para cimentaciones Circulares. A mi me gustaria que cuando uno llegue al userform que le sige a estos (Osea, el "Frm_PropSuelos) este se podria devolver al userform anterior, ya sea que haya elegido el cimiento rectangular o circular. Ejemplo: Si en la cadena de UserForm elegi irme por el camino del cimiento circular, cuando llegue a "Frm_PropSuelo" pueda devolverme al dicho formulario. Como podria hacer eso?

Yo lo quise hacer con una estructura de control If-EndIf :

If Frm_Tipo.Boton_Rect = True Then

  Frm_PropSuelo.Show
  Frm_Rect.Hide

End If

If Frm_Tipo.Boton_Circ = True Then

  Frm_PropSuelo.Hide
  Frm_Circ.Show

End If

Pero me daba error. Podrian ayudarme con eso?

 

Share this post


Link to post
Share on other sites

No se por que pero mi excel no muestra las propiedades de formulario Load y Unload. Por eso es que cuando quiero quitar un formulario para pasar a otro tengo que usar las propiedades Hide y Show, pero he leido  que lo malo de usar estas propiedades en vez de Load y Unload es que Hide no quita el formulario sino que lo minimisa y el formulario queda en memoria, lo cual no es muy bueno si tienes gran cantidad de formularios como es mi caso por que harias que el programa sea muy pesado. Esto es cierto? Cuales son las diferencias entre Hide y Unload y entre Show y Load. Por que no me aparecen las propiedades Load y Unload? Esto es normal? a que se debe?

Share this post


Link to post
Share on other sites

Otra cosa que me gustaria preguntar es si hay alguna manera de que la ventana del formulario no se cierre cuando se le de a la X que esta en el la esqina superior derecha, esto lo pregunto para que el usuario no pueda simplemente saltarse el formulario.

Share this post


Link to post
Share on other sites

Otra pregunta es si es posible que el excel este como no visible o minimizado cuando se esten ejecutando los formularios?, esto con el fin de que el ususario no pueda ver el contenido de las hojas de calculo mientras llena el formulario. habra una forma?

Share this post


Link to post
Share on other sites

vamos por partes @DanielaAlcala22

- Para el tema de los formularios (mostrar y descargar)

Private Sub Boton_Circ_Click()

Unload Frm_Tipo
Frm_Circ.Show

End Sub

Private Sub Boton_Rect_Click()

Unload Frm_Tipo
Frm_Rect.Show

End Sub

El tema de Show, Hide y Unload es un poco espinosillo...:ph34r: . Usando el Show cargas directamente el userform en memoria, para poder trabajar con él. Ahora tienes 2 formas de ocultarlo:

  • Hide: solamente lo hace invisible, pero NO descarga los datos, variables, objetos, etc. de la memoria
  • Unload: Pues justo lo contrario, lo oculta y descarga de la memoria todo lo referente al userform.

 

Hace 2 horas, DanielaAlcala22 dijo:

Otra cosa que me gustaria preguntar es si hay alguna manera de que la ventana del formulario no se cierre cuando se le de a la X que esta en el la esqina superior derecha, esto lo pregunto para que el usuario no pueda simplemente saltarse el formulario.

El código sería:
 

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

If CloseMode = 0 Then
MsgBox "debe abandonar el formulario pulsando el botón correcto"
Cancel = 1
End If
End Sub

Si no quieres que aparezca el mensaje, pues eliminas esa línea

 

Hace 2 horas, DanielaAlcala22 dijo:

Otra pregunta es si es posible que el excel este como no visible o minimizado cuando se esten ejecutando los formularios?, esto con el fin de que el ususario no pueda ver el contenido de las hojas de calculo mientras llena el formulario. habra una forma?

Tienes que colocar el código en el WorkBook. El código sería:

Private Sub Workbook_Open()
Application.Visible = False
Bienvenida.Show
End Sub

Si utilizas este método, asegurate que, junto con todo lo explicado, teines el botón para salir de la aplicación (Application.Quit). Si no excel se queda cargado en memoria y empiezan los problemas ;)

Edited by Haplox

Share this post


Link to post
Share on other sites

1) Que me recomiendas usar para quitar Los Userforms que ya utilice? El Hide o el Unload?
2) Gracias por los codigos, pero no entiendo bien cuando dices:

3 hours ago, Haplox said:

Si utilizas este método, asegurate que, junto con todo lo explicado, teines el botón para salir de la aplicación (Application.Quit). Si no excel se queda cargado en memoria y empiezan los problemas ;)

3)No sabes como indicarle al programa cuando se a apretado un boton o otro? :(.... @Haplox

Edited by DanielaAlcala22

Share this post


Link to post
Share on other sites
Hace 1 hora, DanielaAlcala22 dijo:

1) Que me recomiendas usar para quitar Los Userforms que ya utilice? El Hide o el Unload?

El programa es tuyo @DanielaAlcala22 :D... Usa el Unload, descargas la memoria

Hace 1 hora, DanielaAlcala22 dijo:

2) Gracias por los codigos, pero no entiendo bien cuando dices:

No hagas mucho caso ;). El problema lo tienes cuando ocultas la ventana de excel y cierras los userform desde la "X". En ese caso excel no se descarga de la memoria de windows (aunque no lo veas), es como si estuviese abierto (vamos, de hecho sigue abierto pero con la ventana oculta).

Por eso si abres otra instancia de excel entran en conflicto y empiezan los problemas. Por eso lo del botón de salir de excel en los formularios (Application.Quit), para cerrar excel por completo

Hace 1 hora, DanielaAlcala22 dijo:

3)No sabes como indicarle al programa cuando se a apretado un boton o otro? :(....

Es que el programa ya sabes cuando lo aprietas... ¡Justo cuando lo presionas! Un CommandButton no es un botón de opciones (al estilo de los OptioButton) por eso tienen su propio evento "Click", para ejecutar una acción cuando lo pulsas... y si no lo pulsas, pues no hace nada :rolleyes:

Edited by Haplox

Share this post


Link to post
Share on other sites
2 hours ago, Haplox said:

Es que el programa ya sabes cuando lo aprietas... ¡Justo cuando lo presionas! Un CommandButton no es un botón de opciones (al estilo de los OptioButton) por eso tienen su propio evento "Click", para ejecutar una acción cuando lo pulsas... y si no lo pulsas, pues no hace nada :rolleyes:

 @Haplox, entiendo lo que dices. No se si has descargado mi excel y te has puesto a ver de que va mi formulario, pero yo me refiero a que en el formulario Frm_Tipo tengo 2 botones, uno te llevara a que rellenes los datos para una cimentacion rectangular y otra para una cimentacion circular. Luego, dependiendo de que boton haya pulsado el usuario se deben desencadenar una sucecion de procesos que son distintos para cada opcion, por lo que no se como hacer para hacerle entender eso a la maquina, puesto que el control Boton no posee propiedad value. 

Share this post


Link to post
Share on other sites

Gracias por toda su ayuda! ya  casi termino mis formularios! lo que me falta es una funcion o codigo que una vez que haya terminado de llenar todos los formularios estos queden con sus casillas vacias para cuando quiera reiniciar el proceso, averigue y aqui esta un codigo para hacer lo que acabo de describir, sin embargo cuando lo coloco en el userform me lanza un error:

Sub LimpiarCampos(ByVal formulario As Form)
        Dim Text As Object

        For Each Text In formulario.Controls
            If TypeOf Text Is TextBox Then
                Dim txtTemp As TextBox
                
                txtTemp = CType(Text, TextBox)
                txtTemp.Text = ""

            End If
        Next
End Sub

 

Share this post


Link to post
Share on other sites

Prueba así:

Sub LimpiarCampos(Formulario As Userform)
        Dim Text As Control

        For Each Text In formulario.Controls
            If TypeOf Text Is TextBox Then
                Text = ""
            End If
        Next
End Sub

 

Edited by aaquino

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png