Utilizar hoja de excel como recordset ado

Estoy utilizando recordset ADO para realizar consultas SQL en Excel, teniendo como fuente de datos las hojas de un libro, logro cargar la hoja completa y recorrer registros y todo eso, pero cuando intento utilizar Were, me da problemas, no estoy seguro de la sintaxis
la lienea es :
 "SELECT * FROM [" & hoja & "] where [" & cond & "]=" & buscar
hasta aqui :  "SELECT * FROM [" & hoja & "]"    todo bien, el tema se vuelve "oscuro 2, cuando utilizo where , la variable cond es el rango que indentifica la columna como nmbre de campo y buscar, es la variable que contiene el string que intento que me devuelva.

2 respuestas

Respuesta
2
La estructura de tu sentencia debería ser esta:
"SELECT * FROM [" & hoja & "$] where [" & cond & "]='" & buscar &"'"
Debes observar:
1. El signo $ después del nombre de la hoja.
2. Una comilla simple después del signo =
3. Cierre de la comilla simple al final de la sentencia (la comilla está entre comillas dobles)
4. Cond debe ser el encabezado de columna y debe estar en la fila 1, a no ser que acotes la consulta a un rango determinado de celdas, pero aun en este caso, el encabezado debe estar en la primera fila del rango.
5. La consulta hace diferencia entre minúsculas y mayúsculas, así que buscar debe contener la cadena con las mayúsculas y minúsculas correspondientes (si hay alguna forma de que no haga distinción, la desconozco)
Hola
Muchísimas gracias ! Al principio no me resultaba y ya estaba a punto de prenderle fuego al teclado, pero cuando leí : 4. cond debe ser el encabezado de columna y debe estar en la fila 1,
me di cuenta de que en mi cadena de conexión ";Extended Properties=""Excel 8.0;HDR=YES;"""
Estaba dejando fuera la fila 1 como rótulos HDR=NO, así que lo modifique a YES y ahora TODO funciona, muchísimas gracias, esto me soluciona muchas cosas y me ahorra mucho tiempo.
Respuesta
1
... ¿Ya probaste quitando los corchetes y asignando la cadena a una variable?
-
strVAR="SELECT * FROM " & hoja & " where " & cond & "=" & buscar
-
... luego ejecutar el query desde la misma variable
-
Envíame la construcción completa si tienes dudas.
-
Hola
Gracias por atender mi pregunta, respecto a lo que indica,  ya lo habia probado así, pero tampoco funciona. Todo funciona bien si utilizo : sql = "SELECT * FROM [" & hoja & "]"
pero cuando utilizo : sql = "SELECT * FROM [" & hoja & "] where [" & cond & "]= " & buscar & ""
Me da problemas !. Según la info del soporte Microsoft para recordset ADO para Excel hace obligatorio la utilización de [ ] o $, he utilizado ambos pero nada...
La info que he logrado recopilar no dice nada sobre que la clausula Where tenga alguna restricción, pero como el lenguaje es lo mismo (SQL), no debería dar problemas, estoy algo desconcertado, tampoco he logrado encontrar ejemplos en la web de alguien que utilice una Hoja Excel como origen de datos y tenga en su instrucción sql la clausula where!.
Te dejo el sub para que revises si tienes tiempo, gracias :
Private Sub CommandButton1_Click()
Dim conexion As ADODB.Connection
Dim a As ADODB.Recordset
Dim libro As String
Dim hoja As String
Dim rango As String
Dim buscar As String
Dim sql As String
Dim cond As String
buscar = InputBox("buscar")
 If Len(Trim(buscar)) = 0 Then Exit Sub
libro = ActiveWorkbook.FullName   ' determia el path del libro
rango = "A:B" 
hoja = ActiveSheet.Name & "$" & rango
cond = ActiveSheet.Name & "$A:A"
Set conexion = New ADODB.Connection
conexion.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                  "Data Source=" & libro & _
                  ";Extended Properties=""Excel 8.0;HDR=NO;"""
Set a = New ADODB.Recordset
'sql = "SELECT * FROM [" & hoja & "]"
sql = "SELECT * FROM [" & hoja & "] where [" & cond & "]= " & buscar & ""
On Error GoTo 1
a.Open sql, conexion, adOpenStatic, adLockBatchOptimistic
a.MoveFirst
Do Until a.EOF = True
    MsgBox a(0) & " " & a(1)
    a.MoveNext
DoEvents
Loop
a.Close
1:
Set a = Nothing
conexion.Close
Set conexion = Nothing
End Sub
La hoja tiene datos en columna A y B (da igual que datos), la idea es pedir los datos de B en función de A
Ej:
ColA ColB
ES 1
DE 7
A 6
F 4
R 5
A 1
F 8
A 3
Si a buscar le paso la Letra "A", el recordset debería devolver 3 registros "A6" - "A1" - "A3"
Como verás, amigo Calvuch, la sentencia WHERE no aplica para ADO en EXCEL, dadas las limitaciones estructurales de los libros en cuanto a operaciones de Bases de Datos.
-
En todo caso, lo que puedes hacer, es filtrar dentro de tu estructura Do Until ... Loop aunque, en este caso, veo más útil el uso de la estructura For Each ... Next para hacer el trabajo que deseas, pues el rango lo puedes filtrar desde el encabezado y luego... simplemente... presentar los datos.
-
Hola
Gracias opr al respuesta, si es una lata, quería evitarme el bucle, pero a fin de cuentas Excel no es una base de datos relacional, que más se puede pedir. De todas formas muchas gracias por tu tiempo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas