Consultar base datos Access

29/08/2008 - 00:07 por Boris | Informe spam
Hola a todos.

Mi consulta es la siguiente. Hace tiempo encontré el siguiente código
que me trae información de una base de datos en access. Se supone que
al digitar un código en A1, lo busca en la tabla y me lo trae a excel.

El código es el siguiente:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count <> 1 Then Exit Sub
Dim cnn1 As New ADODB.Connection
Dim rsProductos As New ADODB.Recordset
Dim strSentenciaSQL As String
'Crear una conexión a la base de datos.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:
\Boris Durango\Tablas Base HL\Bases93-2006.mdb;" & "User Id=admin;" &
"Password="
'Establecer la propiedad Source del Recordset
strSentenciaSQL = "SELECT * FROM Basica WHERE " & "Cedula = " &
Target.Value & ";"
'Crear el recordset
rsProductos.Open Source:=strSentenciaSQL, ActiveConnection:=cnn1,
CursorType:=adOpenKeyset, LockType:=adLockOptimistic
Application.EnableEvents = False
If rsProductos.RecordCount = 0 Then
ActiveSheet.Range("A2").Value = "Código de producto no
encontrado."
Else
ActiveSheet.Range("A2").Value = rsProductos!Nombre
'ActiveSheet.Range("B2").Value = reProductos!Sexo
End If
Application.EnableEvents = True
'Cerrar y liberar objetos
cnn1.Close
Set cnn1 = Nothing
Set rsProductos = Nothing
End Sub

El problema es que no siempre realiza los cambios, o sea, digito un
código en A1 que está en la tabla de access y no trae información a
excel. No tengo idea a que se deba.

Lo otro es que (cuando funciona) no me trae más registros de la tabla,
por ejemplo, quisiera traer a B2 el campo sexo, pero me genera error
en la línea. Supongo que es porque la asignación no permite sino un
campo.

He tratado de hacerlo por msquery, pero cada vez que quiero filtrar
por código me toca ingresar a la consulta, y no es muy práctico.

Agradezco cualquier aporte.

Gracias

Boris
 

Leer las respuestas

#1 Héctor Miguel
29/08/2008 - 01:37 | Informe spam
hola, !

__ 1 __
... encontre el siguiente codigo que me trae informacion de una base de datos en access.
Se supone que al digitar un codigo en A1, lo busca en la tabla y me lo trae a excel (...)
El problema es que no siempre realiza los cambios, o sea, digito un codigo en A1 que está en la tabla de access
y no trae informacion a excel. No tengo idea a que se deba.



1) probablemente se deba a que (efectivamente) no existen registros que coincidan en la consulta -???-

__ 2 __
Lo otro es que (cuando funciona) no me trae mas registros de la tabla, por ejemplo
quisiera traer a B2 el campo sexo, pero me genera error en la linea.
Supongo que es porque la asignacion no permite sino un campo.



2) segun parece, en la linea que no funciona (la que tienes con marca de comentario) tienes un error tipografico:
haces referencia al objeto creado (RecordSet) como si lo hubieras nombrado "re" y debiera ser "rs"

__ 3 __
He tratado de hacerlo por msquery, pero cada vez que quiero filtrar por codigo me toca ingresar a la consulta, y no es muy practico.



3) te paso posibles alternativas en seguida para evitar las macros y usar parametros en una consulta por ms-query

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

puedes parametrizar las consultas externas en excel a traves de ms-query, usando -nuevamente- el asistente si...
una vez que termines con el asistente para finalizar la consulta a la base de datos... si deseas agregar parametros variables...
1) puedes consultar/modificar/... la sentencia de la consulta (sql) desde el mismo menu de datos (o la BH de datos externos)
-> solicita modificar la consulta
-> avanza hasta el ultimo paso (finalizar)
-> en lugar de devolver los datos a excel... selecciona ->ver datos o modificar consulta en MS Query<-
-> elige: (menu) ver / sql... (o de la BH el icono de SQL)
2) una vez que decidas que partes de la consulta deseas convertir en parametros...
-> sustituye la/s fraccion/es apropiada/s de la sentencia por un signo ? (opcionalmente pudes darles un identificador CORTO)
(lo anterior ocasiona que ANTES de refrescar una consulta, MS-Query te pregunta por el -nuevo- valor del parametro)
-> termina la modificacion y devueve los datos a excel (tendras que responder una cuantas preguntas a los parametros)
3) posteriormente, puedes sustituir la/s pregunta/s de MS-Query por los valores que pueda tomar de celdas en tu hoja...
-> vuelve a ejecutar (menu) datos / obtener datos externos / parametros... (o desde la BH de datos externos)
-> selecciona (por cada parametro) la opcion de: tomar el valor de la siguiente celda:
-> y (obviamente) selecciona la celda apropiada para cada parametro
4) segun la parte de la sentencia sql que hayas parametrizado... debera haber una celda son la sintaxis EXACTA del parametro -?-

si deseas consultar sitios con informacion al respecto... visita:
-> Andy Wiggins: http://www.bygsoftware.com/Excel/sql.htm
-> Ole P. Erlandsen: http://www.erlandsendata.no/english...connstring
-> Carl Prothman: http://www.carlprothman.net/Default.aspx?tabid‡#OLEDBProviderForSQL...
-> Dick Kusleika: http://www.carlprothman.net/Default.aspx?tabid‡#OLEDBProviderForSQLServer

__ el codigo expuesto __
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count <> 1 Then Exit Sub
Dim cnn1 As New ADODB.Connection
Dim rsProductos As New ADODB.Recordset
Dim strSentenciaSQL As String
'Crear una conexión a la base de datos.
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\Boris Durango\Tablas Base HL\Bases93-2006.mdb;" & "User Id=admin;" & "Password="
'Establecer la propiedad Source del Recordset
strSentenciaSQL = "SELECT * FROM Basica WHERE " & "Cedula = " & Target.Value & ";"
'Crear el recordset
rsProductos.Open Source:=strSentenciaSQL, ActiveConnection:=cnn1, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
Application.EnableEvents = False
If rsProductos.RecordCount = 0 Then
ActiveSheet.Range("A2").Value = "Código de producto no encontrado."
Else
ActiveSheet.Range("A2").Value = rsProductos!Nombre
'ActiveSheet.Range("B2").Value = reProductos!Sexo
End If
Application.EnableEvents = True
'Cerrar y liberar objetos
cnn1.Close
Set cnn1 = Nothing
Set rsProductos = Nothing
End Sub

Preguntas similares