使用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语句?