Option Button

22/05/2007 - 23:49 por Luis | Informe spam
Qué tal??! Podrían ayudarme con lo siguiente??

En un formulario (UserForm1) tengo los siguientes controles: un
textbox1, un textbox2 y textbox3, y en otro formulario (UserForm2)
tengo dos option button opt1 y opt2.
Textbox1, textbox2 y textbox3 se cargan con valores (números con dos
decimales aunq es posible que alguno de ellos sea cero) deseo que al
escoger uno de los option button se sume inmediatamente cierto valor a
cada textbox (Si es opt1 se sume 15, si es opt2 se sume 21 a c/
textbox). He intentado hacerlo asociando un procedimiento al evento
click de cada optionbutton de la siguiente manera para cada option
button obviamente utilizando el valor correpondiente (15 o 21):

Sub opt1_Click()
If optX.value=true then
textbox1.text=val(textbox1.text)+15
textbox2.text=val(textbox2.text)+15
textbox3.text=val(textbox3.text)+15
Else
textbox1.text=val(textbox1.text)-15
textbox2.text=val(textbox2.text)-15
textbox3.text=val(textbox3.text)-15
End If
End Sub

Pero no funciona pues:
1. Al hacer click en uno de los option button SIEMPRE se tendrá un
valor TRUE por lo cual nunca entra a Else
2. Pensé en hacerlo de la siguiente manera (reitero dependiendo del
option button para opt2 sería -15+21):

Sub opt1_Click()
If optX.value=true then
textbox1.text=val(textbox1.text)-21+15
textbox2.text=val(textbox2.text)-21+15
textbox3.text=val(textbox3.text)-21+15
End If
End Sub

Pero qué sucede si he ingresado por 1era vez a UserForm2? No hay razón
para restar primero 21 y luego sumar los 15, se debería sólamente
sumar 15.

3. Imaginen que uno de los textbox tiene el valor cero al restar
-21+15 me quedaría -6!! y obviamente eso es incorrecto

Espero hayan comprendido mi inquietud y ojalá puedan ayudarme.


Saludos!!

Preguntas similare

Leer las respuestas

#1 Ivan
23/05/2007 - 01:27 | Informe spam
hola Luis,

a lo mejor estoy un poco espeso hoy, pero me he hecho un pequeño 'taco' con tu explicacion.

pero me imagino que lo que quieres en definitiva es que si eliges un optionButton te sume 15 a los textbox y si eliges
el otro te sume 21, pero solo una vez, osea que si cambias de opcion el valor del textbox sea el inicial mas 15 o 21
pero sin incrementarlo cada vez,

y si te medio entiendo, tampoco quieres que al iniciar el formulario, al estar un de los dos botones como predeterminado
no te incremente su respectiva cantidad hasta que tu hagas click real en uno de ellos.

para esto ultimo tienes la opcion de poner a false la prop. value de los dos opttion button en le mismo cuadro
propiedades, o via codigo, asi no dispararias el evento change ni click de los optionsB hasta que no hicieras click real
en ellos.

para el resto podrias usar la propiedad Tag del textbox (o una variable publica en un modulo normal) para almacenar el
valor del textbox antes de modificarlo con los optionbutton, actualizandola en el change del textbox pero
condicionandola con otra variable publica tipo boolean, para que no se actualice si los cambios se deben a los
optionbutton.

bueno, no se si se me entiende algo, pero si quieres prueba este ejemplo hecho con dos userform (pon su propiedad
showModal a false en el cuadro propiedades.)

1.- en el Userform1 pon un commandbutton (1) y un textbox (1) y en su modulo de codigo pega esto:

Private Sub CommandButton1_Click()
UserForm2.Show
End Sub

Private Sub TextBox1_Change()
If SumarVal Then Exit Sub
With TextBox1: .Tag = .Text: End With
End Sub

Private Sub UserForm_Initialize()
TextBox1.Tag = 0
End Sub

2.- en el userform2 pon los dos optionbutton(1 y 2) y en su modulo pega esto:


Private Sub UserForm_Initialize()
OptionButton1 = False
OptionButton2 = False
End Sub

Private Sub OptionButton1_Click()
SumarVal = True
With UserForm1.TextBox1
If OptionButton1 Then .Text = Val(.Tag) + 15
If OptionButton2 Then .Text = Val(.Tag) + 21
End With
SumarVal = False
End Sub

Private Sub OptionButton2_Click()
SumarVal = True
With UserForm1.TextBox1
If OptionButton1 Then .Text = Val(.Tag) + 15
If OptionButton2 Then .Text = Val(.Tag) + 21
End With
SumarVal = False
End Sub

3.- en el area de declaraciones de un modulo normal pon:

Public SumarVal As Boolean

espero te ayude, y si la consulta iba por otros derroteros, disculpa mi torpeza

un saludo
Ivan
Respuesta Responder a este mensaje
#2 Luis
24/05/2007 - 23:03 | Informe spam
Envié una respuesta anteriormente pero no se publicó... Gracias por tú
ayuda y por tú atención!!

Básicamente tengo una duda... qué sucede si al Userform2 le agregamos
2 checkboxes que suman al valor del textbox 1: checkbox1 38 y
checkbox2 52??? cómo puedo manejar el incremento??

Saludos y Muchas Gracias otra vez!!!
Respuesta Responder a este mensaje
#3 Ivan
25/05/2007 - 00:00 | Informe spam
hola Luis,

estamos un poco en las mismas:

¿a que valor querrias que se sumaran las cantidades de los checkbox?¿al valor del textbox sin o con el incrmento de los
option button? ¿quieres que se sume al marcar los checkbox y se reste al desactivarlos, o quieres que siempre se
incremente?¿en este ultimo caso, quieres que se incremente solo una vez o, si desmarcas y vuelves a marcar se sume otra
vez la cantidad?

y, respecto a los optionbutton ¿en caso de añadir una cantidad con los checkbox, que valor deben tener en cuenta, el
resultante de la operacion con los checkbox o el que se efectue solamente mediante cambios directos en el textbox?

bueno, lo mismo te lio mas que otra cosa, pero si te animas a comentar un poco estos detalles creo que sera mas facil
intentar echarte una mano

un saludo y hasta pronto
Ivan

PD: lo mismo soy yo, que ultimamente tengo la neurona un poco vaga
Respuesta Responder a este mensaje
#4 Luis
25/05/2007 - 00:29 | Informe spam
Sabes encontré la solución con el siguiente código, tal vez se la
puede mejorar si es así please avísame:

en UserForm1:

Private Sub CommandButton1_Click()
UserForm2.Show
End Sub

Private Sub TextBox1_Change()
If SumarVal Then Exit Sub
With TextBox1: .Tag = .Text: End With
End Sub

Private Sub UserForm_Initialize()
TextBox1.Tag = 0
End Sub

y en UserForm2:

Private Sub CheckBox1_Click()
SumarVal = True
If UserForm2.CheckBox1 = True Then
With UserForm1.TextBox1: .Text = (.Text + 38): End With
With UserForm1.TextBox1: .Tag = (Val(.Tag) + 38): End With
Else
If UserForm1.TextBox1.Text > Tag Then
With UserForm1.TextBox1: .Text = (.Text - 38): End With
With UserForm1.TextBox1: .Tag = (Val(.Tag) - 38): End With
End If
End If
SumarVal = False
End Sub

Private Sub CheckBox2_Click()
SumarVal = True
If UserForm2.CheckBox2 = True Then
With UserForm1.TextBox1: .Text = (.Text + 52): End With
With UserForm1.TextBox1: .Tag = (Val(.Tag) + 52): End With
Else
If UserForm1.TextBox1.Text > Tag Then
With UserForm1.TextBox1: .Text = (.Text - 52): End With
With UserForm1.TextBox1: .Tag = (Val(.Tag) - 52): End With
End If
End If
SumarVal = False
End Sub

Private Sub OptionButton1_Click()
SumarVal = True
With UserForm1.TextBox1: .Text = (Val(.Tag) + 21): End With
SumarVal = False
End Sub

Private Sub OptionButton2_Click()
SumarVal = True
With UserForm1.TextBox1: .Text = (Val(.Tag) + 15): End With
SumarVal = False
End Sub

Private Sub UserForm_Initialize()
Tag = UserForm1.TextBox1.Text

CheckBox1 = False
CheckBox2 = False
OptionButton1 = False
OptionButton2 = False
End Sub

Donde Tag fue declarada de la siguiente manera en un módulo normal
como: Public Tag As Double

Saludos y Muchas Gracias!!!
Respuesta Responder a este mensaje
#5 Ivan
25/05/2007 - 02:07 | Informe spam
hola Luis,

aunque no he tenido tiempo de probar (ni casi de mirar lo que hacen los codigos) permiteme de momento que te haga un par
de apuntes sobre los codigos que expones, por si te fueran de utilidad:

1ª.- > Donde Tag fue declarada de la siguiente manera en un módulo normal
como: Public Tag As Double



en realidad, Tag es una propiedad que tienen por si mismos (al menos) los controles y formularios, igual que Text,
ForeColor, Top, etc. pero que de manera predeterminada 'viene' vacia.

Aunque no estoy muy ducho en el tema, si no me equivoco, uno de los usos que se le puede dar es para utilizarla un poco
como si fuera una especie de comodin en la que almacenar davtos, valores, aclaraciones sobre el codigo, ..., en fin creo
que casi cualquier cosa. Y puedes recuperar 'lo que contenga' haciendo referncia a ella como al resto de las
propiedades del objeto (pej, igual que para saber el texto del textbox usariamos: TextBox1.Text, para saber lo que hay
(o asignarle un vfalor) en la propiedad Tag usariamos TextBox1.Tag.

Y aqui, [ Tag = UserForm1.TextBox1.Text ] si no me equivoco, lo que estas haciendo es asignarle el valor del textbox1 a
la propiedad tag del formulario, pues, ( y como te digo no me hagas caso 100x100, pero creo que no me equivoco) cuando
usas el nombre de una propiedad/metodo en el modulo (de clase) de un objeto (pej: modulo del formulario, de una hoja, de
un libro [ThisWorkbook] ) sin punto delante (o sea sin asignarsela a un objeto en concreto) VBa asume que se esta
haciendo referencia a la propiedad con ese nombre (si la tiene) del 'propietario' del modulo, en este caso el UserForm2.
En realidad es como si hubieras puesto:

UserForm2.Tag = UserForm1.TextBox1.Text

lo que quiero decir es que, si como parece, solo usas Tag (sin punto) en el userform2, te puedes ahorrar la declaracion
de la variable publica 'Tag' (estarias usando la prop. Tag del form), y si por lo que fuese, mas adelante quisieras
usarla en otros modulos (normales o del otro formulario) quizas conviniese que le cambiase el nombre por uno que no
diera lugar a equivocos.

2ª en este tipo de expresiones de tu codigo:

If UserForm1.TextBox1.Text > Tag Then
With UserForm1.TextBox1: .Text = (.Text - 52): End With
With UserForm1.TextBox1: .Tag = (Val(.Tag) - 52): End With
End If



estas repitiendo un bloque with para hacer referncia al mismo objeto cuando (como poco) te valdria una sola vez.

ten en cuenta que los bloques WithEnd With', si no me equivoco, se utilizan fundamentalmente para estructurar el
codigo de una manera mas clara cuando hay que hacer mencion a varias propiedades y/o metodos de un mismo objeto,
evitando el tener que repetir tantas veces como menciones se hagan la secuencia: Objeto.Propiedad., y, evitandole a VBa
el tener que volver a recorrer la secuencia tantas veces como se repita.

en este caso, el uso llamemosle 'correcto' de with podria ser mas o menos asi:

With UserForm1.TextBox1
If .Text > Tag Then
.Text = (.Text - 52)
.Tag = (Val(.Tag) - 52)
End If
End With

si te das cuenta, todas las prop. que van precedidas de un punto son referidas al Textbox1 (en este caso, el 1er Tag,
que no lleva punto, estaria refiriendose al Tag del objeto dueño del modulo del codigo (userForm2), mientras que los
otros 2 se refieren al Tag del Textbox1(del UserForm1, en este caso)

bueno, espero no haberte hecho un lio, y se me haya entendido algo

en cualquier caso, si asi te esta funcionando, eso es lo que importa

en cuanto pueda le hecho un ojo al funcionamiento de las novedades

un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida