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
 

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

Preguntas similares