Как выполнить операторы SQL в именованном диапазоне в таблице Excel? - PullRequest
16 голосов
/ 27 мая 2009

Все, что я пытаюсь сделать, это взять стандартный диапазон на листе Excel (то есть именованный диапазон или даже A1: F100), выполнить несколько SQL-запросов к нему и вернуть набор записей, через который я могу пройти Код VBA или даже просто вставить в другой лист в той же книге.

Использование ADODB было одной мыслью, но как я могу настроить строку подключения так, чтобы она указывала на некоторый диапазон в текущей книге?

Я знаю, прежде чем использовал мастер запросов Microsoft, который не был идеальным, но работал бы. Я не могу понять, что это относится к диапазону в таблице, только к другим файлам Excel.


Вот функция, с которой я остался. Когда я запускаю его несколько раз, мой Excel вылетает с обычным сообщением об ошибке «Недостаточно ресурсов». Я удалил эту функцию из своей электронной таблицы, и все работает многократно, поэтому она определенно вызвана кодом здесь.

Я убрал все объекты (правильно?). У кого-нибудь есть идеи, что может пойти не так? Может ли быть что-то в строке подключения, что может быть изменено, или это может быть связано с вариантом, возвращаемым из метода GetRows?

Я использую MS ADO 2.8, а также пробовал 2.5 с тем же поведением.

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

Ответы [ 5 ]

19 голосов
/ 27 мая 2009

Вы можете просто использовать имя.

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

В ответ на вопрос часть 2

Я заметил, что вам нужны только сегодняшние записи, поэтому вы должны иметь возможность изменить sql:

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

Вы не закрыли соединение:

cn.Close

А потом

 Set rs=Nothing
 Set cn=Nothing
1 голос
/ 28 сентября 2009

Как насчет использования предложения LIKE?

Я пытался использовать:

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

без успеха ....

это работает:

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

но это не я хочу.

EDIT

хммм .... нам нужно поменять шаблоны для работы ... не используйте *, используйте%

0 голосов
/ 23 июня 2017

Если вы используете powershell, $ является внутренним символом. используйте `$

например:

"Select * from [VM`$A3:F30]"
0 голосов
/ 27 мая 2009

Я не знаю о VBA, но в Delphi и C # есть онлайн-код, который использует формат

SELECT * FROM [SheetName$A1:B2]

Вы пробовали это?

0 голосов
/ 27 мая 2009

Ниже вы найдете все, что вам нужно:

Каждая ссылка для VBA

Один

Два

Три

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...