Rellenar un Combobox con datos de una consulta

27/05/2009 - 00:21 por Gustavo Echenique | Informe spam
Hola Foro!

Estoy tratando de rellenar un combobox de 3 columnas con los datos de una
consulta realizada a un motor de bases de datos Informix.

La consulta se realiza perfectamente, ya que lo puedo comprobar mediante el
debug, pero la carga de datos en el ComboBox me arroja un error diciendo que
necesita un objeto.
El código de llenado es el siguiente:
While Not datos.EOF
Combo1.List(nFila, 0) = CStr(datos(0).Value)
Combo1.List(nFila, 1) = datos(1).Value
Combo1.List(nFila, 2) = datos(2).Value
datos.MoveNext
nFila = nFila + 1
Wend

En donde "datos" es el recordset que contiene los datos y obviamente
"Combo1" es el ComboBox en donde quiero que se inserten los datos.

Agradecería me marquen el error para así solucionarlo.

Desde ya, agradezco infinitamente su ayuda.

Saludos!

Gustavo Echenique

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
29/05/2009 - 06:29 | Informe spam
hola, Gustavo !

... use el Sub Form_Load(), pero estoy utilizando VBA, que me esta trayendo muchos quebraderos de cabeza
con las funciones que en VB si funcionan, por lo que he visto en ejemplos.
En realidad, no queda nada más en el tintero...



no se alcanza a apreciar alguna causa de error en el codigo y asumo que el nombre del procedimiento ("Form_Load")
simplemente es un procedimiento "normal" y no un procedimiento de evento "clasico" de VB (stand-alone)

podrias comentar cual linea de codigo se marca cuando te avisa del error: "el objeto no admite esta propiedad o metodo" (?)

saludos,
hector.
Respuesta Responder a este mensaje
#7 Gustavo Echenique
05/06/2009 - 14:57 | Informe spam
Hola Héctor!

Te doy las gracias por amabilísima atención, y te solicito disculpas por la
demora en contestar, pero he estado muy sobrecargado con otros temas en mi
trabajo, y ahora estoy retomando éste.
Con respecto a la línea en donde arroja el error, es en la primera
asignación de valor mediante List.

Espero te guíe a la solución.

Un abrazo.

Gustavo Echenique
"Héctor Miguel" escribió en el mensaje
news:
hola, Gustavo !

... use el Sub Form_Load(), pero estoy utilizando VBA, que me esta
trayendo muchos quebraderos de cabeza
con las funciones que en VB si funcionan, por lo que he visto en
ejemplos.
En realidad, no queda nada más en el tintero...



no se alcanza a apreciar alguna causa de error en el codigo y asumo que el
nombre del procedimiento ("Form_Load")
simplemente es un procedimiento "normal" y no un procedimiento de evento
"clasico" de VB (stand-alone)

podrias comentar cual linea de codigo se marca cuando te avisa del error:
"el objeto no admite esta propiedad o metodo" (?)

saludos,
hector.

Respuesta Responder a este mensaje
#8 Héctor Miguel
06/06/2009 - 05:36 | Informe spam
hola, Gustavo !

Con respecto a la línea en donde arroja el error, es en la primera asignacion de valor mediante List...



ok, de acuerdo con tu mas reciente codigo (segun exposicion en mensajes anteriores)...
el uso que haces de la propiedad .List para rellenar el control con el objeto recordset es +/- asi:

= nFila = 0
datos.MoveFirst
While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos(0).Value) ' Como este dato es numérico lo convierto a string
Hoja1!Combo1.List(nFila, 1) = datos(1).Value
Hoja1!Combo1.List(nFila, 2) = datos(2).Value
datos.MoveNext
nFila = nFila + 1
Wend
=
y el error que obtienes se deriva al NO especificar el campo (columna) del recordset a pasar a la columna en el combo
prueba modificando las instrucciones anteriores +/- a lo siguiente:

- cambia el While...Wend por: -> Do While...Loop
- agrega la propiedad .Field(...) al rescatar los datos del recordset

nFila = 0
datos.MoveFirst
Do While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos.Fields(0).Value)
Hoja1!Combo1.List(nFila, 1) = datos.Fields(1).Value
Hoja1!Combo1.List(nFila, 2) = datos.Fields(2).Value
datos.MoveNext
nFila = nFila + 1
Loop

otra posible solucion/alternativa/... (segun el numero de registros) que pudiera resultar mas rapido
es "bajar" el recordset a un rango en hoja de calculo y luego "subirlo" al control (excel 2000 en adelante)
(p.e.) una vez que has leido/abierto/rescatado/... el recordset...

With Worksheets("una hoja oculta")
.Range("a1").CopyFromRecordset datos ' vaciamos el recordset al rango '
With .Range("a1").CurrentRegion
Hoja1!Combo1.List = .Value ' cargamos los valores al control '
.ClearContents ' volvemos a dejar 'limpio' el rango donde se vacio el recordset :) '
End With
End With

otra posible solucion/alternativa/... mas, es la propuesta en alguno de tus consultas anteriores: <objeto recordset>.GetRows

op1:
Hoja1!Combo1.List = datos.GetRows

op2:
Hoja1!Combo1.Columns = datos.GetRows

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#9 Gustavo Echenique
16/06/2009 - 18:19 | Informe spam
Héctor, sos un veradero genio!.

Muchas gracias por compartir tus conocimientos.

Un abrazo.

Gustavo Echenique

"Héctor Miguel" escribió en el mensaje
news:
hola, Gustavo !

Con respecto a la línea en donde arroja el error, es en la primera
asignacion de valor mediante List...



ok, de acuerdo con tu mas reciente codigo (segun exposicion en mensajes
anteriores)...
el uso que haces de la propiedad .List para rellenar el control con el
objeto recordset es +/- asi:

=> nFila = 0
datos.MoveFirst
While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos(0).Value) ' Como este dato es
numérico lo convierto a string
Hoja1!Combo1.List(nFila, 1) = datos(1).Value
Hoja1!Combo1.List(nFila, 2) = datos(2).Value
datos.MoveNext
nFila = nFila + 1
Wend
=>
y el error que obtienes se deriva al NO especificar el campo (columna) del
recordset a pasar a la columna en el combo
prueba modificando las instrucciones anteriores +/- a lo siguiente:

- cambia el While...Wend por: -> Do While...Loop
- agrega la propiedad .Field(...) al rescatar los datos del recordset

nFila = 0
datos.MoveFirst
Do While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos.Fields(0).Value)
Hoja1!Combo1.List(nFila, 1) = datos.Fields(1).Value
Hoja1!Combo1.List(nFila, 2) = datos.Fields(2).Value
datos.MoveNext
nFila = nFila + 1
Loop

otra posible solucion/alternativa/... (segun el numero de registros) que
pudiera resultar mas rapido
es "bajar" el recordset a un rango en hoja de calculo y luego "subirlo" al
control (excel 2000 en adelante)
(p.e.) una vez que has leido/abierto/rescatado/... el recordset...

With Worksheets("una hoja oculta")
.Range("a1").CopyFromRecordset datos ' vaciamos el recordset al rango '
With .Range("a1").CurrentRegion
Hoja1!Combo1.List = .Value ' cargamos los valores al control '
.ClearContents ' volvemos a dejar 'limpio' el rango donde se vacio el
recordset :) '
End With
End With

otra posible solucion/alternativa/... mas, es la propuesta en alguno de
tus consultas anteriores: <objeto recordset>.GetRows

op1:
Hoja1!Combo1.List = datos.GetRows

op2:
Hoja1!Combo1.Columns = datos.GetRows

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

Respuesta Responder a este mensaje
#10 Héctor Miguel
16/06/2009 - 18:44 | Informe spam
hola, Gustavo !

... gracias por compartir ...



gracias a ti, por el "feed-back" (y por tus comentarios) :D

solo para los registros... podrias informar cual opcion fue la que ha servido a tu caso ?

saludos,
hector.

__ previos __
Con respecto a la línea en donde arroja el error, es en la primera asignacion de valor mediante List...



ok, de acuerdo con tu mas reciente codigo (segun exposicion en mensajes anteriores)...
el uso que haces de la propiedad .List para rellenar el control con el objeto recordset es +/- asi:

=>> nFila = 0
datos.MoveFirst
While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos(0).Value) ' Como este dato es numérico lo convierto a string
Hoja1!Combo1.List(nFila, 1) = datos(1).Value
Hoja1!Combo1.List(nFila, 2) = datos(2).Value
datos.MoveNext
nFila = nFila + 1
Wend
=>>
y el error que obtienes se deriva de NO especificar el campo (columna) del recordset a pasar a la columna en el combo
prueba modificando las instrucciones anteriores +/- a lo siguiente:

- cambia el While...Wend por: -> Do While...Loop
- agrega la propiedad .Field(...) al rescatar los datos del recordset

nFila = 0
datos.MoveFirst
Do While Not datos.EOF
Hoja1!Combo1.List(nFila, 0) = CStr(datos.Fields(0).Value)
Hoja1!Combo1.List(nFila, 1) = datos.Fields(1).Value
Hoja1!Combo1.List(nFila, 2) = datos.Fields(2).Value
datos.MoveNext
nFila = nFila + 1
Loop

otra posible solucion/alternativa/... (segun el numero de registros) que pudiera resultar mas rapido
es "bajar" el recordset a un rango en hoja de calculo y luego "subirlo" al control (excel 2000 en adelante)
(p.e.) una vez que has leido/abierto/rescatado/... el recordset...

With Worksheets("una hoja oculta")
.Range("a1").CopyFromRecordset datos ' vaciamos el recordset al rango '
With .Range("a1").CurrentRegion
Hoja1!Combo1.List = .Value ' cargamos los valores al control '
.ClearContents ' volvemos a dejar 'limpio' el rango donde se vacio el recordset :) '
End With
End With

otra posible solucion/alternativa/... mas, es la propuesta en alguno de tus consultas anteriores: <objeto recordset>.GetRows

op1:
Hoja1!Combo1.List = datos.GetRows

op2:
Hoja1!Combo1.Columns = datos.GetRows

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida