Criterio alfanumerico para filtro

28/08/2006 - 18:36 por Ivan | Informe spam
Hola a todos de nuevo.

Tengo un formulario con dos combobox y un listbox que funcionan de la
siguiente manera:

1.- en el 1er combo (cmbElegir) se cargan, al abrirse el formulario,
los titulos de campo (26 en total) de una hoja de excel.

2.-en el 2º combo (cmbCriterio) se cargan las entradas del campo
seleccionado en el 1ª.

3.- en el listbox (lstSeleccionar-> multiselect de 4 columnas) se
cargan, segun se va tecleando en el 2º combo, las columnas A, B, C y D
de todas las coincidencias de lo tecleado. Se utiliza Autofiltro y como
criterio1 lo introducido en el 2º combo y un comodin (*).

Pej: si elijo el campo "Nombre" en el 1er combo y en el hay estas
entradas:

Pepe
Juan
Pablo

-> al teclear "p" en el 2º combo aparecera en el listbox lo que haya
en las columnas A,B,C y D de los registros Pepe y Pablo -> si a
continuacion tecleo la "a" ( o sea "pa" en total) apareceran solo las
correspondientes a Pablo.

Todo funciona perfectamente excepto cuando los valores del campo
elegido como criterio comienzan por un digito. He hecho numerosas
pruebas intentando convertir los 'valores' a 'valor' y a la inversa,
pero no logro que me reconozca? los numeros como criterio de filtro y
me cargue las columnas correspondientes en el listbox. En el 2º combo
si se carga el campo correspondiente. La mayoria de los campos son de
texto, pero hay varios de fecha, y fundamentalmente el 1ª (columnaA)
es un nº unico que se corresponde con el nº de ficha y que actua como
campo clave .(por cierto, la propiedad matchentry esta establecida a
none.)

No se si me he explicado, pero en cualquier caso aqui va el codigo del
2º combo, en el que creo que esta el problema. En el , como
comentario, esta uno de los intentos de conversion a valor del criterio
de filtrado.

Private Sub cmbCriterio_Change()
Dim Patron As String
If cmbCriterio = "" Then
lstSeleccionar.Clear: txtNroLibros = 0
Exit Sub: End If
Application.ScreenUpdating = False
' If IsNumeric(Val(cmbCriterio)) Then
' Patron = Val(cmbCriterio)
' Else
Patron = cmbCriterio
' End If
tiempo = Timer * 1000
With lstSeleccionar
.Clear
With Worksheets("Oculta")
.UsedRange.EntireRow.Delete
With Worksheets(HojaBusqueda)
If .AutoFilterMode Then .AutoFilterMode = False
.UsedRange.AutoFilter
If .AutoFilterMode Then _
.Range("a1").CurrentRegion.AutoFilter _
Field:=cmbElegir.ListIndex + 1, _
Criteria1:=Patron & "*"
With .AutoFilter.Range
If .Rows.Count > 1 Then
On Error Resume Next
.SpecialCells(xlCellTypeVisible) _
.Copy Worksheets("Oculta").Range("a1")
On Error GoTo 0
Else
On Error Resume Next
.AutoFilterMode = False
On Error GoTo 0
Application.ScreenUpdating = True
Exit Sub
End If
End With
.AutoFilterMode = False
End With
If .Range("a2") <> "" Then
lstSeleccionar.List = .Range("a2:d" & _
.[a1].End(xlDown).Row).Value
Else
txtNroLibros = 0
End If
End With
lblTiempoCriterio.Caption = "Tarda " & Timer * 1000 - tiempo & "
m/s"
txtNroLibros = .ListCount
End With
Application.ScreenUpdating = True
End Sub

Si me podis echar una mano os lo agradezco.

Un saludo y hasta pronto
Ivan

PD: el codigo esta logrado gracias a la ayuda de este foro, y ya he
realizado varias consultas sobre el referentes a otros puntos, pero
siempre acaba por surgir un nuevo contratiempo. En cualquier caso mucha
gracias por lo conseguido hasta la fecha.
 

Leer las respuestas

#1 Héctor Miguel
29/08/2006 - 06:14 | Informe spam
hola, Ivan !

... un formulario con dos combobox y un listbox que funcionan...
... en el 1er combo (cmbElegir)... los titulos de campo...
... en el 2do combo (cmbCriterio)... las entradas del campo seleccionado en el 1ero...
... en el listbox (lstSeleccionar-> multiselect de 4 columnas) se cargan, segun se va tecleando en el 2do combo
... columnas A, B, C y D de todas las coincidencias de lo tecleado utiliza Autofiltro...
... funciona... excepto cuando los valores del campo elegido como criterio comienzan por un digito...
... no logro que me reconozca los numeros como criterio de filtro y me cargue las columnas correspondientes en el listbox...
... La mayoria de los campos son de texto, pero hay varios de fecha, y fundamentalmente el 1ero (columnaA) es un no. unico
... se corresponde con el no. de ficha y que actua como campo clave...



1) si suponemos que los problemas llegan cuando quieres 'filtrar' FECHAS... -?-
los datos de la columna donde se encuentren dichas 'fechas'... deberan ser datos 'netamente' TEXTUALES... NO 'valores'
[supongo que 'los datos' son fechas 'reales'... independientemente del formato que les apliques para 'verlos'] -?-

2) si lo anterior es 'correcto'... [probablemente] necesitaras modificar los 'dato-fecha' [quizas] 'convertidos' a TEXTOS...
o... utilizar un tipo de control distinto de un combo-editable [que funciona igual que un textbox]
[p.e.] prueba con un control DTPicker -al menos- cuando se vaya tratar de filtrar por datos-fecha 'reales' ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Preguntas similares