从宏查询(加入)外部工作簿

Posted

技术标签:

【中文标题】从宏查询(加入)外部工作簿【英文标题】:query (join) external wokbooks from a macro 【发布时间】:2018-08-03 14:12:15 【问题描述】:

我有 3 个 Excel 工作簿:

宏(完成后将成为加载项) 上期数据列表 当前周期数据列表 两个列表都少于 1000 行。

我正在尝试在这些列表之间创建一个 SQL join,但我无法让它工作。由于工作表名称中有点(如“TB 03.18”),我使用技巧 - 在 SO 上的某处找到 - 来定义相应工作簿中的命名范围。

下面是代码,其中包含 2 个有效的 SQL 和一个给出错误的 SQL 的信息。我搞不清楚了。

'set connection to 'current tb'
sConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wbCurr.FullName & _
        ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
Set con = New ADODB.Connection
con.Open sConn

wbCurr.Names.Add Name:="cur", RefersTo:=shCurr.Range("A4").CurrentRegion    'to be made dynamic !!!
wbPrev.Names.Add Name:="pre", RefersTo:=shPrev.Range("A9").CurrentRegion    'to be made dynamic !!!

lastRow = shPrev.Range("a15000").End(xlUp).Row
shCurr.Range("F5:I15000").Clear
Dim xl12 As String: xl12 = "[Excel 12.0;Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='HDR=YES';] "


'this works ------------------
'sSql = "select reference from  cur " & vbCrLf & _
       "where cur.reference like '1%'"

'this works ------------------
sSql = "select pre.reference  " & vbCrLf & _
       "from pre IN '" & wbPrev.FullName & "' " & xl12 & vbCrLf & _
       "where pre.reference like '1%'"

'not working: syntax error in FROM clause
'sSql = "select cur.reference from  cur " & vbCrLf & _
       "inner join pre IN '" & wbPrev.FullName & "' " & xl12 & " on cur.reference = pre.reference " & vbCrLf & _
       "where cur.reference like '1%'"

Debug.Print Now, sSql
Set rs = con.Execute(sSql)

【问题讨论】:

【参考方案1】:

使用 Jet/ACE SQL 引擎,您可以使用方括号或反引号对标识符中的特殊字符进行转义。因此,句点不应该成为问题,然后您可以使用完整的工作表名称和A1 范围表示法,以便在 SQL 查询中清晰地显示,而不是命名范围。

但是,您的特定 SQL 错误是由于在 INNER JOIN 子句中使用了 IN。避免 IN 最好用于一张表,并使用句点限定符语法,将工作簿路径作为参数传递在内联调用中,即使 Provider 也不需要:

FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook].[Worksheet$] AS w

总而言之,请考虑以下不带命名范围的调整,这很难调试。下面展示了如何使用括号或反引号处理句点,以及如何使用A1 符号范围引用内部和外部工作表。

strSQL = "SELECT s1.[reference]" & _ 
         " FROM [S.h.e.e.t1$A4:Z100] s1" & _
         " INNER JOIN [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook].`S.h.e.e.t.2$A9:Z100` s2 
              ON s1.[reference] = s2.[reference]" & _
         " WHERE s1.reference LIKE '1%'"

rs.Open strSQL, con

【讨论】:

看起来很有希望,谢谢!我离开了办公室,所以我会在那个星期一测试。如果工作,你应该得到你的伪;-) 不容易设置,但运行良好。非常感谢,因为我在网上找不到很多关于这个的资源.. 很高兴听到!您仍然可以使用命名范围,只需使用 JOIN 子句更改 IN 的使用。是的,在 Excel 中运行 SQL 通常是一种鲜为人知的无证方法。

以上是关于从宏查询(加入)外部工作簿的主要内容,如果未能解决你的问题,请参考以下文章

excel工作簿出现“此工作簿包含一个或多个可能不安全的外部源的链接”,请问怎么取消这烦人的提示?

在函数中引用外部工作簿

从外部主表更新工作簿的现有结构化表?

所有Excel 文件打开显示“此工作簿包含一个或多个可能不安全的外部源的链接……”,怎么解决?

WPS表格出现“此工作簿包含其他数据的链接,是不是更新这些链接”怎么解决

将查询导出为共享工作簿