Hola a todos,
¿Qué tal estáis?, espero que bien 🙂 Si recordáis en el anterior post comenté que en la próxima entrada mostraría un ejemplo de como podemos utilizar una consulta sql en excel, o lo que es muy parecido, como replicar una consulta que hemos hecho utilizando Access pero en Excel. Pues bien, hoy es lo que vamos a ver.
Lo primero que voy a hacer es realizar la consulta en Access y luego replicarla en Excel, de forma que se pueda ver claramente el proceso y la comparación. Imaginemos que estamos trabajando para una empresa que vende jamones … nos llamamos La Pata Negra, S.L. y resulta que somos los encargados de seleccionar dentro de la plantilla de la empresa a un nuevo comercial para que venda nuestros productos.
Como es habitual, el jefe nos entrega una relación de empleados (que tiene desde hace tiempo y no está actualizada, es decir, hay empleados que ya no están y hay otros nuevos que no tiene, a esta tabla vamos a llamarla «Listado». Por otro lado hemos conseguido que desde el departamento de personal nos envíen un archivo con la información actualizada de los empleados así como una serie de datos, a esta tabla vamos a llamarla «Datos».
Nuestro trabajo va a ser sencillo, como en la primera tabla sabemos que algunos empleados pueden ya no estar y en la segunda sabemos que están todos, debemos cruzar los datos y obtener detalle de los empleados antiguos (que puedan seguir en la empresa) y los nuevos.
y la consulta a realizar (muy básica), sería la siguiente: necesitamos buscar aquellos empleados que estén en la tabla «Datos» y que además coincidan con los que están en la tabla «Listado» de forma que vamos a obtener los empleados antiguos que siguen en la actualidad y también los nuevos. Pero además queremos que busque aquellos que tengan estudios de «MASTER«, que vivan en «MADRID» y que tengan menos de «30» años.
En Access la consulta sería esta, SIEMPRE uniendo por el campo IDENTIFICADOR, que es un registro único para cada empleado:
Donde además queremos que nos muestre información de «INGLÉS» y si posee «VEHICULO». Una vez ejecutada la consulta nos ofrece a cuatro candidatos que poseen los requisitos que hemos definido previamente:
Ahora solo faltaría tomar una decisión de a quién seleccionar en base a criterios que ya no serían tema este blog 🙂
EN EXCEL
Pues ahora esto mismo lo voy a realizar en Excel. Para ello debemos contar con las dos tablas de referencia, «DATOS» y «LISTADO» que vamos importar a Excel, cada una en una hoja y agregamos una tercera que vamos a llamar «RESULTADO», que es donde mostremos el resultado de la consulta:
Antes de continuar y mostrar el código que voy a utilizar, os comento que es necesario que actualicéis referencias en el libro de Excel, en concreto debéis marcar las siguiente para que la conexión de ADO funcione correctamente. Esto lo tenéis que hacer entrando en el editor de Visual pinchar en Herramientas y luego en Referencias. Y una vez que se abra el cuadro para elegir las referencias, marcáis las siguientes. (las referencias se quedan en el libro, por lo que en este archivo no hace falta que las marquéis, pero sí será necesario en un nuevo libro).
Ahora que tenemos la hoja preparada para el código, lo voy a poner completo para luego comentarlo:
Código completo:
Public Sub CONSULTA_SQL()
'Definimos las variables y creamos los
Dim Dataread As ADODB.Recordset, obSQL As String, Res As String
Dim cnn As ADODB.Connection
'Cada vez que ejecutemos la consulta borramos los datos de la consulta anterior en la hoja resultado_
'si se produce un error por estar la hoja vacía, saltamos directamente al proceso de consulta a través de la etiqueta control_e
On Error GoTo control_e
LIMPIARDATOS = Application.CountA(Worksheets("RESULTADO").Range("a:a"))
Worksheets("RESULTADO").Range("A1:G" & LIMPIARDATOS).ClearContents
Worksheets("RESULTADO").Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
control_e:
'indicamos los parámetros de la consulta SQL
obSQL = "SELECT [DATOS$].[IDENTIFICADOR], [DATOS$].[NOMBRE], [DATOS$].[ESTUDIOS] , [DATOS$].[INGLES],[DATOS$].[VEHICULO],[DATOS$].[PROVINCIA],[DATOS$].[EDAD]" & _
"FROM [LISTADO$] RIGHT JOIN [DATOS$] ON [LISTADO$].[IDENTIFICADOR] = [DATOS$].[IDENTIFICADOR]" & _
"WHERE((([DATOS$].[ESTUDIOS]) ='MASTER') AND (([DATOS$].[PROVINCIA]) ='MADRID') AND (([DATOS$].[EDAD]) <30))"
'Creamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "DATA SOURCE=" & Application.ActiveWorkbook.Path + "\CONSULTA_SQL_EN_EXCEL.xls"
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Procedemos a grabar los datos de la consulta creando el objeto recordset
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'Copiamos los datos a la hoja RESULTADO
With Worksheets("RESULTADO").Select
Worksheets("RESULTADO").Cells(2, 1).CopyFromRecordset Dataread
End With
'Grabamos los nombres de cada encabezado de columna
With Worksheets("RESULTADO")
.Range("a1") = ("IDENTIFICADOR")
.Range("B1") = ("NOMBRE")
.Range("C1") = ("ESTUDIOS")
.Range("D1") = ("INGLES")
.Range("E1") = ("VEHICULO")
.Range("F1") = ("PROVINCIA")
.Range("G1") = ("EDAD")
End With
'Pintamos de rojo Los encabezados
With Worksheets("RESULTADO")
.Range("A1").Interior.Color = vbRed
.Range("B1").Interior.Color = vbRed
.Range("C1").Interior.Color = vbRed
.Range("D1").Interior.Color = vbRed
.Range("E1").Interior.Color = vbRed
.Range("F1").Interior.Color = vbRed
.Range("G1").Interior.Color = vbRed
End With
End Sub
Como podéis ver, básicamente lo que hacemos es realizar una consulta ADO entre ambas hojas para conseguir el resultado indicado.
La consulta SQL es muy parecida a la que se realiza desde Access:
obSQL = "SELECT [DATOS$].[IDENTIFICADOR], [DATOS$].[NOMBRE], [DATOS$].[ESTUDIOS] , [DATOS$].[INGLES],[DATOS$].[VEHICULO],[DATOS$].[PROVINCIA],[DATOS$].[EDAD]" & _
"FROM [LISTADO$] RIGHT JOIN [DATOS$] ON [LISTADO$].[IDENTIFICADOR] = [DATOS$].[IDENTIFICADOR]" & _
"WHERE((([DATOS$].[ESTUDIOS]) ='MASTER') AND (([DATOS$].[PROVINCIA]) ='MADRID') AND (([DATOS$].[EDAD]) <30))"
Ahora la vamos a comentar, primero determinamos aquellos campos que necesitamos que sean visibles:
"SELECT [DATOS$].[IDENTIFICADOR], [DATOS$].[NOMBRE], [DATOS$].[ESTUDIOS] , [DATOS$].[INGLES],[DATOS$].[VEHICULO],[DATOS$].[PROVINCIA],[DATOS$].[EDAD]"
Luego indicamos a partir de qué tablas y que relación de consulta vamos a realizar. En este caso queremos saber todos aquellos que se encuentran en la tabla Datos y los que tienen el mismo identificador en la tabla «Listado». Es decir la opción tres que se expresa en la consulta de Access:
Para ello escribimos RIGHT JOIN * y unimos las tablas por el campo [IDENTIFICADOR], así:
"FROM [LISTADO$] RIGHT JOIN [DATOS$] ON [LISTADO$].[IDENTIFICADOR] = [DATOS$].[IDENTIFICADOR]"
(*) Los otros dos tipos de consulta son LEFT JOIN (Opción 2) o INNER JOIN (Opción 3).
El siguiente paso es indicar que queremos que sus estudios sean MASTER, que sean de MADRID y que tengan menos de 30 años:
"WHERE((([DATOS$].[ESTUDIOS]) ='MASTER') AND (([DATOS$].[PROVINCIA]) ='MADRID') AND (([DATOS$].[EDAD]) <30))"
El resto de la macro lo que hace es grabar la consulta en un recordset y devolver el resultado con los parámetros indicados en la hoja RESULTADO. He incluido un control para errores cuando al ejecutar la macro y limpiemos los datos de la consulta, que siempre debería existir algún contenido, en caso de no tener contenido, no se produzca un error.
El resultado sería el siguiente, ¿os resulta familiar?
Efectivamente, es el mismo resultado que utilizando Access.
Casi se me olvida, la fuente de los datos que se indica en el código (en rojo) ha de hacer referencia (ser el mismo) al nombre de nuestro archivo Excel.
.ConnectionString = «DATA SOURCE=» & Application.ActiveWorkbook.Path + «\CONSULTA_SQL_EN_EXCEL.xls«
Importante: si vinculáis la hoja con otro archivo y es diferente de .xls debéis modificar en la conexión los siguientes elementos:
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Properties("Extended Properties") = "Excel 12.0; HDR=YES"
Como siempre os dejo el ejemplo para que probéis con un caso práctico, os he añadido un botón para ejecutar la macro en la hoja LISTADO.
Descarga el archivo de ejemplo pulsando en: CONSULTA_SQL_EN_EXCEL
falta poner el archivo en access
Hola Tom,
Este ejercicio se base en utilizar SQL en Excel de la misma forma que lo hacemos en Access. Por eso digo que es una consulta de Access en Excel.
Saludos.
Hola, el codigo funciona bien, sin embargo el bucle que realizas de ese modo no tiene sentido repite instrucciones innecesarias,
permitime hacer unas correcciones a tu codigo
Public Sub CONSULTA_SQL()
‘Definimos las variables
Dim Dataread As ADODB.Recordset, obSQL As String, Res As String
Dim cnn As ADODB.Connection
Dim n ‘######
‘Cada vez que ejecutemos la consulta borramos los datos de la consulta anterior en la hoja resultado_
‘si se produce un error por estar la hoja vacía, saltamos directamente al proceso de consulta a través de la etiqueta control_e
On Error GoTo control_e
LIMPIARDATOS = Application.CountA(Worksheets(«RESULTADO»).Range(«a:a»))
Worksheets(«RESULTADO»).Range(«A1:G» & LIMPIARDATOS).ClearContents
Worksheets(«RESULTADO»).Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
control_e:
‘indicamos los parámetros de la consulta SQL
obSQL = «SELECT [DATOS$].[IDENTIFICADOR], [DATOS$].[NOMBRE], [DATOS$].[ESTUDIOS] , [DATOS$].[INGLES],[DATOS$].[VEHICULO],[DATOS$].[PROVINCIA],[DATOS$].[EDAD]» & _
«FROM [LISTADO$] RIGHT JOIN [DATOS$] ON [LISTADO$].[IDENTIFICADOR] = [DATOS$].[IDENTIFICADOR]» & _
«WHERE((([DATOS$].[ESTUDIOS]) =’MASTER’) AND (([DATOS$].[PROVINCIA]) =’MADRID’) AND (([DATOS$].[EDAD]) <30))"
'Realizamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "DATA SOURCE=" & Application.ActiveWorkbook.Path + "\CONSULTA_SQL_EN_EXCEL.xls"
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Procedemos a grababar los datos de la consulta
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'######################
With Worksheets("RESULTADO")
.Select
'Copiamos los datos a la hoja RESULTADO
.Cells(2, 1).CopyFromRecordset Dataread
'Pintamos de rojo Los encabezados
.Range("A1:G1").Interior.Color = vbRed
'Grabamos los nombres de cada encabezado de columna
'#### solo es necesario un bucle para poner los encabezados…
For n = 0 To Dataread.Fields.Count – 1
.Cells(1, n + 1) = Dataread.Fields(n).Name
Next
End With
End Sub
Hola Alberto:
Muchas gracias por tomarte la molestia y aportar 🙂 eso siempre genera sinergias e indica interés. Tienes razón en que la última parte de la macro, la de los encabezados de columna está realizado «a pelo» y es cierto que queda un poco extraño. De hecho en el resto de códigos de la web donde trabajo con ADO utilizo ese mismo for para los encabezado. ej:
https://excelsignum.com/2017/03/19/extraer-registros-unicos-con-una-consulta-sql-usando-distinct/
https://excelsignum.com/2015/10/26/conectar-base-de-datos-de-excel-utilizando-herramienta-olebd-y-sql/
https://excelsignum.com/2015/06/25/transponer-datos-mediante-consulta-sql-de-referencias-cruzadas/
Pero aquí quise realizarlo así para indicar que lo podemos hacer de otra forma, dado que disponemos de toda la información en el mismo archivo y en Excel. En otros ejemplo, cuando me traigo la info de Access o con referencias cruzadas, etc, sí lo realizo así.
Pero es cierto que siguiendo la lógica del post, es más «fino» utilizar el for.
Muchísimas gracias por tu comentario ^_^ y tu aporte!!!
Hola buenas tardes, muy interesantes estas funcionalidades de consultas desde excel a bases de datos. Estoy con un proyecto de consultas a bases de datos de postgresql, me ha funcionado bien, pero quiero otras opciones un poco mas funcionales, tales como hacer una consulta desde un boton de comando que haga la conexion directamente a la base de datos y me extraiga los datos de la tabla. Hice una macro con todo el proceso de conectar a la base de datos, hacer la consulta y presentar los datos en la hoja de excel, este proceso lo hace correctamente. Pero al momento de asignar esa macro a un boton para que haga la consulta, me bota un error que dice: Se ha producido el error ‘-2177024809 (80070057)’ en timpo de ejecucion. Gracias de antemano, un saludo.
Ya existe una consulta con el nombre ‘Consulta’., si salto ese error me trae los primero tres campos de la tabla. Alguien podria darme una idea de como solucionar este detalle?. Gracias de antemano, un saludo.
mi consulta es la siguiente:
— Private Sub CommandButton1_Click()
ActiveWorkbook.Queries.Add Name:=»Consulta», Formula:= _
«let» & Chr(13) & «» & Chr(10) & » Origen = PostgreSQL.Database(«»localhost»», «»mibasedb»», [Query=»»select * from municipio»»])» & Chr(13) & «» & Chr(10) & «in» & Chr(13) & «» & Chr(10) & » Origen»
Sheets.Add After:=ActiveSheet
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
«OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Consulta» _
, Destination:=Range(«$A$1»)).QueryTable
.CommandType = xlCmdSql
.CommandText = Array(«SELECT * FROM [Consulta]»)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = «Consulta»
.Refresh BackgroundQuery:=False
End With
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub
Hola Víctor:
Creo que ya habías realizado alguna consulta sobre postgresql en otra entrada de esta web. Sobre este tema no tengo nada creado. No obstante (aunque mejor siempre es tener los archivos para poder hacer pruebas), es posible que lo que te esté generando el problema es la propia consulta ya creada en Excel.
Por eso, para verificarlo, ejecuta la macro pero antes elimina la consulta que tienes grabada en Excel (Datos > Conexiones)
Si te funciona, es que necesitas crear un pequeño proceso o función que elimine todas las consultas.
Lo del botón, quítale el private, deja Sub , por ejemplo Sub conexión () y pásalo a un módulo estándar.
Saludos
Hola Amigo,
Buenísimo tu ejemplo muchas gracias me va ayudar muchísimo en automatizar mis trabajos. Lo que queria saber es como seria el codigo para validar el inicio de sesión. tengo en una excel los datos de usuario (ID, USERNAME, NOMBRES; PASSWORD, EMAIL) y un formulario en VBA con USUARIO y PASSWORD y al ingresar que valide en la tabla y permita el acceso si es que coincide y si no muestre mensaje, ademas si accede que guarde en otra los datos de inicio sesión con usuario y la fecha y hora.
Espero me puedas echar una mano con esta desde ya muchas gracias.
Hola cbujeles:
Tengo algunos ejemplos de programación para lo que comentas, para logarse:
https://excelsignum.com/2016/05/06/logarse-con-el-nombre-de-usuario-del-equipo-para-acceder-a-excel/
Para controlar los usuarios que han entrado en un archivo:
https://excelsignum.com/2017/06/15/grabar-el-nombre-de-usuario-de-windows-cuando-abrimos-y-cerramos-nuestro-archivo-excel/
Creo que con estos dos post tienes material para poder adaptarlos a tu proyecto.
Espero que te sean de ayuda.
Saludos
Hola, antes de nada agradecer tu aporte que ha sido muy útil.
Yo el problema que tengo es con las fechas…. imaginando dos textbox (fecha inicial / fecha final) en un form en Excel-VBA, no hay forma de que me funcione. La consulta SQL la realizo directamente sobre el propio Excel, es decir, no me conecto a Access o SQL Server.
El código que tengo es el siguiente:
….
strSQL = «SELECT * FROM [HOJA$] WHERE [HOJA$].[FECHA] >= @paramFechaini AND [HOJA$].[FECHA] <= @paramFechafin "
cmdSQL.Parameters.Append cmdSQL.CreateParameter(paramFechaini, adVarChar, adParamInput, 10, auxFechaIni)
cmdSQL.Parameters.Append cmdSQL.CreateParameter(paramFechafin, adVarChar, adParamInput, 10, auxFechaFin)
cmdSQL.CommandText = strSQL
….
Con el tema de los paremetros he probado creo de todo, como por ejemplo:
de tipo adVarChar
auxFechaIni = Format(CDate(textboxfechaini), "dd/mm/yyyy") tb he probado con Format(…,"yyyymmdd") y Format(…,"yyyy-mm-dd")
auxFechaFin = Format(CDate(textboxfechafin), "dd/mm/yyyy")
de tipo adDate
auxFechaIni = CDate(textboxfechaini) tb he probado con DateValue(textboxfechafin)
auxFechaFin = CDate(textboxfechafin)
NOTA: El formato de celda de [HOJA$].[FECHA] esta definido como de tipo fecha (formato dd/mm/aaaa)
No me devuelve nunca bien los datos, algo con el formato fecha no esta bien pero no doy con la tecla 🙁
Gracias de antemano por vuestra ayuda!
Un saludo.
Hola Janko:
Necesitaría que me enviases un ejemplo (algo sencillo), indicando el problema que tienes y cuál es el resultado que pretendes obtener.
Así puedo evaluarlo y verificarlo directamente. Envía a excelsignum@yahoo.es
Saludos!!
BUENOS DIAS UNA CONSULTA EN MI PROYECTO AL EJECUTAR ME SALE UN ERROR Y DICE QUE EL MOTOR DE ACCESS NO ENCONTRO «DATOS» YA QUE ESTOY UTILIZADO LOS MISMOS NOMBRES DE LAS HOJAS.
Hola Ramiro. Verifica muy detenidamente que la palabra está escrita como en la macro del ejemplo y que utilizar el símbolo $ en el SQL.
Saludos
Hola una pregunta con ese codigo puedo aser una busqueda en access desde excel y que al momento de ponerle el codigo del producto me aparesca la informacion.
Es que ocupo saber como puedo buscar 10 registros a la ves con solo agregar el codigo del producto.
Sí. En este post conecto una base de datos de Access con Excel. Y mediante una consulta SQL importo los datos a Excel. Solo tienes que especificar la consulta de SQL los datos que quieres buscar.
https://excelsignum.com/2014/02/27/conectar-base-de-datos-de-access-accdb-con-excel-utilizando-herramienta-olebd/
En esta web encontrar varios ejemplos de ADO y consultas relacionadas.
Saludos.
Hola es de gran ayuda este tema.
Mi pregunta es si puedo en la consulta SQL colocar datos que se encuentren en una celda de excel
Gracias!!!
Hola Luis:
Lo puedes hacer de dos formas, o bien pasas el valor de la celda a una variable o bien lo haces directamente en el SQL: FROM [Worksheets(«Hoja1″)$A1]»
Saludos.
GRACIAS!! ya pude hacerlo, pero ahora tengo una pregunta como puedo hacer un «UNION ALL» ya que me sale error,.
muchas gracias!!!
Hola Luis: en el buscador de la web si pones union all encontrarás este post https://excelsignum.com/2018/09/28/realizar-consultas-sql-de-union-en-excel-con-ado/
Saludos
SEGU eres un CRACK!!! muchas gracias, la verdad estoy experimentando estos querys en Excel, debido a que la licencia del trabajo no tiene ACCESS y necesito automatizar un par de cosas
Muchas gracias!!
Hola segu,
estoy intentando conectar 3 tablas de tres libros distintos usando una MS query, una maestra(T1) y sus dos hijas(T2 y T3), a traves de sus claves.
Puedo conectar T1 con T2, y T1 con T3, pero al hacer ambas simulraneas me da problemas¡¡¡¡, ¿alguna idea de a que puede ser debid0??
Me da un error de «llamada a procedimiento no valida» ¿que puede significar eso? problema de sintaxis no parece ser ya que puedo hacer la consultas T1-T3 y T1-T2 pero no me deja hacerlas simultaneas(where T1.x=T2.y and T1.a=T3.b) ¿tiemes alguna idea de cual puede ser el error?
Gracias, saludos 🙂
Hola nowe:
Quizás debas utilizar un for each y pasar las consultas en un proceso.
https://excelsignum.com/2018/08/02/realizar-varias-consultas-sql-con-ado-en-la-misma-macro/
Aquí te dejo un ejercicio que realicé, y que te puede ayudar.
Hola como estas, una duda, te has topado con que el query se a muy largo que truene al hacer la consulta dinamica?
en el ODBCConnection.CommandText estoy tratando de meter un query MUY MUY MUY largo que no puedo recortar, y por lo mismo largo no me deja ejecutarlo
Que se te ocurre que pueda hacer?
Lo curioso es que si pego el mismo query en el componente si lo ejecuta sin problemas, pero cuando lo hago dinámico es cuando me regresa error tipo 5 (Llamada o argumento de procedimiento no válido (error 5))
Hola Segu.
Una preguntilla, esta consulta extrae los datos desde el libro CONSULTA_SQL_EN_EXCEL.xls.
Me gustaria saber como se podria hacer para que los datos los extraiga desde otro libro que esta abierto en el momento de hacer la consulta, cuyo nombre es variable.
Me autorespondo por si ha alguien hiciera falta
Public Sub CONSULTA_SQL()
‘Definimos las variables
Dim Dataread As ADODB.Recordset, obSQL As String, Res As String
Dim cnn As ADODB.Connection, i As Integer
Ruta = ActiveWorkbook.Path & «\» & ActiveWorkbook.Name
‘Cada vez que ejecutemos la consulta borramos los datos de la consulta anterior en la hoja resultado_
‘si se produce un error por estar la hoja vacía, saltamos directamente al proceso de consulta a través de la etiqueta control_e
On Error GoTo control_e
LIMPIARDATOS = Application.CountA(Worksheets(«RESULTADO»).Range(«a:a»))
Worksheets(«RESULTADO»).Range(«A1:G» & LIMPIARDATOS).ClearContents
Worksheets(«RESULTADO»).Select
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
control_e:
‘indicamos los parámetros de la consulta SQL
obSQL = «SELECT [DATOS$].[IDENTIFICADOR], [DATOS$].[NOMBRE], [DATOS$].[ESTUDIOS] , [DATOS$].[INGLES],[DATOS$].[VEHICULO],[DATOS$].[PROVINCIA],[DATOS$].[EDAD]» & _
«FROM [LISTADO$] RIGHT JOIN [DATOS$] ON [LISTADO$].[IDENTIFICADOR] = [DATOS$].[IDENTIFICADOR]» & _
«WHERE((([DATOS$].[ESTUDIOS]) =’MASTER’) AND (([DATOS$].[PROVINCIA]) =’MADRID’) AND (([DATOS$].[EDAD]) <30))"
'Realizamos la conexión ADO
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "DATA SOURCE=" & Ruta
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
'Procedemos a grababar los datos de la consulta
Set Dataread = New ADODB.Recordset
With Dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
Hola Segu.
A ver si me puedes ayudar en otro problema que se me plantea.
En la consulta, pido que devuelva las columnas, Nombre, apellidos y fecha de nacimiento, pero en la tabla donde estan los datos, no existe la columna Fecha de nacimiento.
Al ejecutar el codigo, me da un error.
Como lo podria solventar y que añada los datos de las columnas que existan?
Mil gracias