Lista desplegable con filtro

09/10/2007 - 09:19 por Principiante | Informe spam
Hola grupo.

No sabía muy bien cómo llamar a la duda que tengo.

Se puede hacer una lista desplegable en excel que tome los valores de
unas celdas o se haga por código (ya se que si) y que cuando pulsemos
sobre ella y empecemos a escribir una A, por ejemplo, sólo vayan
quedando los valores que empiezan por esa letra en la misma para elegir?

Es el típico caso de ir escribiendo ACE... y sólo van quedando los
valores de la lista que empiezan por esos caracteres...

Gracias.

Principiante.

Preguntas similare

Leer las respuestas

#1 AnSanVal
09/10/2007 - 15:48 | Informe spam
(Hasta donde se) Con Excel estandar, cuando el usuario está escribiendo en
una celda, el control lo tiene el usuario y no se ejecuta ningún evento (que
pueda leer los caracteres que este está escribiendo), hasta que pulse la
tecla INTRO.

Pero si utilizas una celda auxiliar (p.e. para ACE) y algo de código,
podrias hacer algo asi:

En este ejemplo (Si la celda auxiliar está vacia, en la celda validada es
válida toda la lista (muestra todo).):
[P2:P14] rango con datos para Validación.
[A2] celda auxiliar.
[B2] celda validada.
Validación por LISTA: ÞSREF(Q2;0;0;CONTARA(Q:Q))

(Código en el módulo de la hoja)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then ' celda auxiliar.
Dim miRango, celda As Range
Dim n, fila As Integer
Set miRango = Range("P2:P14") ' rango con nombres a validar.
Columns(miRango.Column + 1).ClearContents ' borrado previo de lista
validada anterior.
For Each celda In miRango ' recorre las celdas del listado con nombres.
' fila donde escribirá el próximo nombre.
fila = Application.WorksheetFunction.CountA(celda.Offset(,
1).EntireColumn) + 2
' si corresponde escribir el nombre...
If UCase(Left(celda.Value, Len(Cells(2, 1).Value))) = UCase(Cells(2,
1).Value) Then
Cells(fila, celda.Column + 1).Value = celda.Value ' añade el nombre
a la lista.
End If
Next celda
Cells(2, 2).Select ' selecciona la celda validada.
Selection.ClearContents ' borra la selección anterior.
If fila < 4 Then ' si el filtrado contiene un solo dato o está vacio...
If fila = 3 Then ' si hay un solo dato coincidente...
Cells(2, 2).Value = Cells(2, miRango.Column + 1).Value
Else ' si no hay coincidencias...
Cells(2, miRango.Column + 1).Value = "No hay coincidentes"
Selection.Value = "No hay coincidentes"
End If
End If
End If
End Sub

Saludos desde Tenerife (Islas Canarias).
************************************************
"Principiante" escribió en el mensaje
news:
Hola grupo.

No sabía muy bien cómo llamar a la duda que tengo.

Se puede hacer una lista desplegable en excel que tome los valores de unas
celdas o se haga por código (ya se que si) y que cuando pulsemos sobre
ella y empecemos a escribir una A, por ejemplo, sólo vayan quedando los
valores que empiezan por esa letra en la misma para elegir?

Es el típico caso de ir escribiendo ACE... y sólo van quedando los valores
de la lista que empiezan por esos caracteres...

Gracias.

Principiante.
Respuesta Responder a este mensaje
#2 Principiante
11/10/2007 - 15:59 | Informe spam
Gracias.

Le echaré un vistazo a ver si consigo hacerlo.

Principiante.

AnSanVal escribió:
(Hasta donde se) Con Excel estandar, cuando el usuario está escribiendo en
una celda, el control lo tiene el usuario y no se ejecuta ningún evento (que
pueda leer los caracteres que este está escribiendo), hasta que pulse la
tecla INTRO.

Pero si utilizas una celda auxiliar (p.e. para ACE) y algo de código,
podrias hacer algo asi:

En este ejemplo (Si la celda auxiliar está vacia, en la celda validada es
válida toda la lista (muestra todo).):
[P2:P14] rango con datos para Validación.
[A2] celda auxiliar.
[B2] celda validada.
Validación por LISTA: ÞSREF(Q2;0;0;CONTARA(Q:Q))

(Código en el módulo de la hoja)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then ' celda auxiliar.
Dim miRango, celda As Range
Dim n, fila As Integer
Set miRango = Range("P2:P14") ' rango con nombres a validar.
Columns(miRango.Column + 1).ClearContents ' borrado previo de lista
validada anterior.
For Each celda In miRango ' recorre las celdas del listado con nombres.
' fila donde escribirá el próximo nombre.
fila = Application.WorksheetFunction.CountA(celda.Offset(,
1).EntireColumn) + 2
' si corresponde escribir el nombre...
If UCase(Left(celda.Value, Len(Cells(2, 1).Value))) = UCase(Cells(2,
1).Value) Then
Cells(fila, celda.Column + 1).Value = celda.Value ' añade el nombre
a la lista.
End If
Next celda
Cells(2, 2).Select ' selecciona la celda validada.
Selection.ClearContents ' borra la selección anterior.
If fila < 4 Then ' si el filtrado contiene un solo dato o está vacio...
If fila = 3 Then ' si hay un solo dato coincidente...
Cells(2, 2).Value = Cells(2, miRango.Column + 1).Value
Else ' si no hay coincidencias...
Cells(2, miRango.Column + 1).Value = "No hay coincidentes"
Selection.Value = "No hay coincidentes"
End If
End If
End If
End Sub

Respuesta Responder a este mensaje
#3 Principiante
13/10/2007 - 17:55 | Informe spam
Hola de nuevo.

Lo he probado y funciona. Gracias.

Lo único es saber cómo hacer para que la lista que queda, una vez hecho
el filtro, no muestre valores en blanco en ella.

Tengo marcada la opción de No mostrar Celdas en blanco en la lista de
Validación pero aparecen valores por debajo de lo que queda filtrado.

Gracias por todo.

Principiante.

Principiante escribió:
Gracias.

Le echaré un vistazo a ver si consigo hacerlo.

Principiante.

AnSanVal escribió:
(Hasta donde se) Con Excel estandar, cuando el usuario está
escribiendo en una celda, el control lo tiene el usuario y no se
ejecuta ningún evento (que pueda leer los caracteres que este está
escribiendo), hasta que pulse la tecla INTRO.

Pero si utilizas una celda auxiliar (p.e. para ACE) y algo de código,
podrias hacer algo asi:

En este ejemplo (Si la celda auxiliar está vacia, en la celda validada
es válida toda la lista (muestra todo).):
[P2:P14] rango con datos para Validación.
[A2] celda auxiliar.
[B2] celda validada.
Validación por LISTA: ÞSREF(Q2;0;0;CONTARA(Q:Q))

(Código en el módulo de la hoja)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" Then ' celda auxiliar.
Dim miRango, celda As Range
Dim n, fila As Integer
Set miRango = Range("P2:P14") ' rango con nombres a validar.
Columns(miRango.Column + 1).ClearContents ' borrado previo de
lista validada anterior.
For Each celda In miRango ' recorre las celdas del listado con
nombres.
' fila donde escribirá el próximo nombre.
fila = Application.WorksheetFunction.CountA(celda.Offset(,
1).EntireColumn) + 2
' si corresponde escribir el nombre...
If UCase(Left(celda.Value, Len(Cells(2, 1).Value))) =
UCase(Cells(2, 1).Value) Then
Cells(fila, celda.Column + 1).Value = celda.Value ' añade el
nombre a la lista.
End If
Next celda
Cells(2, 2).Select ' selecciona la celda validada.
Selection.ClearContents ' borra la selección anterior.
If fila < 4 Then ' si el filtrado contiene un solo dato o está
vacio...
If fila = 3 Then ' si hay un solo dato coincidente...
Cells(2, 2).Value = Cells(2, miRango.Column + 1).Value
Else ' si no hay coincidencias...
Cells(2, miRango.Column + 1).Value = "No hay coincidentes"
Selection.Value = "No hay coincidentes"
End If
End If
End If
End Sub

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida