从宏查询(加入)外部wokbooks

时间:2018-08-03 14:12:15

标签: sql excel vba oledb

我有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 个答案:

答案 0 :(得分:1)

使用Jet / ACE SQL引擎,您可以在带有方括号或反引号的标识符中转义特殊字符。因此,句点不应该成为问题,然后您可以在SQL查询中使用完整的工作表名称和A1范围符号(为了清楚起见)代替命名范围。

但是,您的特定SQL错误是由于在IN子句中使用了INNER JOIN而引起的。避免使用最适合用于一个表的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