如何在Excel工作表中的命名范围上运行SQL语句?

时间:2009-05-27 10:17:20

标签: sql excel vba excel-vba

我想要做的就是在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 个答案:

答案 0 :(得分:18)

您可以使用该名称。

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 :(得分:1)

如何使用LIKE子句?

我试图使用:

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

没有成功......

这有效:

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

但这不是我想要的。

修改

哼哼....我们需要改变通配符才能工作...... 不要使用*,使用%

答案 2 :(得分:0)

我不了解VBA,但是Delphi和C#中有使用格式的代码

SELECT * FROM [SheetName$A1:B2]

你试过吗?

答案 3 :(得分:0)

如果您使用的是powershell,则$是内部字符。使用`$

例如:

"Select * from [VM`$A3:F30]"

答案 4 :(得分:-1)

您将在下面找到所需的一切:

每个链接都适用于VBA

One

Two

Three