Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

buscar un registro en una tabla de access

60 views
Skip to first unread message

pep

unread,
Feb 11, 2003, 12:26:00 PM2/11/03
to
En una celda (a1) de una hoja en excel, debo introducir un dato (codigo de
articulo) y que me devuelva la descripcion en la celda (a2) en caso de
existir el codigo de articulo. El registro está en una tabla de una base
de datos de access. ¿Como puedo hacerlo?
muchas gracias por anticipado, a todos.
pep


--------------------------------------------------

Mensaje enviado desde http://grupos.buscadoc.org

--------------------------------------------------

Fernando Arroyo

unread,
Feb 11, 2003, 2:00:58 PM2/11/03
to
Lo puedes hacer con ADO, con DAO o usando MS Query.
Si nos dices cómo se llama la base de datos, la ruta en que se encuentra y
los nombres de la tabla, del campo que tiene el código del artículo y del
campo que tiene la descripción, podremos escribir el código evitando los
típicos "suponiendo que el campo se llamara X y la tabla Y y la base de
datos Z... etc."
Un saludo.


Fernando Arroyo
MS MVP - Excel


" pep " <p...@capdevila.com> escribió en el mensaje
news:b2bbn7$f90$1...@nazgul.local...

Cheeky

unread,
Feb 11, 2003, 3:15:21 PM2/11/03
to
Me interesa tanto el tema que te pongo mi caso:

Bade Datos: gestion.dbf
ruta: C:\programas\gestion.dbf
tabla: ARTICULO
campo con código: IdArticulo (Tipo:texto;tamaño:13)
campo descripción: DetalleArt (Tipo:texto;tamaño:35)

Me imagino que puede serle útil a mucha gente.

"Fernando Arroyo" <ferarr...@ESTOwanadoo.es> escribió en el mensaje
news:e6MCf$f0CHA.1768@TK2MSFTNGP12...

Raul Padilla

unread,
Feb 11, 2003, 4:14:11 PM2/11/03
to
Hola amigos yo uso este codigo como una formula personalizada y me va bien
(Access97). Fernando a ver si puedes enviarnos el código de como se haría
con el MS Query.
Gracias y saludos
Raul Padilla


--- Código de Modulo

Dim Cnn as ADODB.Connection
Dim rs as ADODB.Recordset

Public Sub CloseDB()
Cnn.Close
Set Cnn = Nothing
End Sub

Public Sub OpenDB()
Set Cnn = New ADODB.Connection
Cnn.CursorLocation = adUseServer
Cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51;" & _
"Data Source=C:\programas\gestion.mdb;" & _
"User Id=admin;" & _
"Password="
End Sub

Public Function BuscaProducto (IdProducto As String) As String
BuscaProducto = "Not Found"
Call OpenDB 'Abre la conexion
Set rs = New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Open "Select * from Articulo where IdArticulo='" & IdProducto & "'",
Cnn
If rs.RecordCount > 0 Then
BuscaMilla = rs!DetalleArt
End If
rs.Close
Set rs = Nothing
Call CloseDB
End Function


"Cheeky" <Big...@terra.es> escribió en el mensaje
news:eqzhOkg0CHA.2288@TK2MSFTNGP09...

flixitus

unread,
Feb 12, 2003, 3:18:50 AM2/12/03
to
En primer lugar, muchas gracias por vuestras respuestas. Tal y como comenta
Fernando, paso a detallar los datos
de nombres y ubicacion de la hoja de calculo, celdas, y base de datos
Ubicación y nombre de la hoja de calculo: C:\Mis Documentos\procesos.xls
celda a1:(Id_Producto) celda a2:(Descripcion)
Ubicación y nombre de la base de datos: C:\Mis
Documentos\BasesdeDatos\Articulos.mdb
Nombre de la tabla: Tbl_Newartic
Nombre de los campos: Id_Producto,Descripcion
Esperando vuestras agradables noticias y vuestra estimable ayuda, recibid un
cordial saludo

Fernando Arroyo

unread,
Feb 12, 2003, 3:59:27 AM2/12/03
to
Con MS Query lo primero que habría que hacer es crear una consulta en la
hoja desde Datos->Obtener datos externos->Nueva consulta de base de datos, o
crearla usando código (definiendo un objeto QueryTable y sus miembros).
Después lo único que habría que hacer es modificar la propiedad CommandText
de dicho objeto QueryTable para que extrajera de la base de datos el
registro cuyo código fuera el que interesara en cada momento.

En general, con MS Query se ahorra código, pero es más lento que ADO o DAO,
y además hay que crear la consulta en la hoja y a menudo es necesario crear
también un nombre de origen de datos (DSN) en el equipo. A mí me parece
interesante para aquellos que no quieren complicarse la vida con ADO/DAO,
pero mi primera elección es ADO (aunque, sinceramente, prefiero DAO; pero
como ya no lo actualizan, nos están obligando a cambiarnos a ADO o a
ADO.NET).

Si estás interesado en MS Query, hace pocos días se produjo un "hilo"
iniciado por Balterra en el que estuvimos discutiendo el código necesario
para actualizar una consulta. El asunto era "Consulta de una base de datos".

Respecto al código que pones en tu mensaje, me parece correcto pero me temo
que no vaya a servirle a Cheeky porque está hablando de DBFs.
Un saludo.


Fernando Arroyo
MS MVP - Excel


"Raul Padilla" <volad...@aerocontinente.com.pe> escribió en el mensaje
news:udGUtKh0CHA.2232@TK2MSFTNGP11...


> Hola amigos yo uso este codigo como una formula personalizada y me va bien
> (Access97). Fernando a ver si puedes enviarnos el código de como se haría
> con el MS Query.
> Gracias y saludos
> Raul Padilla
>
>
> --- Código de Modulo

[...]


Fernando Arroyo

unread,
Feb 12, 2003, 4:14:28 AM2/12/03
to
Veo que estás hablando de DBFs. Hace algunos meses se planteó una cuestión
similar en este grupo, y se solucionó con el código que pondré después, si
bien luego hubo que modificarlo para que cogiera más datos de la tabla. Pero
lo básico era este código.

No sé si en tu caso funcionará porque sospecho que estamos hablando de
tablas de FoxPro o quizás de dBase V ¿?, mientras que el código estaba
pensado para tablas de dBase IV. Dado que nunca he trabajado con dBase V ni
con FoxPro no puedo garantizar que vaya a funcionar (tal vez habría que
modificar el Driver).

El código es:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$A$1" Then Exit Sub
If Target.Cells.Count <> 1 Then Exit Sub

On Error GoTo ManejoErrores

Dim Cnxn As ADODB.Connection
Dim rstArtículos As ADODB.Recordset
Dim strCnxn As String
Dim strSQLArtículos As String

strCnxn = "Driver={Microsoft dBASE Driver (*.dbf)};" & _
"DriverID=277;" & _
"Dbq=c:\Programas\Gestion"

Set Cnxn = New ADODB.Connection
Cnxn.Open strCnxn

' Abrir C:\articulo.dbf
Set rstArtículos = New ADODB.Recordset
strSQLArtículos = "ARTICULO.DBF"
rstArtículos.Open strSQLArtículos, Cnxn, adOpenKeyset, _
adLockOptimistic, adCmdTable

'Buscar en el campo IDARTICULO el contenido de la celda C1
rstArtículos.Find "IDARTICULO='" & Target.Value & "'"

'Si encuentra el código, poner la descripción en A2
If Not rstArtículos.EOF Then
Application.EnableEvents = False
ActiveSheet.Range("A2").Value = rstArtículos!DETALLEART
Application.EnableEvents = True
End If

'Cerrar objetos
rstArtículos.Close
Cnxn.Close

'Liberar objetos
Set rstArtículos = Nothing
Set Cnxn = Nothing

Exit Sub

ManejoErrores:
If Not rstArtículos Is Nothing Then
If rstArtículos.State = adStateOpen Then rstArtículos.Close
End If
Set rstArtículos = Nothing

If Not Cnxn Is Nothing Then
If Cnxn.State = adStateOpen Then Cnxn.Close
End If
Set Cnxn = Nothing

If Err <> 0 Then
MsgBox Err.Source & "-->" & Err.Description, , "Error"
End If
End Sub


Deberás pegarlo en el módulo de la hoja (click derecho sobre su
etiqueta->Ver código). Para que funcione es necesario establecer una
referencia a la librería "Microsoft ActiveX Data Objects 2.X Library" desde
Herramientas->Referencias, estando en el editor de VBA. Lo de la X es porque
la versión puede cambiar dependiendo de la versión de Office y del sistema
operativo. Yo tengo la 2.7, pero tú deberás marcar la más moderna que
tengas.

Espero que te funcione, pero la verdad es que no estoy muy seguro de ello...
Un saludo.


Fernando Arroyo
MS MVP - Excel


"Cheeky" <Big...@terra.es> escribió en el mensaje
news:eqzhOkg0CHA.2288@TK2MSFTNGP09...

Fernando Arroyo

unread,
Feb 12, 2003, 6:30:52 AM2/12/03
to
Pega el siguiente código en el módulo de la hoja (click derecho sobre su
etiqueta->Ver código):


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:\Mis documentos\BasesdeDatos\Articulos.mdb;" & _


"User Id=admin;" & _
"Password="

'Establecer la propiedad Source del Recordset
strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & 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!Descripcion
End If
Application.EnableEvents = True

'Cerrar y liberar objetos
cnn1.Close
Set cnn1 = Nothing
Set rsProductos = Nothing

End Sub

Notas:
- Para que funcione tienes que tener establecida una referencia a la
librería "Microsoft ActiveX Data Object 2.X Library", donde la X significa
la versión más moderna que tengas. Puedes hacerlo desde


Herramientas->Referencias, estando en el editor de VBA.

- La versión del proveedor OLE DB (la línea

Provider=Microsoft.Jet.OLEDB.4.0;

en el código) puede variar. Si tienes Access 2000 debería ser ésta (la 4.0),
pero en Access 97 creo que era la 3.51

- Si el campo Id_Producto no fuera alfanumérico sino numérico, habría que
modificar la línea

strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & Target.Value & "';"

por

strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = " & Target.Value & ";"


Un saludo.


Fernando Arroyo
MS MVP - Excel


"flixitus" <rober...@yahoo.es> escribió en el mensaje
news:b2cvpu$f8e$1...@nsnmpen2-gest.nuria.telefonica-data.net...

flixitus

unread,
Feb 12, 2003, 7:30:32 AM2/12/03
to
Esta misma tarde, probaré el código que has publicado.
De todos modos, el mensaje es para AGRADECERTE tu atención y tiempo
dispensado,
que espero poder devolvertelo en alguna ocasión.
Salu2

flixitus

unread,
Feb 12, 2003, 9:36:01 AM2/12/03
to
Bienm, he probado el módulo que me enviastes y lamentablemente, se ha
producido el siguiente error,
en la sentencia rsProductos.Open Source:=strSentenciaSQL, _

ActiveConnection:=cnn1, _
CursorType:=adOpenKeyset, _
LockType:=adLockOptimistic
literalmente reza así:
Se ha producido el error '2147217913 (80040e07)' en tiempo de ejecución.
No coinciden los tipos de datos en la expresión criterios.

¿Puede obeder a que el Id_Producto sea numerico?
salu2

Fernando Arroyo

unread,
Feb 12, 2003, 10:03:09 AM2/12/03
to
"flixitus" <rober...@yahoo.es> escribió en el mensaje
news:b2dls4$bf3$1...@nsnmpen2-gest.nuria.telefonica-data.net...

Sí, casi seguro que es debido a eso. Prueba cambiando la instrucción:

strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = '" & Target.Value & "';"

por

strSentenciaSQL = "SELECT * FROM Tbl_Newartic WHERE " & _
"Id_Producto = " & Target.Value & ";"

Parecen iguales, pero no lo son. La primera lleva una comilla simple o
apóstrofo ' detrás del segundo signo igual y otra delante del punto y coma,
mientras que la segunda no las lleva.

flixitus

unread,
Feb 12, 2003, 10:52:17 AM2/12/03
to
Fernando,
Efectivamente tal y como te he comentado, he cambiado la propiedad numerica
de Id_Producto a tipo texto,
y perfecto.
Posteriormente, he vuelto a modificar la propiedad de texto a numerico y he
incorporado el segundo string sql
que me has remitido, y ok igualmente.
MUCHAS GRACIAS.

0 new messages