我有3个Excel工作簿:
我正在尝试join在这些列表之间创建一个SQL ,但无法正常工作。由于工作表名称中包含点(例如“ TB 03.18”),因此我使用了技巧- 在SO的某处找到-在相应的工作簿中定义命名范围。
join
下面的代码包含有效的2条SQL信息和给出错误的1条信息。我搞不清楚了。
'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)
使用Jet / ACE SQL引擎,您可以在带有方括号或反引号的标识符中转义特殊字符。因此,句点不应成为问题,然后您可以A1在SQL查询中使用完整的工作表名称和范围标记(为了清楚起见)代替命名范围。
A1
但是,您的特定SQL错误是由于IN在INNER JOIN子句中使用。避免IN最适合用于一个表,并使用句点限定符语法,该语法将工作簿路径作为参数传递给内联调用中的参数,甚至不需要 Provider 也可以:
IN
INNER JOIN
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