2009-05-27 11 views
15

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 

Odpowiedz

16

Możesz po prostu użyć nazwy.

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 

strFile = Workbooks(1).FullName 
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

cn.Open strCon 

''Pick one: 
strSQL = "SELECT * FROM DataTable" ''Named range 
strSQL = "SELECT * FROM [Sheet1$A1:E346]" ''Range 

rs.Open strSQL, cn 

Debug.Print rs.GetString 

W odpowiedzi na pytanie Część 2

Zauważyłem, że chcesz tylko dzisiejsze zapisy, więc powinieneś być w stanie zmodyfikować sql do:

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] " _ 
& "where [Instrument Type] = 'LSTOPT' AND [Expiration]=#" _ 
& Format(Date(),"yyyy/mm/dd") & "#" 

Nie zamknięte połączenie:

cn.Close 

A następnie

Set rs=Nothing 
Set cn=Nothing 
+0

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

+0

Możesz napotkać problemy z ADO, jeśli nie zapisałeś. – Fionnuala

+0

Wszystko działa idealnie, ale istnieje jakiś rodzaj wycieku pamięci. Opublikuję poniższą funkcję, ponieważ jest za długa na komentarz. – cOrOllArY

0

Znajdziesz tu wszystko trzeba poniżej:

pierwszy link jest do VB.NET, linki 2 - 6 są dla VBA.

One

Two

Three

Four

Five

Six

Znaleziono wszystko w google, około 2 - 4 minut.

+1

Hi praavDa znalazłem wszystkie te same linki. Szukam sposobu, aby zrobić to z pliku, który mam otwarty, a nie oddzielny dokument programu Excel. Wszystko, czego potrzebuję, to jak skonfigurować ciąg połączenia tak, aby odwoływał się do bieżącego dokumentu, z którego wywoływany jest kod VBA, lub jeśli jest to nawet możliwe. Dzięki, Mike – cOrOllArY

+0

Cześć Mike. Z tego co rozumiem, odwołany dokument jest wymieniony jako źródło danych w. Dim stCon jako ciąg stCon = "Provider = Microsoft.Jet.OLEDB.4.0;" _ & "Źródło danych = c: \ VBExtreme.xls;" _ & "Rozszerzone właściwości =" "Excel 8.0; HDR = YES" ";" Pierwsze ścieżka aktywnego skoroszytu można osiągnąć z: Dim WB Jak skoroszytu Ustaw WB = ActiveWorkbook path = a.path & "\" & a.Name Z set path prawo con ciąg chciałby na przykład: Dim StCon jako ciąg stCon = "Provider = Microsoft.Jet.OLEDB.4.0;" _ & "Data Source =" & ścieżka _ & "Rozszerzone właściwości =" "Excel 8.0; HDR = YES" ";" – praavDa

+0

I jeśli się nie mylę, to ostatnia część napisu jest wersją biblioteki, którą masz w menu narzędzia/referencje w edytorze VBA w Excelu (najprawdopodobniej 11 dla wersji Excel 2003 lub 12 dla wersji 2007). Przepraszam za formatowanie w ostatnim, nie wiedziałem, że nie mogę używać przerw linii w komentarzach :) – praavDa

0

nie wiem o VBA, ale istnieje kod online w Delphi i C#, który używa formatu

SELECT * FROM [SheetName$A1:B2] 

Czy próbował?

+1

jak można wykonać taką instrukcję w VBA? – cOrOllArY

1

Co powiesz na używanie klauzuli LIKE?

Próbowałem użyć:

select * from [PES$] where PID_TAG like '*5400001' 

bez powodzenia ....

to działa:

select * from [PES$] where PID_TAG = 'PIT5400001' 

ale to nie chcę.

EDIT

hummm .... musimy zmienić symboli wieloznacznych do pracy ... nie używać *, użyć%

0

Jeśli używasz PowerShell, $ jest charakter wewnętrzny . używać `$

np

"Select * from [VM`$A3:F30]" 
Powiązane problemy