Validación por aproximación de letras listado

30/08/2007 - 13:38 por Auyuz | Informe spam
Buen@s:

Tengo un libro con varias hojas. En una tengo un listado de aparatos
con diferentes columnas con diferentes datos de estos aparatos como
por ejemplo modelo, precio, descripcion... etc llamado Master_Aparatos
donde he creado un nombre "modelo" que hace referencia a un rango
(columna) de todos los modelos de los aparatos.

modelo
=Master_Aparatos!$J$12:$J$3011

En una hoja a parte quiero entrar el modelo y que me escriba en las
columnas de al lado "Descripción", "Precio".

Esto en principio sería bastante sencillo haciendo una validación de
una lista que hace referencia al nombre creado "modelo" y desplegar
lista pero eso no es exactamente lo que quiero.

Había una manera de escribir y a medida que vas escribiendo validaba
con la lista... pero no la encuentro.

Después para que escribiera en las columnas de al lado "Precio" y
"Descripción" se utilizaba una fórmula que diciendole (Valor a
buscar;Rango donde tiene que buscar;Valor que queremos que nos
retorne) estoy en ello buscando.

La segunda parte seguro que lo encuentro pero la primera parte no hay
maneras de encontrarlo sin tener que hacer Vb.

Agradecería un pocode luz sobre el tema. gracias por adelantado,
saludos!

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
08/11/2007 - 21:18 | Informe spam
hola, charly !

no conosco mucho de macros pero te comento lo que hice.
hice clic boton dereccho del mause sobre el listBox1 despues, ver codigo y ahy pegue:

Private Sub ListBox1_Change()
If Cargando_datos Then Exit Sub
With ListBox1
Worksheets("hoja X").Range("d1) = .List(.ListIndex)
End With
End Sub



pero cuando escribo algo en el textbox1 me manda un mensaje que dice error de compilacion error de sintaxis
que estoy haciendo mal o que me falta ???...



parece que ayer me pase de espeso o de acelerado :-(( (a ver si hoy me disciplino mas) :))

1) el error de sintaxis es por la falta de las comillas dobles al cerre del rango [D1]...
Worksheets("hoja X").Range("d1") = .List(.ListIndex)
=> y no te olvides de poner la hoja correcta (no creo que la real se llame "hoja X")

2) tambien, este evento esta saltando cada vez que escribes en el textbox por la falta de la variable comentada:
"Cargando_datos" de tipo boolean que debe iniciarse en true y finalizarse en false en el evento '_change' del textbox:

a) a nivel de modulo la declaras (para uso en cualquier procedimiento dentro del modulo de codigo del formulario:
Dim Cargando_datos As Boolean

b) en el evento '_change' del textbox la administras (true al iniciar y false al finalizar el procedimiento)
Private Sub TextBox1_Change()
Cargando_datos = True
With Worksheets("hoja1")
' aqui va el resto del codigo para los filtros ... '
End With
Cargando_datos = False
End Sub

3) otro detalle importante es que no debieras poner nada en la celda D1
observa que debe contener el titulo para operar los filtros avanzados por codigo segun lo entrado en el textbox <= OJO
(a menos que te refieras a la celda D1 de otra hoja) -?-

prueba y a ver si se nos paso la espesura de ayer :D
saludos,
hector.

> ... RESPUESTA DE... UTILIDAD... EN LO PERSONAL ME SERVIRIA
> ... HAY ALGO QUE LA HARIA MAS UTIL... ES QUE LAS SUGERENCIAS QUE VA MOSTRANDO EL LISTBOX1
> SE PUEDAN SELECCIONAR CON UN CLICK O FLECHA HACIA ABAJO Y ENTER
> (QUE DE ALGUNA MANERA SE PUEDA ELEGIR DE LA LISTA)
> Y ASI SE ESCRIBA TODO EN D1 Y NO HAYA NECESIDAD QUE ESCRIBIR TODO
> AHORRARIA MUCHO TIEMPO EN EL LLENADO DE LISTAS ETC.
> (DEPENDIENDO DE LA IMAGINACION DE CADA QUIEN)
> NO SE SI ESO SE PUEDA OJALA QUE SI.

es probable que en el ejemplo me hubiera quedado corto... (considerando que "tuve que" imaginar un escenario de aplicacion)

podrias incluir codigo del evento '_change' del control de lista para depositar en alguna celda la seleccion que hagas
(obviamente) en cuanto veas que el listado muestra algun elemento que te interesa (p.e.)

1) necesitaras una variable de tipo boolean para indicarle al evento '_change' que no se dispare en la carga de los datos
declarada a nivel de modulo, adminstrada en el procedimiento "Private Sub TextBox1_Change()"
establecida en True al inicio del codigo y en False justo antes del End Sub
(digamos que la variable se llama "Cargando_datos")

2) agregas codigo al evento '_change' del control de lista (ListBox1) +/- como sigue:

Private Sub ListBox1_Change()
If Cargando_datos Then Exit Sub
With ListBox1
Worksheets("hoja X").Range("d1) = .List(.ListIndex)
End With
End Sub

__ la consulta de referencia __
>> hola, joan ?
>>
>> > ... libro con varias hojas. En una... un listado de aparatos con diferentes columnas con
>> > ... datos... como... modelo, precio, descripcion... etc llamado Master_Aparatos
>> > donde he creado un nombre "modelo" que hace referencia a un rango (columna) de todos los modelos de los aparatos.
>> > modelo =Master_Aparatos!$J$12:$J$3011
>> > En una hoja a parte quiero entrar el modelo y que me escriba en las columnas de al lado "Descripcion", "Precio".
>> > Esto en principio seria bastante sencillo haciendo una validacion de una lista que hace referencia al nombre creado "modelo"
>> > y desplegar lista pero eso no es exactamente lo que quiero.
>> > Habia una manera de escribir y a medida que vas escribiendo validaba con la lista... pero no la encuentro...
>>
>> [hasta donde se]... no *existe* tal manera de validar auto-filtrando/completando segun vas escribiendo [SIN vba] ;)
>>
>> de los datos que expones en esta consulta, se puede desprender/intuir/adivinar/[casi] ver/...
>> cual es la idea para solucion del planteamiento [sin embargo, creo que]...
>> mas que *faltarle datos*... la faltan los *detalles finos* [rangos, hojas, de donde, a donde, como, por que, etc.]
>>
>> por lo pronto, solo me atrevo a opinar sobre las -posibles- alterntivas aplicables a estas necesidades :-(
>>
>> 1) te sugiero un userform con un control de lista que se vaya actualizando segun caracteres ingresados en un cuadro de texto
>>
>> 2) para obtener [segun caracteres-criterio en el cuadro de texto] una lista *filtrada* para el relleno del control de lista...
>> tienes disponibles varias alternativas [segun la complejidad de tu listado/base de datos/campos/registros/etc.] p.e.
>> - consulta a bases de datos [access/excel/csv/txt] mediante ADO/Recordset/..., Obtener datos externos/MSQuery/...
>> - autofiltros... filtros avanzados... hojas ocultas... rangos des/re/ordenados...
>> - listas con formulas condicionadas para extraer -como- filtros, nombres con referencia a rangos dinamicos, etc. etc. etc.
>>
>> 3) determinar cual mecanismo/medio/... es mejor [seguramente] dependera de algunas otras eventualidades [p.e.]
>> - si no es inconveniente mantener abierto el archivo de origen
>> [asumiendo listados en excel y/o si contiene muchas/demasiadas formulas que afecten los re/calculos]
>> - si puedes convertir tu base de datos a un archivo *simple* de texto, csv, tab, etc. [pudiera tener sus ventajas]
>> - si el numero de campos/columnas de tu listado/base de datos es... *dinamica/variable/...*
>> o seran siempre las mismas [sobre todo para el tema de *ir filtrando* lo que pongas en el cuadro de texto] -?-
>>
>> algo de lo anterior [quizas combinado y/o adicionado con otras alternativas]
>> podria darte la sensacion de actualizaciones/refrescos/... *en tiempo real* [o con un retraso bastante *aceptable*]
>>
>> un ejemplo:
>>
>> si suponemos que se trata de la 'hoja1', y que en el userform contiene un TextBox1 y un ListBox1
>> y que SOLO necesitas los datos de la columna 'A' y que tienes libre en la hoja1 a partir de la columna 'C' -?-
>>
>> 1) copia el titulo de la columna 'A' en la cela 'D1'
>> 2) copia/pega las siguientes lineas en el modulo de codigo del formulario
>> hara filtros avanzados 'en tiempo real' sobre la columna 'F' de la hoja1 y rellenara el ListBox1...
>> -> segun los caracteres que vayas introduciendo en el TextBox1
>>
>> Private Sub TextBox1_Change()
>> With Worksheets("hoja1")
>> .Range("d2") = TextBox1
>> .Range(.Range("a1"), .Range("a65536").End(xlUp)).AdvancedFilter _
>> Action:=xlFilterCopy, _
>> CriteriaRange:=.Range("d1:d2"), _
>> CopyToRange:=.Range("f1"), _
>> Unique:=False
>> Select Case Application.CountA(.Range("f:f"))
>> Case 1: ListBox1.Clear
>> Case 2: ListBox1.Clear: ListBox1.AddItem .Range("f2")
>> Case Else: ListBox1.List = .Range(.Range("f2"), .Range("f65536").End(xlUp)).Value
>> End Select
>> End With
>> End Sub
Respuesta Responder a este mensaje
#7 charly_76
08/11/2007 - 21:51 | Informe spam
GRACIAAAAAAAAAAS HECTOR!!

FUNCIONO MUY BEIN
Respuesta Responder a este mensaje
#8 charly_76
19/11/2007 - 17:29 | Informe spam
hola Hector me puedes ayudar con lo siguiente?
con respecto ala macro que me mandaste
del texbox1 cuando escribo y selecciono el texto que
me interesa me genera una lista, en f1 hacia abajo...
esa lista yo no la ocupo, se le puede hacer que NO se genere???
todo lo demas SI lo ocupo

gracias buen dia!!

"Héctor Miguel" escribió:

hola, charly !

> no conosco mucho de macros pero te comento lo que hice.
> hice clic boton dereccho del mause sobre el listBox1 despues, ver codigo y ahy pegue:
>
>> Private Sub ListBox1_Change()
>> If Cargando_datos Then Exit Sub
>> With ListBox1
>> Worksheets("hoja X").Range("d1) = .List(.ListIndex)
>> End With
>> End Sub
>
> pero cuando escribo algo en el textbox1 me manda un mensaje que dice error de compilacion error de sintaxis
> que estoy haciendo mal o que me falta ???...

parece que ayer me pase de espeso o de acelerado :-(( (a ver si hoy me disciplino mas) :))

1) el error de sintaxis es por la falta de las comillas dobles al cerre del rango [D1]...
Worksheets("hoja X").Range("d1") = .List(.ListIndex)
=> y no te olvides de poner la hoja correcta (no creo que la real se llame "hoja X")

2) tambien, este evento esta saltando cada vez que escribes en el textbox por la falta de la variable comentada:
"Cargando_datos" de tipo boolean que debe iniciarse en true y finalizarse en false en el evento '_change' del textbox:

a) a nivel de modulo la declaras (para uso en cualquier procedimiento dentro del modulo de codigo del formulario:
Dim Cargando_datos As Boolean

b) en el evento '_change' del textbox la administras (true al iniciar y false al finalizar el procedimiento)
Private Sub TextBox1_Change()
Cargando_datos = True
With Worksheets("hoja1")
' aqui va el resto del codigo para los filtros ... '
End With
Cargando_datos = False
End Sub

3) otro detalle importante es que no debieras poner nada en la celda D1
observa que debe contener el titulo para operar los filtros avanzados por codigo segun lo entrado en el textbox <= OJO
(a menos que te refieras a la celda D1 de otra hoja) -?-

prueba y a ver si se nos paso la espesura de ayer :D
saludos,
hector.

>> > ... RESPUESTA DE... UTILIDAD... EN LO PERSONAL ME SERVIRIA
>> > ... HAY ALGO QUE LA HARIA MAS UTIL... ES QUE LAS SUGERENCIAS QUE VA MOSTRANDO EL LISTBOX1
>> > SE PUEDAN SELECCIONAR CON UN CLICK O FLECHA HACIA ABAJO Y ENTER
>> > (QUE DE ALGUNA MANERA SE PUEDA ELEGIR DE LA LISTA)
>> > Y ASI SE ESCRIBA TODO EN D1 Y NO HAYA NECESIDAD QUE ESCRIBIR TODO
>> > AHORRARIA MUCHO TIEMPO EN EL LLENADO DE LISTAS ETC.
>> > (DEPENDIENDO DE LA IMAGINACION DE CADA QUIEN)
>> > NO SE SI ESO SE PUEDA OJALA QUE SI.
>>
>> es probable que en el ejemplo me hubiera quedado corto... (considerando que "tuve que" imaginar un escenario de aplicacion)
>>
>> podrias incluir codigo del evento '_change' del control de lista para depositar en alguna celda la seleccion que hagas
>> (obviamente) en cuanto veas que el listado muestra algun elemento que te interesa (p.e.)
>>
>> 1) necesitaras una variable de tipo boolean para indicarle al evento '_change' que no se dispare en la carga de los datos
>> declarada a nivel de modulo, adminstrada en el procedimiento "Private Sub TextBox1_Change()"
>> establecida en True al inicio del codigo y en False justo antes del End Sub
>> (digamos que la variable se llama "Cargando_datos")
>>
>> 2) agregas codigo al evento '_change' del control de lista (ListBox1) +/- como sigue:
>>
>> Private Sub ListBox1_Change()
>> If Cargando_datos Then Exit Sub
>> With ListBox1
>> Worksheets("hoja X").Range("d1) = .List(.ListIndex)
>> End With
>> End Sub
>>
>> __ la consulta de referencia __
>> >> hola, joan ?
>> >>
>> >> > ... libro con varias hojas. En una... un listado de aparatos con diferentes columnas con
>> >> > ... datos... como... modelo, precio, descripcion... etc llamado Master_Aparatos
>> >> > donde he creado un nombre "modelo" que hace referencia a un rango (columna) de todos los modelos de los aparatos.
>> >> > modelo =Master_Aparatos!$J$12:$J$3011
>> >> > En una hoja a parte quiero entrar el modelo y que me escriba en las columnas de al lado "Descripcion", "Precio".
>> >> > Esto en principio seria bastante sencillo haciendo una validacion de una lista que hace referencia al nombre creado "modelo"
>> >> > y desplegar lista pero eso no es exactamente lo que quiero.
>> >> > Habia una manera de escribir y a medida que vas escribiendo validaba con la lista... pero no la encuentro...
>> >>
>> >> [hasta donde se]... no *existe* tal manera de validar auto-filtrando/completando segun vas escribiendo [SIN vba] ;)
>> >>
>> >> de los datos que expones en esta consulta, se puede desprender/intuir/adivinar/[casi] ver/...
>> >> cual es la idea para solucion del planteamiento [sin embargo, creo que]...
>> >> mas que *faltarle datos*... la faltan los *detalles finos* [rangos, hojas, de donde, a donde, como, por que, etc.]
>> >>
>> >> por lo pronto, solo me atrevo a opinar sobre las -posibles- alterntivas aplicables a estas necesidades :-(
>> >>
>> >> 1) te sugiero un userform con un control de lista que se vaya actualizando segun caracteres ingresados en un cuadro de texto
>> >>
>> >> 2) para obtener [segun caracteres-criterio en el cuadro de texto] una lista *filtrada* para el relleno del control de lista...
>> >> tienes disponibles varias alternativas [segun la complejidad de tu listado/base de datos/campos/registros/etc.] p.e.
>> >> - consulta a bases de datos [access/excel/csv/txt] mediante ADO/Recordset/..., Obtener datos externos/MSQuery/...
>> >> - autofiltros... filtros avanzados... hojas ocultas... rangos des/re/ordenados...
>> >> - listas con formulas condicionadas para extraer -como- filtros, nombres con referencia a rangos dinamicos, etc. etc. etc.
>> >>
>> >> 3) determinar cual mecanismo/medio/... es mejor [seguramente] dependera de algunas otras eventualidades [p.e.]
>> >> - si no es inconveniente mantener abierto el archivo de origen
>> >> [asumiendo listados en excel y/o si contiene muchas/demasiadas formulas que afecten los re/calculos]
>> >> - si puedes convertir tu base de datos a un archivo *simple* de texto, csv, tab, etc. [pudiera tener sus ventajas]
>> >> - si el numero de campos/columnas de tu listado/base de datos es... *dinamica/variable/...*
>> >> o seran siempre las mismas [sobre todo para el tema de *ir filtrando* lo que pongas en el cuadro de texto] -?-
>> >>
>> >> algo de lo anterior [quizas combinado y/o adicionado con otras alternativas]
>> >> podria darte la sensacion de actualizaciones/refrescos/... *en tiempo real* [o con un retraso bastante *aceptable*]
>> >>
>> >> un ejemplo:
>> >>
>> >> si suponemos que se trata de la 'hoja1', y que en el userform contiene un TextBox1 y un ListBox1
>> >> y que SOLO necesitas los datos de la columna 'A' y que tienes libre en la hoja1 a partir de la columna 'C' -?-
>> >>
>> >> 1) copia el titulo de la columna 'A' en la cela 'D1'
>> >> 2) copia/pega las siguientes lineas en el modulo de codigo del formulario
>> >> hara filtros avanzados 'en tiempo real' sobre la columna 'F' de la hoja1 y rellenara el ListBox1...
>> >> -> segun los caracteres que vayas introduciendo en el TextBox1
>> >>
>> >> Private Sub TextBox1_Change()
>> >> With Worksheets("hoja1")
>> >> .Range("d2") = TextBox1
>> >> .Range(.Range("a1"), .Range("a65536").End(xlUp)).AdvancedFilter _
>> >> Action:=xlFilterCopy, _
>> >> CriteriaRange:=.Range("d1:d2"), _
>> >> CopyToRange:=.Range("f1"), _
>> >> Unique:=False
>> >> Select Case Application.CountA(.Range("f:f"))
>> >> Case 1: ListBox1.Clear
>> >> Case 2: ListBox1.Clear: ListBox1.AddItem .Range("f2")
>> >> Case Else: ListBox1.List = .Range(.Range("f2"), .Range("f65536").End(xlUp)).Value
>> >> End Select
>> >> End With
>> >> End Sub



Respuesta Responder a este mensaje
#9 Héctor Miguel
19/11/2007 - 23:20 | Informe spam
hola, charly !

con respecto ala macro que me mandastedel texbox1 cuando escribo
y selecciono el texto queme interesa me genera una lista, en f1 hacia abajo...
esa lista yo no la ocupo, se le puede hacer que NO se genere???
todo lo demas SI lo ocupo



solo necesitas eliminar/borrar/... el codigo en el evento del textbox: -> Private Sub TextBox1_Change()

o... por si lo llegaras a necesitar mas adelante, solo pon como primer linea en el evento un Exit Sub
(lo eliminas cuando vuelva a ser necesario dicho evento)

saludos,
hector.
Respuesta Responder a este mensaje
#10 charly_76
20/11/2007 - 00:11 | Informe spam
Hector Auxilio!!

borro Private Sub TextBox1_Change()
que esta al principio y deja de funcionar el listbox y el textbox
osea que ya no hace nada

o en que parte o lugar de la macro debo escribir
Exit Sub si lo pongo al pricipio me manda error,,,
igual si lo pongo abajo, arriba o despues de Private Sub TextBox1_Change()

disculpa por la molestia

"Héctor Miguel" escribió:

hola, charly !

> con respecto ala macro que me mandastedel texbox1 cuando escribo
> y selecciono el texto queme interesa me genera una lista, en f1 hacia abajo...
> esa lista yo no la ocupo, se le puede hacer que NO se genere???
> todo lo demas SI lo ocupo

solo necesitas eliminar/borrar/... el codigo en el evento del textbox: -> Private Sub TextBox1_Change()

o... por si lo llegaras a necesitar mas adelante, solo pon como primer linea en el evento un Exit Sub
(lo eliminas cuando vuelva a ser necesario dicho evento)

saludos,
hector.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida