Retroceso del cursor en un combobox

10/07/2006 - 00:19 por klomkbock | Informe spam
Hola de nuevo a todos, aqui vuelvo con otro problema, para no variar.

Tengo un combobox en cuyos eventos KeyDown y KeyUp he introducido un
codigo (sacado del foro y retocado un poco) que reconoce las pulsaciones
del teclado y las asigna a una variable(Pulsos) de tal forma que si se
pulsa una tecla (no todas, se establecen algunas excepciones), Pulsos = 1
y cada vez que se pulsa una tecla se añade una unidad a pulsos:
Pulsos=Pulsos + 1. La tecla de retroceso(vbKeyBack) resta 1 cada vez a
pulsos si este es mayor que cero. El proceso va bastante bien, y pulsos
sirve para definir el nº de caracteres de la izquierda del combobox, para
usarlo como criterio para filtrar los datos de una hoja, comparandolo con
los registros de una columna concreta y trasladando el contenido del rango
"A:D" de las filas que vayan coincidiendo segun se escribe, a un ListBox
de 4 columnas. Uff...

Todo va bastante bien, pero al pulsar el retroceso, aunque pulsos
disminuye y el filtro se readapta y hace, creo que bien, su trabajo, el
cursor no retrocede (ni el sombreado de seleccion), con lo que si
introduces otro caracter no lo asimila a la coincidencia que aparece en el
combobox, sino que lo inserta en medio de lo que haya en el combo y,
claro, normalmente ya no existe ninguna coincidencia que reflejar en el
listbox.

No se si me he explicado, pero creo que no soy capaz de aclararlo mucho
mas.

Los codigos/extractos son los siguientes:

Private Sub cmbCriterio_KeyDown(ByVal KeyCode As MSForms _
.ReturnInteger, ByVal Shift As Integer)
Application.ScreenUpdating = False
Select Case KeyCode
Case vbKeyReturn, vbKeyEscape
SendKeys "{Esc}"
Case 32 To 255
Pulsos = Pulsos + 1
End Select
Application.ScreenUpdating = True
End Sub

El codigo referido al retroceso (vbKeyBack) iba originalmente en otro Case
del procedimiento anterior, pero tras varias pruebas, y la verdad es que
ya no tengo muy claro porque, lo acabe cambiando a KeyBack, donde creo que
funciona mejor¿¿??:

Private Sub cmbCriterio_KeyUp(ByVal KeyCode As MSForms _
.ReturnInteger, ByVal Shift As Integer)
If Not Pulsos > 0 Then Exit Sub
If KeyCode = vbKeyBack Then
If Pulsos > 0 Then Pulsos = Pulsos - 1
End If
With cmbCriterio
.
End Sub

Bueno, espero que mas o menos me hayais entendido. Si me podeis echar una
mano de nuevo, os lo agradezco.

Un saludo y hasta pronto.
Ivan

Preguntas similare

Leer las respuestas

#1 klomkbock
11/07/2006 - 03:33 | Informe spam
Hola de nuevo a todos.
Creo que ya lo he resuelto (espero) de la siguiente forma:

Option Explicit
Dim Pulsos As Byte, Patron As String, nL As Byte, fF As Long
Private Sub cmbCriterio_KeyDown(ByVal KeyCode As MSForms _
.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case vbKeyReturn, vbKeyEscape
SendKeys "{Esc}"
Case vbKeyBack
On Error Resume Next
If Pulsos > 0 Then Pulsos = Pulsos - 1
On Error GoTo 0
Case 32 To 255
Pulsos = Pulsos + 1
End Select
End Sub
Private Sub cmbCriterio_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim Lista
Dim fFo
Application.ScreenUpdating = False
If Pulsos = 0 Then cmbCriterio.ListIndex = -1
Patron = LCase(Left(cmbCriterio, Pulsos))
With Worksheets("Oculta")
.UsedRange.EntireRow.Delete
Call FiltrarHjAOtra(.Name, "Listado", nL + 1, Patron & "*")
fFo = .[a65536].End(xlUp).Row
Lista = .Range("a1:d" & fFo)
With lstSeleccionar
.Clear
.List = Lista
.ListIndex = -1
txtNroLibros = .ListCount
End With
End With
Application.ScreenUpdating = True
End Sub

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#2 klomkbock
11/07/2006 - 19:11 | Informe spam
Retiro lo dicho, esto sigue sin funcionar en condiciones.

Bueno, supongo que acabare encontrando donde estoy metiendo la pata.

Un saludo
Ivan

PD esta es otra ventaja del foro, que incluso puedes monologar en publico.
Respuesta Responder a este mensaje
#3 Héctor Miguel
12/07/2006 - 05:38 | Informe spam
hola, Ivan !

Retiro lo dicho, esto sigue sin funcionar en condiciones.
Bueno, supongo que acabare encontrando donde estoy metiendo la pata.
Un saludo
Ivan
PD esta es otra ventaja del foro, que incluso puedes monologar en publico.



1) me parece muy 'adecuada' la actitud con la que 'tomas' este tipo de -aparentes-... descortesias ?? :D

2) considerando que has efectuado 'adptaciones' a los codigos que viste por los foros...
y que 'estos' [aparentemente] ya funcionaban 'ben' [en su 'estado original' o con los 'supuestos' aplicados] -?-
si agregamos que no resulta muy 'obvio' el tipo de datos/momentos/'teclazos'/... con que los estas utilizando...

3) a) es absolutamente 'necesario' que incluyas en la secuencia 'valida' el juego de caracteres hasta el 255 -???-
b) considera que el caracter [ascii] 127 -que esta incluido en la secuencia permitida- equivale a la tecla {Del}
c) existen otros caracteres 'no imprimibles' dentro del juego hasta el 255, que pudieran corresponder a otras teclas -?-

4) se que 'la prisa es mucha'... [asi que, quizas]...
si 'partes' del estado donde si funcionaban, y vas modificando 'por partes', y probando cuando si/no se presentan 'las fallas' -?-
o... probando a identificar que 'teclazos' son los que pudieran estar ocasionando las 'interferencias' -?-

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 klomkbock
12/07/2006 - 22:18 | Informe spam
Hola Hector Miguel, gracias de nuevo por tu atencion y por tus
comentarios, de los cuales tomo buena nota.

En realidad, el cambio en el codigo se debe a que el ejemplo sacado en el
foro estaba destinado a su uso en el evento Change de un textbox y no en
el de un combo.

Posiblemente funcione igual, pero, no se si por algun error mio o por lo
que sea, en determinadas situaciones no realiza bien su funcion
(sumar/restar pulsos para usarlos con Left).

La conclusion a la que llegue tras muchas pruebas ( y lo que voy a decir
quizas sea una burrada), es que cuando introduces el primer caracter en un
combo, inmediatamente, si existe alguna coincidencia en la lista contenida
por el, esta 'toma' su propiedad text (¿o value?) y si el segundo
caracter que introduces en el combo tambien es el 2º caracter de esa
coincidencia, el evento change no se dispara, con lo que la variable
pulsos no se incrementa, y por tanto el patron sigue siendo la primera
letra y no realiza la siguiente seleccion/filtro en el listbox de
destino(cosa que de ser cierta, en el caso del textbox no ocurria, pues
todas las pulsaciones disparaban el change).

Esto no se si sera cierto, pero al ser la unica causa que pude encontrar
empeze a tantear el uso en otros eventos, y me temo que todavia me queda
mucho que aprender sobre ellos. Pero bueno, en ello estamos.

En cualquier caso en ningun momento ha sido mi intencion retocar codigos
ajenos para enmendarlos, sino solamente para intentar adaptarlos a
situaciones muy concretas, para las que, tal vez debido a mi ignorancia,
pense que irian mejor con esos retoques (cosa que por otro lado no suele
ocurrir)

3) a) es absolutamente 'necesario' que incluyas en la secuencia 'valida' el


juego de caracteres hasta el 255 -???-

En realidad no. De hecho, en un principio tan solo añadi la eñe, la coma y
el punto. Luego no pense que pudiesen producirse interferencias por el uso
del resto y, reconozco que un poco por vagancia, opte por incluirlos todos.

En cualquier caso me vale con los anteriores y alguno mas como
interrogacion, punto y coma,etc, pero esta tarea ya me habia puesto a
acometerla tras leer varios dialogos del foro y mas o menos esta
terminada, aunque todavia tengo duda de la conveniencia de incluir algunos
caracteres por su uso en vba, asi como del resultado con el uso.

si 'partes' del estado donde si funcionaban, y vas modificando 'por


partes', y probando cuando si/no se presentan 'las fallas' -?-
o... probando a identificar que 'teclazos' son los que pudieran estar


ocasionando las 'interferencias' -?-

Te puedo asegurar que no sera la primera, ni la segunda vez que lo haga,
pero cuando creo que ya esta resuelto, vuelve a surgir algun problema.
Quizas deba ser un poco mas paciente, y mucho mas metodico. Tiempo al
tiempo.

En cualquier caso muchas gracias por tus consejos y anotaciones, como
siempre suelen ser muy product/instruct...ivas. En serio, muchas gracias y
disculpa por el volumen de la respuesta.

Un saludo y hasta pronto
Ivan
Respuesta Responder a este mensaje
#5 klomkbock
12/07/2006 - 22:36 | Informe spam
Hola de nuevo, Hector Miguel.

Esto no responde exclusivamente a mi obsesion por hilar infinitos
monologos, sino a que al releer mi mensaje me he dado cuenta de que
efectivamente estoy diciendo una burrada.

La variable Pulsos si debe incrementarse con los 'teclazos', pues estos se
manipulan en keyDown y no en change, lo que posiblemente no haga es
reconocerlos en el text del combo hasta que algun caracter no cambia con
respecto a la coincidencia. No se si me he explicado, pero creo que por
aqui pueden estar los tiros.

Voy a ponerme con ello a ver si hay suerte y soy capaz de analizarlo en
condiciones.

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