De Acces a un Control en Excel

10/11/2006 - 22:16 por Arubiangt | Informe spam
Hola, el siguiente Codigo que me devuelve un resultado de varias filas y
colomunas:


Private Sub CommandButton2_Click()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & "C:\Documentos\CF_Datos.mdb;Jet OLEDB:Database Password=******"
Set rs = New ADODB.Recordset
rs.Open "select via_placa,via_viaje from VIAJES where via_placa = '000upb'", cn
'Sheets(1).Cells(2, 1).CopyFromRecordset rs
/* aqui lo puedo colocar en una hoja de Excel */
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub



Se puede colocar el resultado directamente en un cuadro de lista o un
textbox en el VBa de Excel?

Hector me ha enviado lo siguiente:

"si quieres evitar el 'pase' de tu recordset a un rango con el metodo
copyfromrecordset para llenar 'en directo' (un control) ...
podrias utilizar dos 'bucles' para el rescate de las 'varias' filas y
columnas y pasarlas [una por una] al control...
usando un bucle 'externo' para el avance por filas segun el numero de
registros en: -> rs.RecordCount
y otro bucle 'interno' para el avance por columnas segun el numero de campos
en: -> rs.Fields.Count"

Entiendo que debo hacer lo siguiente:

for Fil=0 to rs.fields.count
for Col=0 to rs.recordcount

List1.additem rs.*

next Col
next Fil

* Pero, que instruccion debo colocar para "direccionarme" al elemento en la
posicion Fil, Col?
Gracias

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
10/11/2006 - 23:54 | Informe spam
hola, ?

... Se puede colocar el resultado directamente en un cuadro de lista o un textbox en el VBa de Excel?
... que instruccion debo colocar para "direccionarme" al elemento en la posicion Fil, Col?



[hasta donde se] existen -al menos- dos formas de llenar controles de lista/combos con el resultado de consultas a BBDD

segun el numero de registros, pudiera resultar mas rapido 'bajar el recordset a un rango en hoja de calculo y luego 'subirlo' al control -?-
[p.e.] una vez que has 'leido/abierto/rescatado/... el recordset...

With Worksheets("una hoja oculta")
.Range("a1").CopyFromRecordset <objeto_recordset> ' vaciamos el recordset al rango '
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
<lista_o_combo>.ColumnCount = <objeto_recordset>.Fields.Count ' preparamos las columnas '
<lista_o_combo>.List = .Value ' cargamos los valores al control '
.ClearContents ' volvemos a dejar 'limpio' el rango donde se vacio el recordset :) '
End With
End With

si prefieres los 'bucles' y 'avanzar' dato-por-dato, fila-a-fila, columna-por-columna...
prueba con algo +/- como lo siguiente:

<objeto_recordset>.MoveFirst
Fil = 0
<lista_o_combo>.ColumnCount = <objeto_recordset>.Fields.Count
Do While Not <objeto_recordset>.EOF And Col <= <objeto_recordset>.Fields.Count - 1
<lista_o_combo>.AddItem
For Col = 0 To <objeto_recordset>.Fields.Count - 1
<lista_o_combo>.List(Fil, Col) = <objeto_recordset>.Fields(Col).Value
Next
<objeto_recordset>.MoveNext
Fil = Fil + 1
Loop

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la consulta y el codigo expuesto __
Hola, el siguiente Codigo que me devuelve un resultado de varias filas y colomunas:
Private Sub CommandButton2_Click()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & "C:\Documentos\CF_Datos.mdb;Jet OLEDB:Database Password=******"
Set rs = New ADODB.Recordset
rs.Open "select via_placa,via_viaje from VIAJES where via_placa = '000upb'", cn
'Sheets(1).Cells(2, 1).CopyFromRecordset rs
/* aqui lo puedo colocar en una hoja de Excel */
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub



Hector me ha enviado lo siguiente:
"si quieres evitar el 'pase' de tu recordset a un rango con el metodo copyfromrecordset para llenar 'en directo' (un control) ...
podrias utilizar dos 'bucles' para el rescate de las 'varias' filas y columnas y pasarlas [una por una] al control...
usando un bucle 'externo' para el avance por filas segun el numero de registros en: -> rs.RecordCount
y otro bucle 'interno' para el avance por columnas segun el numero de campos en: -> rs.Fields.Count"

Entiendo que debo hacer lo siguiente:

for Fil=0 to rs.fields.count
for Col=0 to rs.recordcount
List1.additem rs.*
next Col
next Fil

* Pero, que instruccion debo colocar para "direccionarme" al elemento en la posicion Fil, Col?
Respuesta Responder a este mensaje
#2 KL
11/11/2006 - 00:32 | Informe spam
Hola chicos,

?Y que hay del simple y llano GetRows?

ComboBox1.Column=rs.GetRows

ComboBox1.List=rs.GetRows

MiMatriz=rs.GetRows

Saludos,
KL


"Héctor Miguel" wrote in message news:
hola, ?

... Se puede colocar el resultado directamente en un cuadro de lista o un textbox en el VBa de Excel?
... que instruccion debo colocar para "direccionarme" al elemento en la posicion Fil, Col?



[hasta donde se] existen -al menos- dos formas de llenar controles de lista/combos con el resultado de consultas a BBDD

segun el numero de registros, pudiera resultar mas rapido 'bajar el recordset a un rango en hoja de calculo y luego 'subirlo' al
control -?-
[p.e.] una vez que has 'leido/abierto/rescatado/... el recordset...

With Worksheets("una hoja oculta")
.Range("a1").CopyFromRecordset <objeto_recordset> ' vaciamos el recordset al rango '
With Range(.Range("a1"), .Range("a1").End(xlToRight).End(xlDown))
<lista_o_combo>.ColumnCount = <objeto_recordset>.Fields.Count ' preparamos las columnas '
<lista_o_combo>.List = .Value ' cargamos los valores al control '
.ClearContents ' volvemos a dejar 'limpio' el rango donde se vacio el recordset :) '
End With
End With

si prefieres los 'bucles' y 'avanzar' dato-por-dato, fila-a-fila, columna-por-columna...
prueba con algo +/- como lo siguiente:

<objeto_recordset>.MoveFirst
Fil = 0
<lista_o_combo>.ColumnCount = <objeto_recordset>.Fields.Count
Do While Not <objeto_recordset>.EOF And Col <= <objeto_recordset>.Fields.Count - 1
<lista_o_combo>.AddItem
For Col = 0 To <objeto_recordset>.Fields.Count - 1
<lista_o_combo>.List(Fil, Col) = <objeto_recordset>.Fields(Col).Value
Next
<objeto_recordset>.MoveNext
Fil = Fil + 1
Loop

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ la consulta y el codigo expuesto __
Hola, el siguiente Codigo que me devuelve un resultado de varias filas y colomunas:
Private Sub CommandButton2_Click()
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & "C:\Documentos\CF_Datos.mdb;Jet OLEDB:Database
Password=******"
Set rs = New ADODB.Recordset
rs.Open "select via_placa,via_viaje from VIAJES where via_placa = '000upb'", cn
'Sheets(1).Cells(2, 1).CopyFromRecordset rs
/* aqui lo puedo colocar en una hoja de Excel */
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub



Hector me ha enviado lo siguiente:
"si quieres evitar el 'pase' de tu recordset a un rango con el metodo copyfromrecordset para llenar 'en directo' (un control) ...
podrias utilizar dos 'bucles' para el rescate de las 'varias' filas y columnas y pasarlas [una por una] al control...
usando un bucle 'externo' para el avance por filas segun el numero de registros en: -> rs.RecordCount
y otro bucle 'interno' para el avance por columnas segun el numero de campos en: -> rs.Fields.Count"

Entiendo que debo hacer lo siguiente:

for Fil=0 to rs.fields.count
for Col=0 to rs.recordcount
List1.additem rs.*
next Col
next Fil

* Pero, que instruccion debo colocar para "direccionarme" al elemento en la posicion Fil, Col?




Respuesta Responder a este mensaje
#3 Héctor Miguel
11/11/2006 - 03:27 | Informe spam
hola, KL !

?Y que hay del simple y llano GetRows?
ComboBox1.Column=rs.GetRows
ComboBox1.List=rs.GetRows
MiMatriz=rs.GetRows



[me parece que] el metodo 'GetRows' [ADO]... no es 'tan simple... ni tan llano' :-(

GetRows Method (ADO) -> http://tinyurl.com/ygdo5l

de acuerdo con el siguiente articulo [casi al final del mismo]:
Microsoft Systems Journal
The DAO of Databases: Using Data Access Objects and the Jet Engine in C++
http://tinyurl.com/uunvu

-> GetRows toma solo un argumento: el numero de filas/registros/... a extraer.
devuelve todos los campos del 'RecordSet' en una unica variable 'Variant' contenidos en una 'matriz segura' de dos dimensiones
la matriz queda 'indizada' por campo y registro
depende del 'usuario' analizar la matriz usando las funciones estandar para 'matrices seguras'

saludos,
hector.
Respuesta Responder a este mensaje
#4 KL
11/11/2006 - 12:35 | Informe spam
Hola HM,

[me parece que] el metodo 'GetRows' [ADO]... no es 'tan simple... ni tan llano' :-(
GetRows Method (ADO) -> http://tinyurl.com/ygdo5l



He leido este articulo y no entiendo tu comentario. Pense que la idea era ver las formas de usar los valores contenidos en un rs y
yo segeri uno mas que no precisa del uso de hojas y traslada la BD a una matriz la cual se puede manipular como uno quiera.

de acuerdo con el siguiente articulo [casi al final del mismo]:
Microsoft Systems Journal
The DAO of Databases: Using Data Access Objects and the Jet Engine in C++
http://tinyurl.com/uunvu

-> GetRows toma solo un argumento: el numero de filas/registros/... a extraer.
devuelve todos los campos del 'RecordSet' en una unica variable 'Variant' contenidos en una 'matriz segura' de dos dimensiones
la matriz queda 'indizada' por campo y registro
depende del 'usuario' analizar la matriz usando las funciones estandar para 'matrices seguras'



Es que existe algun problema con esto? No veo que quieres decir con esto, me podrias indicar el lugar mas exxacto del articulo (tal
vez el nuemro del parrafo)?

Gracias y saludos,
KL
Respuesta Responder a este mensaje
#5 Héctor Miguel
11/11/2006 - 19:18 | Informe spam
hola, KL !

1) [en realidad] el comentario viene a raiz de que [yo] no encontre 'ventajas' [en terminos de 'simple y llano'] al uso del metodo 'GetRows'
en comparacion con los metodos 'sugeridos' en mensajes anteriores [y basados en pruebas realizadas previamente]

a) cuando la intencion es mostrar en un control lista/combo el contenido de una BBDD [en terminos de filas y columnas]
b) [segun yo] el 'detalle' esta -precisamente- en la 'necesidad' de hacer una 'manipulacion' [adicional ?] con la matriz devuelta -?-

2) no creo que haya ningun 'problema' con el uso del metodo y/o el contenido del articulo -?-
[quizas]... si expones un procedimiento +/- 'adaptado' para:
-> llenar un control lista/combo con una BBDD de 3 [o mas] campos y 2 [o mas] registros ?

[p.e.] una ves obtenido el recordset...

a) usando un rango 'puente':
1) 'bajarlo' a un rango en cualquier hoja
2) 'subirlo' al control lista/combo

b) usando bucles dentro del recordset:
1) 'buclear' dentro del recordset [filas/columnas] e 'ir llenando' el control lista/combo
-> 'parecen' menos pasos, pero pudiera resultar mas 'lento' -?-

c) a traves del metodo 'GetWows':
1) 'mandarlo' a una matriz variant [de 2 dimensiones]: -> GetRows
2) 'descomponer' la matriz variant [p.e. usando 'Spit' ?]
3) 'buclear' dentro de la matriz [de 2 dimensiones] para obtener campo y registro
4) [probablemente mas bucles para] 'agrupar' campo y registro hasta completar los campos de la BBDD y poder...
5) 'ir llenando' el control lista/combo

igual y estoy 'viendo moros con tranchete' :))
[creo que] solo necesito un ejemplo que me aporte elementos para cambiar de opinion en cuanto a un metodo 'sobre' otro/s ;)

si algo de 'mis supuesto' no es claro en la exposicion anterior... comentas ? [para ver como 'ampliamos las dudas'] :D

saludos,
hector.

[las conversaciones anteriores]:
__ 1 __
[hm] [me parece que] el metodo 'GetRows' [ADO]... no es 'tan simple... ni tan llano' :-(
GetRows Method (ADO) -> http://tinyurl.com/ygdo5l

[KL] He leido este articulo y no entiendo tu comentario.
Pense que la idea era ver las formas de usar los valores contenidos en un rs
y yo segeri uno mas que no precisa del uso de hojas y traslada la BD a una matriz la cual se puede manipular como uno quiera.

__ 2 __
[hm] de acuerdo con el siguiente articulo [casi al final del mismo]: Microsoft Systems Journal
The DAO of Databases: Using Data Access Objects and the Jet Engine in C++
http://tinyurl.com/uunvu
GetRows toma solo un argumento: el numero de filas/registros/... a extraer.
devuelve todos los campos del 'RecordSet' en una unica variable 'Variant' contenidos en una 'matriz segura' de dos dimensiones
matriz queda 'indizada' por campo y registro
depende del 'usuario' analizar la matriz usando las funciones estandar para 'matrices seguras'

[KL] Es que existe algun problema con esto?
No veo que quieres decir con esto, me podrias indicar el lugar mas exacto del articulo (tal vez el numero del parrafo)?
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida