Problema con ComboBox y ListBox

28/06/2005 - 19:28 por javi | Informe spam
Hola

Tengo un formulario con un combobox y un listbox para seleccionar
productos de una base de datos que está en otro libro.

Si escribo la primera letra del código de producto en cualquiera de los
dos, me muestra el primer valor que empieza por esa letra. Hasta aquí bien.

Si pulso otra vez la misma letra el combobox me da un error y me pasa a
depurar la siguiente línea de código:

ListBoxCodPdto.Text = ComboBoxCodPdto.Text

el error me indica que "No se puede configurar la propiedad Text. Valor
de propiedad no válido."

Los dos muestran el mismo valor para que se pueda seleccionar el código
de producto desde cualquiera de los dos.

Por otra parte ¿se puede hacer que cuando escriba la seguna, tercera,
cuarta,... letras del código me muestre (en esos objetos o en cualquier
otro que tenga que añadir) sólo los códigos que comienzan por esa/s
letra/s para que lo seleccione de esa lista ya filtrada?

Muchas gracias por vuestra ayuda.

Javi

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
28/06/2005 - 22:04 | Informe spam
hola, javi !

... formulario con un combobox y un listbox para seleccionar productos de una base de datos que está en otro libro.
... escribo la primera letra del codigo... en cualquiera de los dos... muestra el primer valor que empieza por esa letra.
... pulso otra vez la misma letra el combobox me da un error y me pasa a depurar la siguiente linea de codigo:
ListBoxCodPdto.Text = ComboBoxCodPdto.Text
... "No se puede configurar la propiedad Text. Valor de propiedad no valido."
... muestran el mismo valor para que se pueda seleccionar el codigo de producto desde cualquiera de los dos.
... que cuando escriba la seguna, tercera, cuarta,... letras... muestre... solo los... que comienzan por esa/s letra/s [...]



[segun la ayuda en linea vba-excel con respecto de la propiedad 'Text' aplicada a objetos combo y lista]...
Para un control ListBox, el valor del control Text debe coincidir con una entrada existente de la lista.
Especificar un valor que no coincide con una entrada existente de la lista produce un error.
No puede utilizar el control Text para cambiar el valor de una entrada en un control ComboBox o ListBox,
para ello utilice la propiedad Column o List.

hubo una conversacion que [aunque se trata de un combo incrustado en hoja de calculo y a falta de mayor detalle]...
[creo que] no te seria dificil encontrar la forma de adaptarlo a los controles de tu formulario :))
visita: http://tinyurl.com/bbxuw

si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Fabian
30/06/2005 - 07:29 | Informe spam
Aqui tienes otro codigo escrito y explicado por Hector

' primero, declarmos las variables necesarias [y sus tipos] '
Dim Sig As Integer, Pulsos As Integer, Patron As String, Celda As Range
' este evento se 'dispara/acciona' cada vez que el usuario cambia de
celda/rango '
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' primero [e invariablemente] 'ocultamos' los objetos [el combo y la
lista] '
ComboBox1.Visible = False
ListBox1.Visible = False
' ahora, 'trabajamos' sobre la celda activa '
With ActiveCell
' primero 'detectamos' si está entre A2:An [columna A y filas 2 a
'última' MAS UNA] '
If .Column = 1 And .Row > 1 And .Row <= [a65536].End(xlUp).Row + 1 Then
' establecemos la posicion del combo para 'igualarla' a la
celda/columna A '
' con 'ligeros ajustes' [por si la celda se auto-ajusta al número de
caracteres] '
ComboBox1.Left = .Left
ComboBox1.Top = .Top - 1
ComboBox1.Width = .Width + 20
' ahora, 'llamamos' al procedimiento que 'llena' el combo con los
nombres '
ActualizaNombres ' los nombres 'se cargan' SIN repetidos '
End If
' si la celda activa NO está entre A2:An [columna A y filas 2 a 'última'
MAS UNA]... '
' el combo y la lista se quedan 'invisibles' :)) '
End With
End Sub
' este evento se 'dispara/acciona' cada vez que se pulsan caracteres EN el
combo '
Private Sub ComboBox1_Change()
' 'lamamos' al procedimiento que 'actualiza' la lista ['contraparte' del
combo] '
ActualizaLista
End Sub
' este evento se 'dispara/acciona' en cuanto el combo 'recibe el enfoque' '
Private Sub ComboBox1_GotFocus()
' primero 'le decimos' al código que no ha habido 'pulsaciones' EN el
combo '
Pulsos = 0
' establecemos la posición en la que será presentada la lista [con
relación a combo] '
With ComboBox1
ListBox1.Left = .Left + .Width + 2
ListBox1.Top = .Top
ListBox1.Width = .Width
End With
' y... mostramos la lista '
ListBox1.Visible = True
End Sub
' este evento se 'dispara/acciona' cada vez que se 'pulsan' datos en el
cuadro del combo '
Private Sub ComboBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
' primero 'averiguamos' cual es la tecla que ha pulsado el usuario '
Select Case KeyCode
' si se pulsa {Enter}/{Entrar} | {Return}/{Intro} o {Escape}... '
Case vbKeyReturn, vbKeyEscape
' 'enviamos' unas pulsaciones de teclado para 'salir/terminar' con el
combo '
SendKeys "{Esc}"
' si se ha pulsado la tecla {Retroceso}... '
Case vbKeyBack
' le decimos al código que 'reste' 1 al número de pulsaciones EN el
combo '
If Pulsos > 0 Then Pulsos = Pulsos - 1
' si se ha pulsado espacio, cualquier número o letra
[mayúscula/minúscula]... '
Case 32, 48 To 57, 65 To 90, 97 To 122
' le decimos al código que 'sume' 1 al número de pulsaciones EN el
combo '
Pulsos = Pulsos + 1
' NOTA: con cualquier otro caracter... NO 'hace nada'... '
' FALTA 'detectar' los caracteres 'especiales' [como puntuaciones,
acentos, eñes...] '
End Select
End Sub
' este evento se 'dispara/acciona' en cuanto el combo 'pierde el enfoque' '
Private Sub ComboBox1_LostFocus()
' si la celda activa 'ya tenía algo'... [habrá que modificarla por el
cuadro de lista] <= OJO '
If ActiveCell <> "" And ActiveCell <> ComboBox1 Then Exit Sub
' si el combo no está 'vacío'... 'ponemos' su contenido EN la celda activa
'
If Trim(ComboBox1) <> "" Then ActiveCell = ComboBox1
End Sub
' este evento se 'dispara/acciona' cuando se 'clicka' algún elemento del
cuadro de lista '
Private Sub ListBox1_Click()
' 'trabajamos' con los elementos de la lista '
With ListBox1
' si existe [al menos] alguno mostrándose en la lista... '
If .ListCount > 0 Or .ListIndex > -1 Then
' 'ponemos' EN la celda activa al elemento 'seleccionado' '
ActiveCell = .List(.ListIndex)
' y [también] 'lo pasamos' al combo '
ComboBox1 = ActiveCell
End If ' después [e invariablemente]... '
' 'des-seleccionamos' al elemento [que hubiera estado seleccionado] '
.ListIndex = -1
' y 'liberamos' el enfoque del cuadro de lista '
SendKeys "{Esc 2}"
End With
End Sub
' este procedimiento se encarga de llenar el combo con los nombres [y
mostrarlo] '
Private Sub ActualizaNombres()
' primero, declaramos una variable para 'recolectar' los nombres del rango
'
Dim Nombres As New Collection
' la siguiente instruccion ES INEVITABLE [el llenado de la colección
produce errores] '
On Error Resume Next
' un bucle para recorrer TODAS las celdas en el rango y... '
For Each Celda In Range([a2], [a65536].End(xlUp))
' si la celda NO está 'vacía'... la vamos pasando a la colección SIN
repeticiones '
If Trim(Celda) <> "" Then Nombres.Add Celda, CStr(Celda)
Next
' ahora [primero y siempre] 'vaciamos/limpiamos' los elementos contenidos
en el combo '
ComboBox1.Clear
' un bucle para 'pasar' los nombres [recolectados] al combo '
For Sig = 1 To Nombres.Count
ComboBox1.AddItem Nombres.Item(Sig)
Next
' [para empezar] le 'ponemos' al combo el contenido de la celda activa '
ComboBox1 = ActiveCell
' [como segundo paso] mostramos el combo '
ComboBox1.Visible = True
' y lo activamos [al activarlo se muestra el cuadro de lista con el
'_GotFocus'] '
ComboBox1.Activate
' finalmente [y es opcional]... desplegamos la lista DEL combo '
ComboBox1.DropDown
End Sub
' este procedimiento se encarga de llenar el cuadro de lista con los
'parecidos/pulsados' '
Private Sub ActualizaLista()
' primero, si no ha habido pulsaciones... [no tiene caso seguir con éste
código] :)) '
If Not Pulsos > 0 Then Exit Sub
' primero, declaramos una variable para 'recolectar' los nombres
'parecidos' '
Dim Parecidos As New Collection
' la siguiente instruccion ES INEVITABLE [el llenado de la colección
produce errores] '
On Error Resume Next
' definimos 'el patrón' [para buscar 'parecidos'] con los caracteres
pulsados '
Patron = LCase(Left(ComboBox1, Pulsos))
' un bucle para recorrer TODAS las celdas en el rango y... '
For Each Celda In Range([a2], [a65536].End(xlUp))
' si la celda 'coincide' con 'el patrón'... la vamos pasando a la
colección SIN repetidos '
If LCase(Left(Celda, Pulsos)) = Patron Then Parecidos.Add Celda,
CStr(Celda)
Next
' primero [y siempre] 'vaciamos/limpiamos' el cuadro de lista [para NO
'duplicar'] '
ListBox1.Clear
' un bucle para 'pasar' los 'parecidos' [recolectados] al cuadro de lista
'
For Sig = 1 To Parecidos.Count
ListBox1.AddItem Parecidos.Item(Sig)
Next
End Sub
Respuesta Responder a este mensaje
#3 javi
04/07/2005 - 23:52 | Informe spam
Hola

Muchas gracias a los dos, voy a necesitar algo de timepo para entenderlo
(es lo que tenemos los novatos;-) ) pero gracias a ambos.

Un saludo

Javi

Fabian escribió:
Aqui tienes otro codigo escrito y explicado por Hector

' primero, declarmos las variables necesarias [y sus tipos] '
Dim Sig As Integer, Pulsos As Integer, Patron As String, Celda As Range
' este evento se 'dispara/acciona' cada vez que el usuario cambia de
celda/rango '
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' primero [e invariablemente] 'ocultamos' los objetos [el combo y la
lista] '
ComboBox1.Visible = False
ListBox1.Visible = False
' ahora, 'trabajamos' sobre la celda activa '
With ActiveCell
' primero 'detectamos' si está entre A2:An [columna A y filas 2 a
'última' MAS UNA] '
If .Column = 1 And .Row > 1 And .Row <= [a65536].End(xlUp).Row + 1 Then
' establecemos la posicion del combo para 'igualarla' a la
celda/columna A '
' con 'ligeros ajustes' [por si la celda se auto-ajusta al número de
caracteres] '
ComboBox1.Left = .Left
ComboBox1.Top = .Top - 1
ComboBox1.Width = .Width + 20
' ahora, 'llamamos' al procedimiento que 'llena' el combo con los
nombres '
ActualizaNombres ' los nombres 'se cargan' SIN repetidos '
End If
' si la celda activa NO está entre A2:An [columna A y filas 2 a 'última'
MAS UNA]... '
' el combo y la lista se quedan 'invisibles' :)) '
End With
End Sub
' este evento se 'dispara/acciona' cada vez que se pulsan caracteres EN el
combo '
Private Sub ComboBox1_Change()
' 'lamamos' al procedimiento que 'actualiza' la lista ['contraparte' del
combo] '
ActualizaLista
End Sub
' este evento se 'dispara/acciona' en cuanto el combo 'recibe el enfoque' '
Private Sub ComboBox1_GotFocus()
' primero 'le decimos' al código que no ha habido 'pulsaciones' EN el
combo '
Pulsos = 0
' establecemos la posición en la que será presentada la lista [con
relación a combo] '
With ComboBox1
ListBox1.Left = .Left + .Width + 2
ListBox1.Top = .Top
ListBox1.Width = .Width
End With
' y... mostramos la lista '
ListBox1.Visible = True
End Sub
' este evento se 'dispara/acciona' cada vez que se 'pulsan' datos en el
cuadro del combo '
Private Sub ComboBox1_KeyDown( _
ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
' primero 'averiguamos' cual es la tecla que ha pulsado el usuario '
Select Case KeyCode
' si se pulsa {Enter}/{Entrar} | {Return}/{Intro} o {Escape}... '
Case vbKeyReturn, vbKeyEscape
' 'enviamos' unas pulsaciones de teclado para 'salir/terminar' con el
combo '
SendKeys "{Esc}"
' si se ha pulsado la tecla {Retroceso}... '
Case vbKeyBack
' le decimos al código que 'reste' 1 al número de pulsaciones EN el
combo '
If Pulsos > 0 Then Pulsos = Pulsos - 1
' si se ha pulsado espacio, cualquier número o letra
[mayúscula/minúscula]... '
Case 32, 48 To 57, 65 To 90, 97 To 122
' le decimos al código que 'sume' 1 al número de pulsaciones EN el
combo '
Pulsos = Pulsos + 1
' NOTA: con cualquier otro caracter... NO 'hace nada'... '
' FALTA 'detectar' los caracteres 'especiales' [como puntuaciones,
acentos, eñes...] '
End Select
End Sub
' este evento se 'dispara/acciona' en cuanto el combo 'pierde el enfoque' '
Private Sub ComboBox1_LostFocus()
' si la celda activa 'ya tenía algo'... [habrá que modificarla por el
cuadro de lista] <= OJO '
If ActiveCell <> "" And ActiveCell <> ComboBox1 Then Exit Sub
' si el combo no está 'vacío'... 'ponemos' su contenido EN la celda activa
'
If Trim(ComboBox1) <> "" Then ActiveCell = ComboBox1
End Sub
' este evento se 'dispara/acciona' cuando se 'clicka' algún elemento del
cuadro de lista '
Private Sub ListBox1_Click()
' 'trabajamos' con los elementos de la lista '
With ListBox1
' si existe [al menos] alguno mostrándose en la lista... '
If .ListCount > 0 Or .ListIndex > -1 Then
' 'ponemos' EN la celda activa al elemento 'seleccionado' '
ActiveCell = .List(.ListIndex)
' y [también] 'lo pasamos' al combo '
ComboBox1 = ActiveCell
End If ' después [e invariablemente]... '
' 'des-seleccionamos' al elemento [que hubiera estado seleccionado] '
.ListIndex = -1
' y 'liberamos' el enfoque del cuadro de lista '
SendKeys "{Esc 2}"
End With
End Sub
' este procedimiento se encarga de llenar el combo con los nombres [y
mostrarlo] '
Private Sub ActualizaNombres()
' primero, declaramos una variable para 'recolectar' los nombres del rango
'
Dim Nombres As New Collection
' la siguiente instruccion ES INEVITABLE [el llenado de la colección
produce errores] '
On Error Resume Next
' un bucle para recorrer TODAS las celdas en el rango y... '
For Each Celda In Range([a2], [a65536].End(xlUp))
' si la celda NO está 'vacía'... la vamos pasando a la colección SIN
repeticiones '
If Trim(Celda) <> "" Then Nombres.Add Celda, CStr(Celda)
Next
' ahora [primero y siempre] 'vaciamos/limpiamos' los elementos contenidos
en el combo '
ComboBox1.Clear
' un bucle para 'pasar' los nombres [recolectados] al combo '
For Sig = 1 To Nombres.Count
ComboBox1.AddItem Nombres.Item(Sig)
Next
' [para empezar] le 'ponemos' al combo el contenido de la celda activa '
ComboBox1 = ActiveCell
' [como segundo paso] mostramos el combo '
ComboBox1.Visible = True
' y lo activamos [al activarlo se muestra el cuadro de lista con el
'_GotFocus'] '
ComboBox1.Activate
' finalmente [y es opcional]... desplegamos la lista DEL combo '
ComboBox1.DropDown
End Sub
' este procedimiento se encarga de llenar el cuadro de lista con los
'parecidos/pulsados' '
Private Sub ActualizaLista()
' primero, si no ha habido pulsaciones... [no tiene caso seguir con éste
código] :)) '
If Not Pulsos > 0 Then Exit Sub
' primero, declaramos una variable para 'recolectar' los nombres
'parecidos' '
Dim Parecidos As New Collection
' la siguiente instruccion ES INEVITABLE [el llenado de la colección
produce errores] '
On Error Resume Next
' definimos 'el patrón' [para buscar 'parecidos'] con los caracteres
pulsados '
Patron = LCase(Left(ComboBox1, Pulsos))
' un bucle para recorrer TODAS las celdas en el rango y... '
For Each Celda In Range([a2], [a65536].End(xlUp))
' si la celda 'coincide' con 'el patrón'... la vamos pasando a la
colección SIN repetidos '
If LCase(Left(Celda, Pulsos)) = Patron Then Parecidos.Add Celda,
CStr(Celda)
Next
' primero [y siempre] 'vaciamos/limpiamos' el cuadro de lista [para NO
'duplicar'] '
ListBox1.Clear
' un bucle para 'pasar' los 'parecidos' [recolectados] al cuadro de lista
'
For Sig = 1 To Parecidos.Count
ListBox1.AddItem Parecidos.Item(Sig)
Next
End Sub


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