使用VBAmacros在工作簿中的Excel表上执行SQL查询

我正在试图做一个Excelmacros将给我在Excel中的以下function:

=SQL("SELECT heading_1 FROM Table1 WHERE heading_2='foo'") 

允许我使用SQL查询在我的工作簿表中search(甚至插入)数据。

这是我迄今为止所做的:

 Sub SQL() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset strFile = ThisWorkbook.FullName strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT * FROM [Sheet1$A1:G3]" rs.Open strSQL, cn Debug.Print rs.GetString End Sub 

我的脚本像一个硬编码范围,如上面的代码片段。 它也适用于静态命名范围。

但是,它不适用于对我而言最重要的dynamic命名范围或TABLE NAMES。

我find的最接近答案的是这个患有同样疾病的人: http ://www.ozgrid.com/forum/showthread.php?t= 72973

帮助任何人?

编辑

我熟悉了这一点,我可以在我的SQL查询中使用结果名称。 限制是我需要知道在哪张表上。 我们可以做些什么吗?

 Function getAddress() myAddress = Replace(Sheets("Sheet1").Range("Table1").address, "$", "") myAddress = "[Sheet1$" & myAddress & "]" getAddress = myAddress End Function 

谢谢!

有一件事你可以做的是获取dynamic命名范围的地址,并将其用作SQLstring中的input。 就像是:

 Sheets("shtName").range("namedRangeName").Address 

哪个会吐出一个地址string,例如$A$1:$A$8

编辑:

正如我在下面的评论中所说的,您可以dynamic获取完整的地址(包括工作表名称),并直接使用它或parsing工作表名称以备后用。

 ActiveWorkbook.Names.Item("namedRangeName").RefersToLocal 

这导致像=Sheet1!$C$1:$C$4这样的string。 因此,对于上面的代码示例,您的SQL语句可能是

 strRangeAddress = Mid(ActiveWorkbook.Names.Item("namedRangeName").RefersToLocal,2) strSQL = "SELECT * FROM [strRangeAddress]" 
 Public Function GetRange(ByVal sListName As String) As String Dim oListObject As ListObject Dim wb As Workbook Dim ws As Worksheet Set wb = ThisWorkbook For Each ws In wb.Sheets For Each oListObject In ws.ListObjects If oListObject.Name = sListName Then GetRange = "[" & ws.Name & "$" & Replace(oListObject.Range.Address, "$", "") & "]" Exit Function End If Next oListObject Next ws End Function 

在你的SQL中使用它就像这样

 sSQL = "Select * from " & GetRange("NameOfTable") & "" 

我是一个初学者修补别人的代码,所以请宽大,进一步纠正我的错误。 我尝试了你的代码,并与VBA帮助玩下面的工作与我:

 Function currAddressTest(dataRangeTest As Range) As String currAddressTest = ActiveSheet.Name & "$" & dataRangeTest.Address(False, False) End Function 

当我为我的函数select数据源参数时,它将变成Sheet1 $ A1:G3格式。 如果excel将其更改为我公式中的Table1 [#All]引用,则该函数仍然正常工作

然后我在你的函数中使用它(试图播放和添加另一个参数被注入到WHERE …

 Function SQL(dataRange As Range, CritA As String) Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim currAddress As String currAddress = ActiveSheet.Name & "$" & dataRange.Address(False, False) strFile = ThisWorkbook.FullName strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open strCon strSQL = "SELECT * FROM [" & currAddress & "]" & _ "WHERE [A] = '" & CritA & "' " & _ "ORDER BY 1 ASC" rs.Open strSQL, cn SQL = rs.GetString End Function 

希望你的function进一步发展,我觉得它非常有用。 祝你今天愉快!

只是回答你的问题的第二部分有关表获取表的名称:

 Dim name as String name = Range("Table1").Worksheet.Name 

编辑:

为了使事情更清楚:有人build议使用Sheet对象上的Range。 在这种情况下,你不需要; 表格所在的范围可以使用表格的名字获得; 这个名字在整本书中都有提供。 所以,单独调用Range就行得通。

基于Joan-Diego Rodriguez的Jordi方法和一些Jacek Kotowski代码的例程 – 该函数将活动工作簿的任何表名转换为SQL查询的可用地址。

请注意MikeL:添加“[#All]”包括避免报告问题的标题。

 Function getAddress(byVal sTableName as String) as String With Range(sTableName & "[#All]") getAddress= "[" & .Parent.Name & "$" & .Address(False, False) & "]" End With End Function 

嗨最近研究这个问题,并引用Excel中的指定表(列表对象)的问题

如果你在表格名上加上后缀“$”,那么在这个世界上一切都很好

 Sub testSQL() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset ' Declare variables strFile = ThisWorkbook.FullName ' construct connection string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";" ' create connection and recordset objects Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") ' open connection cn.Open strCon ' construct SQL query strSQL = "SELECT * FROM [TableName$] where [ColumnHeader] = 'wibble';" ' execute SQL query rs.Open strSQL, cn Debug.Print rs.GetString ' close connection rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub 

发现这一点,它为我工作。

 strSQL = "SELECT * FROM DataTable" 

'其中DataTable是命名范围

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