我正在尝试制作一个 Excel 宏,它将在 Excel 中提供以下功能:
=SQL("SELECT heading_1 FROM Table1 WHERE heading_2='foo'")
允许我使用 SQL 查询在工作簿的表中搜索(甚至可能插入)数据。
这是我到目前为止所做的:
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
我的脚本就像一个具有硬编码范围的魅力,例如上面代码片段中的范围。它也适用于静态命名范围。
但是,它不适用于动态命名范围或对我来说最重要的表名。
我找到的最接近的答案是这个遭受同样痛苦的人: 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
谢谢!
最佳答案
您可以做的一件事是获取动态命名范围的地址,并将其用作 SQL 字符串中的输入。像这样的东西:
Sheets("shtName").range("namedRangeName").Address
它将输出一个地址字符串,例如$A$1:$A$8
编辑:
正如我在下面的评论中所说,您可以动态获取完整地址(包括工作表名称)并直接使用它或解析工作表名称以供以后使用:
ActiveWorkbook.Names.Item("namedRangeName").RefersToLocal
这会产生类似 =Sheet1!$C$1:$C$4
的字符串。因此,对于上面的代码示例,您的 SQL 语句可能是
strRangeAddress = Mid(ActiveWorkbook.Names.Item("namedRangeName").RefersToLocal,2)
strSQL = "SELECT * FROM [strRangeAddress]"
关于sql - 使用 VBA 宏对工作簿内的 Excel 表执行 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19755396/