Wszystko, co próbuję zrobić, to wziąć standardowy zakres na arkuszu Excela (tj. Nazwany zakres, lub nawet A1: F100), i uruchomić kilka zapytań sql na nim, i zwrócić zestaw rekordów, które mogę albo przejść w VBA kodu, a nawet po prostu wklejenie do innego arkusza w tym samym skoroszycie.Jak mogę uruchomić instrukcje SQL dla nazwanego zakresu w arkuszu excela?
Używanie ADODB było jedną myślą, ale w jaki sposób mogę skonfigurować łańcuch połączeń tak, aby wskazywał na pewien zakres w bieżącym skoroszycie?
Wiem, że zanim skorzystałem z kreatora zapytań Microsoft, który nie był idealny, ale działał. Nie mogę tego zmusić do odniesienia się do zakresu w arkuszu, tylko do innych plików programu Excel.
Oto funkcja, z którą jestem. Kiedy uruchamiam go kilka razy, mój program Excel ulega awarii z powodu zwykłego komunikatu o braku zasobów. Usunąłem tę funkcję z mojego arkusza kalkulacyjnego, a wszystko działa bezproblemowo wiele razy, dlatego jest to niewątpliwie spowodowane tym kodem.
Oczyściłem wszystkie obiekty (poprawnie?). Czy ktoś ma jakieś pomysły, co może pójść nie tak? Czy w łańcuchu połączenia może być coś, co można zmodyfikować, czy może mieć coś wspólnego z wariantem zwracanym przez metodę GetRows?
Używam MS ADO 2.8, a także próbowałem 2.5 z tym samym zachowaniem.
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
Dzięki, działa świetnie. Musiałem mieć coś jeszcze nie tak (patrz powyższy komentarz), co sprawiło, że myślałem, że musisz zrobić coś innego z łańcuchem połączenia. – cOrOllArY
Możesz napotkać problemy z ADO, jeśli nie zapisałeś. – Fionnuala
Wszystko działa idealnie, ale istnieje jakiś rodzaj wycieku pamięci. Opublikuję poniższą funkcję, ponieważ jest za długa na komentarz. – cOrOllArY