我怎样才能在一个Excel表格命名的范围内运行SQL语句?

我所要做的就是在Excel工作表(即一个命名的范围,甚至A1:F100)上取一个标准范围,然后在其上运行一些sql查询,并返回一个logging集,我可以在VBA代码中步入,甚至只需粘贴到同一工作簿中的其他工作表即可。

使用ADODB是一个想法,但我怎么能设置连接string指向当前工作簿中的一些范围?

我知道之前,我已经使用了微软查询向导,这是不理想的,但将工作。 我似乎无法得到这个引用表单内的范围,只有其他的Excel文件。


这是我留下的function。 当我运行它几次我的Excel崩溃与通常的资源错误信息。 我已经从电子表格中删除了这个函数,并且所有东西都可以无缝地运行多次,所以这里肯定是由代码造成的。

我清理了所有的对象(正确?)。 有没有人有任何想法可能会出错? 连接string中是否有可以调整的东西,或者是否可以与从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 

你可以使用这个名字。

 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部分

我注意到你只需要今天的logging,所以你应该可以修改sql来:

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

您尚未closures连接:

 cn.Close 

接着

  Set rs=Nothing Set cn=Nothing 

如何使用LIKE子句?

我试着用:

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

没有成功….

这工作:

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

但这不是我想要的。

编辑

嗯….我们需要改变通配符工作…不要使用*,使用%

你会发现所有你需要在下面:

第一个链接是VB.NET,链接2-6是VBA。

find所有在谷歌,约2 – 4分钟。

我不知道VBA,但在Delphi和C#中有使用该格式的代码

 SELECT * FROM [SheetName$A1:B2] 

你试过了吗?

如果您使用的是PowerShell,$是一个内部字符。 使用`$

例如:

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