代码之家  ›  专栏  ›  技术社区  ›  iDevlop

从宏查询(联接)外部工作簿

  •  1
  • iDevlop  · 技术社区  · 6 年前

    我有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 回复  |  直到 6 年前
        1
  •  1
  •   Parfait    6 年前

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

    但是,您的特定SQL错误是由于使用 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