【问题标题】:VBA - Syntax error with TRANSFORM in SQL statementVBA - SQL 语句中的 TRANSFORM 语法错误
【发布时间】:2021-12-18 04:14:21
【问题描述】:

我在这里向您寻求帮助,因为在对 ADO 进行了各种实验后,我遇到了一个无法解决的问题。

我相信我所做的一切都是正确的,但 VBA 通知我在转换教育中犯了语法错误

我检查了所有内容,没有发现错误,这也是因为在 Access 上执行的相同查询运行良好。

目的是查询返回这个结果:

如果我在没有连接的情况下运行非常相似的查询,我没有问题并且一切正常,但是如果我在工作表“月”上使用连接,就会出现语法问题。

你能指出我哪里错了吗?

非常感谢您的支持。

这里是文件: https://www.dropbox.com/s/2isoyahnsmvcr2k/Errore_TRANSFORM.xlsb?dl=0

这是我的代码:

Sub generaRicavi()
    Dim RS As New ADODB.Recordset
    Dim conn As String, SQL As String
    
    Application.ScreenUpdating = False
    conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & "; Jet OLEDB:Bypass ChoiceField Validation =True;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'"
            
    SQL = "TRANSFORM Sum(Foglio1$.RICAVI)" _
            & " SELECT Year([Foglio1$].[DATA])" _
            & " FROM MESI$ LEFT JOIN Foglio1$ ON MESI$.MESE =  Month([Foglio1$].[DATA])" _
            & " GROUP BY Year([Foglio1$].[DATA])" _
            & " ORDER BY Year([Foglio1$].[DATA]), MESI$.MESE" _
            & " PIVOT MESI$.MESE;"
            
    RS.Open SQL, conn, adOpenStatic, adLockReadOnly
    
    With Foglio2
        .Range("A3").CurrentRegion.ClearContents
        .Range("A3:M3") = Array("ANNO","GENNAIO", "FEBBRAIO", "MARZO", "APRILE", "MAGGIO", "GIUGNO", "LUGLIO", "AGOSTO", "SETTEMBRE", "OTTOBRE", "NOVEMBRE", "DICEMBRE")
        .Range("A4").CopyFromRecordset RS
    End With
    
    RS.Close
    Application.ScreenUpdating = True
    Set RS = Nothing
End Sub

【问题讨论】:

  • 旁注:Range("A3:M3") 大于您放入其中的数组,这会导致单元格 M3 具有 #N/A 错误值。
  • 请在您的问题中添加示例数据集 - 没有人会下载您的文件。阅读How to Askminimal reproducible example - 这将帮助您改进您的问题
  • 您的最后两行动态创建的 SQL 行将不会在 MESI$.MESEPIVOT 之间留下空格。代码基本上创建了以下字符串:"ORDER BY Year([Foglio1$].[DATA]), MESI$.MESEPIVOT MESI$.MESE;" 当遇到与动态生成的 SQL 相关的问题时,将 SQL 字符串输出到调试窗口然后复制/粘贴到数据库中并按原样运行通常是一个很好的步骤看看是否会出现同样的错误。
  • 如果这不能解决问题,您是否还可以添加运行此代码时收到的确切错误消息?
  • 嗨 JNevill!错误消息是:“ TRANSFORM 的语法错误”

标签: sql excel vba ado


【解决方案1】:

我找到了解决方案。 查询中确实存在语法错误。缺少工作表和表格字段之间的方括号。 有效的代码是这样的:

Sub generaRicavi()
    Dim RS As New ADODB.Recordset
    Dim conn As String, SQL As String
    
    Application.ScreenUpdating = False
    conn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & "; Jet OLEDB:Bypass ChoiceField Validation =True;Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'"
            
    SQL = "TRANSFORM Sum(Foglio1$.RICAVI)" _
            & " SELECT Year([Foglio1$].[DATA])" _
            & " FROM [MESI$] LEFT JOIN [Foglio1$] ON [MESI$].[MESE] =  Month([Foglio1$].[DATA])" _
            & " GROUP BY Year([Foglio1$].[DATA])" _
            & " ORDER BY Year([Foglio1$].[DATA]), [MESI$].[MESE]" _
            & " PIVOT [MESI$].[MESE];"
            
    RS.Open SQL, conn, adOpenStatic, adLockReadOnly
    
    With Foglio2
        .Range("A3").CurrentRegion.ClearContents
        .Range("A3:M3") = Array("ANNO", "GENNAIO", "FEBBRAIO", "MARZO", "APRILE", "MAGGIO", "GIUGNO", "LUGLIO", "AGOSTO", "SETTEMBRE", "OTTOBRE", "NOVEMBRE", "DICEMBRE")
        .Range("A4").CopyFromRecordset RS
    End With
    
    RS.Close
    Application.ScreenUpdating = True
    Set RS = Nothing
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多