Tutto ciò che sto cercando di fare è prendere un intervallo standard su un foglio excel (ovvero un intervallo denominato, o anche A1: F100), ed eseguire alcune query SQL su di esso e restituire un recordset che posso passare sia in VBA codice, o anche solo incollare in qualche altro foglio nella stessa cartella di lavoro.Come posso eseguire istruzioni SQL su un intervallo denominato all'interno di un foglio Excel?
L'utilizzo di ADODB era un pensiero, ma come è possibile impostare la connessione per indicare un intervallo all'interno della cartella di lavoro corrente?
So che prima ho fatto uso della procedura guidata di query Microsoft, che non era l'ideale, ma avrebbe funzionato. Non riesco a ottenere questo per fare riferimento a un intervallo all'interno del foglio, solo altri file Excel.
Ecco la funzione che mi rimane. Quando lo eseguo alcune volte, il mio excel si blocca con il solito messaggio di errore relativo alle risorse esaurite. Ho rimosso questa funzione dal mio foglio di calcolo e tutto viene eseguito senza interruzioni più volte, quindi è sicuramente causato dal codice qui.
Ho ripulito tutti gli oggetti (correttamente?). Qualcuno ha qualche idea su cosa potrebbe andare storto? Potrebbe esserci qualcosa nella stringa di connessione che potrebbe essere modificata, o potrebbe essere qualcosa a che fare con la variante che viene restituita dal metodo GetRows?
Sto usando MS ADO 2.8 e ho anche provato 2.5 con lo stesso comportamento.
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
Grazie, funziona alla grande. Devo aver avuto qualcos'altro di sbagliato (vedi sopra commento), che mi ha fatto pensare che dovevi fare qualcosa di diverso con la stringa di connessione. – cOrOllArY
È possibile che si verifichino problemi con ADO se non si è salvato. – Fionnuala
Funziona tutto perfettamente, ma c'è una sorta di perdita di memoria in corso. Inserirò la funzione qui sotto perché è troppo lunga per il commento. – cOrOllArY