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
Mostrar la cita
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
#2 Héctor Miguel
08/09/2006 - 00:16 | Informe spam
hola, Ivan !

Mostrar la cita
__ 1 __
Mostrar la cita
[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 __
Mostrar la cita
[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 __
Mostrar la cita
[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.
#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:

Mostrar la cita
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.

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

Mostrar la cita
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.

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

Mostrar la cita
[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.

Mostrar la cita
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
#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
#5 Héctor Miguel
08/09/2006 - 04:37 | Informe spam
hola, Ivan !

Mostrar la cita
[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.
Ads by Google
Search Busqueda sugerida