sql - 使用 VBA 宏对工作簿内的 Excel 表执行 SQL 查询

标签 sql vba excel

我正在尝试制作一个 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/

相关文章:

mysql - 错误代码 : 1054 Unknown column in 'where clause'

mysql - 如何将变量传递给存储过程的主体语句?

mysql group by 删除一些列后

python - 将内联图像插入 Lotus Notes 消息中

java - 将 Csv 文件写入类似矩阵的结构

excel - 如何通过批处理文件关闭excel宏而不进行任何保存更改?

excel - 写入文本文件时出现错误文件模式错误

MYSQL 查询 : get the latest date with grouped by data

vba - Excel VBA函数给出 "Argument not Optional"

excel - 在添加数组之前检查文件扩展名是否为 .xlsx