Crear cuadro combinado que se autodespliegue al insertar datos

Es una pregunta para Sveinbjorn El Rojo

Hola

Tengo un combo en el formulario basado en el campo "editorial".

Me gustaría que cuando comienzo a escribir en el recuadro del combo se me autodesplegara el desplegable, la lista del combo, con solo aquellos valores que comienzan igual que lo que escribo y que aparecieran por orden alfabético.

Es decir, si en el recuadro del combo comienzo a escribir "v..." debería autodesplegarse en el combo solo los valores que coinciden como "vergara", "valdemar", etc.

Formulario: Biblioteca_Personal

Control: editorial

Combo: cbo_editorial

Tabla:TLibros

1 Respuesta

Respuesta
1

Para autodesplegarlo, en el evento "Al cambiar" del combo, ponle este código:

Me. Editorial. Dropdown

Para que te añada los nuevos elementos depende de cómo lo tengas construido:

1º/ Si los datos los obtienes de la propia tabla, lo único que has de hacer es asegurarte de que tengas la propiedad "Limitar a la lista" del cuadro combinado en No

2º/ Si los datos los obtienes de otra tabla, tienes que usar el evento "Al no estar en la lista". Suponiendo que las editoriales las guardas en una tabla TEditoriales con dos campos: IDEditorial y Editorial, sería así:

Private Sub Editorial_NotInList(NewData As String, Response As Integer)
Response = acDataErrContinue
CurrentDb.Execute "INSERT INTO TEditoriales(Editorial) VALUES ('" & NewData & "')"
Me.Editorial= DMax("IDEditorial", "TEditoriales")
Me. OtroCampo. SetFocus
Me. Editorial. Requery
End Sub

3º/ Si los datos los obtienes de una lista de valores que metes a mano, en tiempo de ejecución no lo puedes hacer. Necesitarías abrir el formulario en vista diseño, modificarle la propiedad "Origen de la lista" y guardar los cambios

Hola

Uso la opción 2.

Todo funciona correctamente salvo el tema del autodesplegable al escribir.

Con .dropdown se me abre el desplegable cuando comienzo a escribir...

pero lo que quería es que se me abriera el desplegable con solo los valores que coinciden con lo que escribo y no con todos como ocurre ahora.

Es decir, si en el recuadro del combo comienzo a escribir "v" debería autodesplegarse en el combo solo los valores que coinciden

como "vergara", "valdemar", etc. y no todos los valores del combo.

Ahora mismo si escribo "v" aparecen al autodesplegarse el combo:

alba

planeta

valdemar

valencia

vergara

y debería, si escribo "v"  autodesplegarse el combo mostrando solo valores coincidentes con "v" como:

valdemar

valencia

vergara

y si sigo escribiendo "val" en el desplegable solo debería aparecer:

valdemar

valencia

De antemano muchas gracias por la ayuda

Ponle esta línea antes del .dropdown:

Me.Editorial.RowSource = "SELECT DISCTINCT Editorial FROM TuTabla WHERE Editorial LIKE '" & Me.Editorial.Text & "*' Order BY Editorial"

Hola

En el evento "al cambiar" tengo:

Me.Editorial.dropdown

Lo de...

Me.Editorial.RowSource = "Select ...

¿En qué evento debo ponerlo?

Gracias por la ayuda

Si pongo la línea que  me comenta... Me.Editorial.RowSource = "Select ... "

en el evento "al cambiar" no funciona bien. ¿Debería ir en otro evento?

Gracias

La línea esa se la tienes que poner en el evento al cambiar, antes de la otra. Obviamente con los nombres que tú tengas, no un simple copia y pega de la mía

Entiendo que no es un simple copia y pega lo que tengo que hacer je je... hasta ahí llego, pero cuando lo pongo con mis nombres...

lo de me.Editorial.Rowsource = "select... en el evento "al cambiar"

y escribo "v" sin comillas claro, en el recuadro del combo, no se me autodespliegan los valores que empiezan por "v" y si me paso a otro registro que ya tiene datos en el recuadro del combo y quiero desplegar el combo no me aparece el listado de valores, no se muestran los valores en el desplegable, tan solo se muestra uno. En definitiva al añadir esta línea no funciona correctamente el combo.

Si lo puedes mirar o mandarme un ejemplo de cómo lo tienes tú, te lo agradecería porque siguiendo lo que me indicas, no me funciona bien el combo.

Gracias por la ayuda

Yo no lo tengo de ninguna manera, te estoy dando ideas sin probarlo, porque me parece complicarse demasiado la vida...

Añade en el evento "Al activar registro" del formulario esta linea:

me.Editorial.Rowsource = ...

Y donde van los puntos suspensivos por lo que tenías en un principio, o la misma SQL sin el WHERE, a ver si así te termina de ir

hola

Lo tengo de la siguiente forma:

en diseño, en el origen de la fila del combo, cbo_editorial tengo:

SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],"")<>"" ORDER BY Teditorial.editorial;

y ahora en el evento "al cambiar" he puesto para que solo se despliegue en el combo los valores que coinciden con lo que escribo:

Me.cbo_editorial.RowSource = "SELECT DISCTINCT Editorial FROM Teditorial WHERE editorial LIKE '" & Me.cbo_editorial.Text & "*' Order BY editorial"

Hasta aquí todo bien... el origen del combo son las editoriales sin duplicados y sin "blancos" (o sea registros que no tienen editorial) y además cuando escribo en el recuadro del combo, si escribo "va" se me despliega el combo solo con los valores que comienzan con "va" gracias a lo que he añadido en el evento "al cambiar".

El problema ahora es que cuando quiero abrir ahora el combo solo me muestra un valor, porque el último rowsource que he dejado es:

Me.cbo_editorial.RowSource = "SELECT DISCTINCT Editorial FROM Teditorial WHERE editorial LIKE '" & Me.cbo_editorial.Text & "*' Order BY editorial"

Tendría que poner en algún evento para poder volver a ver todo el listado de valores del combo un nuevo rowsource.

He puesto "al recibir el enfoque" en el combo esto, para poder volve a ver todo el listado del combo sin duplicados y sin "blancos" (registros sin editorial)

Me.cbo_editorial.RowSource = "SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],"")<>"" ORDER BY Teditorial.editorial;

pero me dice que falta el operador y error de sintaxis.

Podrías indicarme qué debo poner para volver a ver todo el listado de valores del combo.

Un saludo y gracias por tu ayuda y tu paciencia

Me.cbo_editorial.RowSource = "SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],'')<>'' ORDER BY Teditorial.editorial;"

o

Me.cbo_editorial.RowSource = "SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],"""")<>"""" ORDER BY Teditorial.editorial;"

Ahora ya funciona todo perfectamente.

Me ha servido la 2º opción y lo he puesto en al recibir enfoque en el combo:

Me.cbo_editorial.RowSource = "SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],"""")<>"""" ORDER BY Teditorial.editorial;"

sin embargo en diseño en origen de la fila sigo poniendo esto:

SELECT DISTINCT Teditorial.editorial FROM Teditorial WHERE Nz([editorial],"")<>"" ORDER BY Teditorial.editorial;

Como ves, en el origen de la fila el rowsource tiene 2 comillas dobles y en el rowsource que he puesto en el evento "al recibir enfoque" del combo, aquí tiene 4 comillas dobles.

Desde mi ignorancia, disculpa ¿no debería ser el mismo código tanto en origen de la fila del combo como en el evento al recibir enfoque del combo?

Sin embargo así todo funciona bien, más que nada te lo pregunto por entenderlo si no es mucha molestia y con esto cierro la pregunta.

Y es el mismo, pero en VBA para poner una comilla doble la tienes que duplicar o usar una comilla simple, en vez de la doble.

Eso es porque la comilla doble se usa para delimitar cadenas de texto.

¡Gracias! 

Pues muchísimas gracias por todo. Te agradezco en el alma la ayuda y la explicación. Así poco a poco voy aprendiendo.

¡Gracias! 

Pues muchísimas gracias por todo. Te agradezco en el alma la ayuda y la explicación de las comillas. Así poco a poco voy aprendiendo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas