Todo lo que intento hacer es tomar un rango estándar en una hoja de Excel (es decir, un rango con nombre, o incluso A1: F100) y ejecutar algunas consultas sql y devolver un conjunto de registros que pueda pasar en VBA código, o incluso simplemente pegar en otra hoja en el mismo libro de trabajo.¿Cómo puedo ejecutar sentencias de SQL en un rango con nombre dentro de una hoja de Excel?
El uso de ADODB fue una idea, pero ¿cómo podría configurar la conexión para apuntar a un rango dentro del libro actual?
Lo sé antes de haber hecho uso del asistente de consultas de Microsoft, que no era ideal, pero funcionaría. Parece que no puedo hacer referencia a un rango dentro de la hoja, solo a otros archivos de Excel.
Aquí está la función que me queda. Cuando lo ejecuto varias veces, mi excel falla con el mensaje de error habitual de falta de recursos. Eliminé esta función de mi hoja de cálculo y todo se ejecuta sin interrupciones varias veces, por lo que definitivamente es causado por el código aquí.
He limpiado todos los objetos (¿correctamente?). ¿Alguien tiene alguna idea de lo que podría estar yendo mal? ¿Podría haber algo en la cadena de conexión que podría modificarse, o podría ser algo relacionado con la variante que se devuelve desde el método GetRows?
Estoy usando MS ADO 2.8, y también he probado 2.5 con el mismo comportamiento.
Function getTimeBuckets() As Collection
Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim dateRows As Variant
Dim i As Integer
Dim today As Date
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Set getTimeBuckets = New Collection
strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
cn.Open strCon
strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] where [Instrument Type] = 'LSTOPT'"
rs.Open strSQL, cn
dateRows = rs.GetRows
rs.Close
'today = Date
today = "6-may-2009"
For i = 1 To UBound(dateRows, 2)
If (dateRows(0, i) >= today) Then
getTimeBuckets.Add (dateRows(0, i))
End If
Next i
Set dateRows = Nothing
Set cn = Nothing
Set rs = Nothing
End Function
Gracias, funciona genial. Debo haber tenido otra cosa incorrecta (ver el comentario anterior), que me hizo pensar que tenía que hacer algo diferente con la cadena de conexión. – cOrOllArY
Puede tener problemas con ADO si no ha guardado. – Fionnuala
Todo funciona perfectamente, pero hay algún tipo de pérdida de memoria. Voy a publicar la función a continuación, ya que es demasiado tiempo para el comentario. – cOrOllArY