SetFocus rebelde

07/09/2006 - 03:44 por Ivan | Informe spam
Hola de nuevo a todos

Me ha surgido un 'extraño' problema con el SetFocus de un/unos
combobox de un formulario, al que no consigo hallar explicación.

Se trata de ocho combos 'asociados', por decirlo de alguna manera, por
parejas.

A ver si se explicarme:

los combos se cargan con el contenido de determinadas columnas de una
hoja de excel, que estan asociadas asi:

combo5 = columnaA=>Clave1-> combo1 = columnaB=>lo referenciado por
la clave1
combo6 = columnaC=>Clave2-> combo2 = columnaD=>lo referenciado por
la clave2
combo7 = columnaE=>Clave3-> combo3 = columnaF=>lo referenciado por
la clave3
combo8 = columnaG=>Clave4-> combo4 = columnaH=>lo referenciado por
la clave4

la cuestion es que cuando se introduce una entrada nueva(no
coincidente) en los combos 5, 6, 7 u 8, quiero que me mande el foco al
combo de la clave correspondiente para que introduzca la nueva clave,
pero no se que estoy haciendo mal que no lo consigo.

por ej. en los codigos que expongo a continuación, intento mandar el
foco del combo4 al combo8, pero se va al combo6. Por mas que he
revisado todos los codigos no encuentro la causa. Estos son los
codigos:

dim YaEsta as boolean

Private Sub cmbBalda_AfterUpdate()
If YaEsta = False Then
cmbClave4.SetFocus
MsgBox ("Tienes que introducir una nueva clave")
Exit Sub
End If
End Sub

Private Sub cmbBalda_Change()
With cmbBalda
YaEsta = .MatchFound
If YaEsta = True Then
cmbClave4.ListIndex = .ListIndex
Else
cmbClave4.ListIndex = -1
End If
End With
End Sub

cmbBalda seria el combo4 y cmbClave4 seria el combo8. Tambien he
probado en el evnto exit, pero hacia lo mismo pero con doble msgbox.

quizas este(el problema) en otras partes del codigo, pero por mas que
le doy vueltas no veo nada.

Si podeis ayudarme os lo agradezco.

un saludo y hasta pronto
ivan

Preguntas similare

Leer las respuestas

#1 Ivan
07/09/2006 - 23:14 | Informe spam
Hola Hector Miguel, y de nuevo muchas gracias.

si no te importa, hay una cosa que no acabo de tener claro en los
codigos:

Dim Ajustando As Boolean
Private Sub ComboBox1_Change()
Ajustando = True
ComboBox2.Clear
ComboBox2.List = Range(ComboBox1).Value
Ajustando = False
End Sub
Private Sub ComboBox2_Change()
If Ajustando Then Exit Sub
If Not ComboBox2.MatchFound Then _
MsgBox "Selecciona la categoria apropiada !!!": _
ComboBox1.SetFocus
End Sub



o me equivoco o ajustando siempre seria falso al salir del change del
combo1, ¿las variables booleanas se inicializan en verdadero al
declararlas, o dicho de otra manera, mientras no se declare lo
contrario?¿si no es asi como le puede llegar el valor verdadero al
combo2?

En cualquier caso creo que me puede valer algo parecido, aunque (sin
probarlo) no es exactamente lo que deseo que hagan los combos.

Lo que me gustaria es algo parecido a lo siguiente:

supongamos dos combos: ComboClave y ComboDefinicion

en un rango de dos columnas de una hoja inaccesible al usuario, se van
almacenando las nuevas entradas en los combos.

La cuestion es que si se va escribiendo en el comboClave(pej) vayan
apareciendo en el comboDefinicion (y viceversa) la definicion
correspondiente a la clave visualizada en el comboClave.

Esto no parece complicado al tener el mismo indice de fila en el rango
de origen(listindex=listindex), el problema es cuando no existe
coincidencia (digamos que se crea una nueva entrada) de lo escrito con
lo contenido en ese mismo combo, entonces me interesa que al salir del
combo (para dar pie a acabar de escribir lo que se desee, debe ser al
salir y no al desaparecer la coincidencia <MatchFound>), el foco se
vaya al otro combo para rellenar la definicion/clave que le corresponde
a la nueva entrada, y que a su vez no se borre lo escrito en el primer
combo, y asi poder cargarlo en la hoja al aceptar.

Por cierto los combos se llenan (al menos inicialmente) al
inicializarse el formulario.

Bueno no se si me he explicado, en cualquier caso muchas gracias, y si
ves algo te lo agradezco.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#2 Héctor Miguel
08/09/2006 - 00:16 | Informe spam
hola, Ivan !

si no te importa, hay una cosa que no acabo de tener claro en los codigos:
Dim Ajustando As Boolean
Private Sub ComboBox1_Change()
Ajustando = True
ComboBox2.Clear
ComboBox2.List = Range(ComboBox1).Value
Ajustando = False
End Sub
Private Sub ComboBox2_Change()
If Ajustando Then Exit Sub
If Not ComboBox2.MatchFound Then _
MsgBox "Selecciona la categoria apropiada !!!": _
ComboBox1.SetFocus
End Sub



__ 1 __
o me equivoco o ajustando siempre seria falso al salir del change del combo1



[R] es correcto, en este caso... el evento '_change' del combo1 'llena' los elementos del combo2
por lo que es necesario que el evento '_change' del combo2 NO se dispare mientras el combo1 esta 'llenando' su contenido
[a menos que sea por una seleccion del usuario] ;)

__ 2 __
las variables booleanas se inicializan en verdadero al declararlas, o dicho de otra manera, mientras no se declare lo contrario?
si no es asi como le puede llegar el valor verdadero al combo2?



[R] las variables booleanas se inicializan como 'falso' al declararlas y [como en este caso] al estar declaradas 'a nivel de modulo'...
son leidas/aplicables/pasables/validas/modificables/... por/a/para/en/desde/... cualquier otro procedimiento en ese modulo ;)

__ 3 __
... creo que me puede valer algo parecido, aunque (sin probarlo) no es exactamente lo que deseo que hagan los combos.
Lo que me gustaria es algo parecido a lo siguiente: supongamos dos combos: ComboClave y ComboDefinicion
en un rango de dos columnas de una hoja inaccesible al usuario, se van almacenando las nuevas entradas en los combos.
La cuestion es que si se va escribiendo en el comboClave (pej) vayan apareciendo en el comboDefinicion (y viceversa)
la definicion correspondiente a la clave visualizada en el comboClave.
Esto no parece complicado al tener el mismo indice de fila en el rango de origen (listindex=listindex)
el problema es cuando no existe coincidencia (digamos que se crea una nueva entrada) de lo escrito
con lo contenido en ese mismo combo entonces me interesa que al salir del combo
(para dar pie a acabar de escribir lo que se desee debe ser al salir y no al desaparecer la coincidencia <MatchFound>)
el foco se vaya al otro combo para rellenar la definicion/clave que le corresponde a la nueva entrada
y que a su vez no se borre lo escrito en el primer combo, y asi poder cargarlo en la hoja al aceptar.
Por cierto los combos se llenan (al menos inicialmente) al inicializarse el formulario.
Bueno no se si me he explicado, en cualquier caso muchas gracias, y si ves algo te lo agradezco.



[R] el ejemplo que te expuse es probable que sea [y NO 'ligeramente'] distinto de tu caso en la realidad :))
sobre todo, porque desconozco cuantos otros eventos 'administras' para cada uno de los controles -?-
y si alguna instruccion en algun evento este 'invalidando las intenciones' de otros eventos -?- [p.e.]
=> no 'veo' la necesidad de dos combos en los que 'coincidan' en ambos la propiedad '.ListIndex' -?-
sobre todo, si hablamos de entradas [que hace el usuario] que pudieran NO existir en sus rangos de origen
[quizas un control de lista o un combo de mas columnas] -?-

[insisto]... [seguramente] al estar manejando 'varios' eventos para cada uno de los controles [_change, _exit, _afterupdate, _etc.]...
alguna instruccion [de entre todas/varias] esta ocasionando 'interferencia' con los 'momentos' en que 'suceda' cada uno [de los eventos] -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#3 Ivan
08/09/2006 - 01:18 | Informe spam
Hola Hector Miguel, como siempre, tus apuntes, consiguen que mis
conocimientos de vba aumenten muchos grados de golpe(aunque mis
'huecos' sigan siendo infinitos). Y no sabes cuanto te lo agradezco.

Si tienes tiempo te comento/consulto un poco tu respuesta:

[R] las variables booleanas se inicializan como 'falso' al declararlas y [como en este caso] al estar declaradas 'a nivel de modulo'...





mi ignorancia (y quizas tambien mi falta de perseverancia a la hora de
consultar la 'ayuda') es tal, que no solo no sabia que las booleanas se
'inicializaban' al declararlas, sino que ademas pensaba que de ser asi,
lo harian como True. Muchas gracias por el dato.

[R] el ejemplo que te expuse es probable que sea [y NO 'ligeramente'] distinto de tu caso en la realidad :))





creo que, aunque posiblemente voy a cambiar todo el planteamiento, me
hubiera podido valer con algunos retoques.

y si alguna instruccion en algun evento este 'invalidando las intenciones' de otros eventos -?- [p.e.]





lo curioso es que le he dado mil vueltas a todos los codigos presentes,
y estoy practicamente seguro de que no existe interferencia "directa",
o sea, escrita en los codigos. Otro cantar son las posibles
'interacciones' generadas por la 'superposicion' de los eventos, para
lo que me temo que todavia estoy un poco verde.

=> no 'veo' la necesidad de dos combos en los que 'coincidan' en ambos la propiedad '.ListIndex' -?-





tienes razon, es otro de mis enrevesamientos mentales, y posiblemente
siga tu consejo

sobre todo, si hablamos de entradas [que hace el usuario] que pudieran NO existir en sus rangos de origen




[quizas un control de lista o un combo de mas columnas]

aqui esta un poco el quid de la cuestion, que en caso de que la entrada
introducida sea nueva, se tenga que introducir tambien una entrada
nueva para el otro 'control', que por decirlo de alguna manera, forma
parte del mismo registro, aunque si elimino el 2º combo(o lo cambio
por otro tipo de control) seguramente el problema desaparezca. Quizas
podria usar un inputbox o similar..

El traspaso de las nuevas entradas al rango de origen lo hago en el
boton aceptar del formulario.

[insisto]... [seguramente] al estar manejando 'varios' eventos para cada uno de los controles [_change, _exit, _afterupdate, _etc.]...





y, por ultimo, hace poco me diste un enlace para el orden de los
eventos a nivel de libro. ¿sabes -pregunta retorica- de alguno sobre
el orden de los eventos de los controles?. A veces me da la impresion
de que el omnipresente 'change' es el primero y el ultimo.

Como creo que ya comente una vez, el uso de los eventos desde la
ignorancia, no debe ser bueno para mi neurona.

De todas formas revisare el enlace que me mandaste-creo que de J.W- a
ver si veo algo.

Y despues de este nuevo rollo, muchas gracias por todo.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#4 Ivan
08/09/2006 - 01:43 | Informe spam
Hola de nuevo, Hector Miguel

se me olvidaba una consulta:

¿aunque las booleanas se inicialicen como False, la expresion "If
Booleana Then" si equivale a "Si la booleana es Verdadera"?¿o vuelvo a
estar equivocado?

disculpa este nuevo '2º msj', y gracias en cualquier caso

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#5 Héctor Miguel
08/09/2006 - 04:37 | Informe spam
hola, Ivan !

aunque las booleanas se inicialicen como False, la expresion "If Booleana Then" si equivale a "Si la booleana es Verdadera"?...



[hasta donde se]... una instruccion If... Then...Else.../End If [al igual que una funcion si-condicional de hoja de calculo]...
['por omision' o en principio]... 'busca' si la 'evaluacion' de la condicionante devuelve verdadero [como primera instancia]
[por lo que] si una variable es de tipo boolean y YA lleva asignado un valor de 'verdadero' -efectivamente- equivale a tu supuesto [p.e.]

Dim EsVerdad As Boolean ' se inicializa como 'falso' por lo tanto...'
-> If EsVerdad [...] <- devuelve una evaluacion de 'falso'
-> If EsVerdad = Falso [...] <- devuelve una evaluacion de 'verdadero'
-> If Not EsVerdad [...] <- devuelve una evaluacion de 'verdadero'

ocurre lo contrario cuando [y mientras] la variable ha sido establecida como 'verdadero' ;)

con relacion a los eventos... no he buscado/conocido/... algun sitio que hable de alguna 'secuencia' en eventos de controles -?-
[probablemente] lo mas 'rapido' seria usar msgboxes 'acordes' a cada evento y ver la secuencia en que se disparan :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida