【发布时间】: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 Ask 和minimal reproducible example - 这将帮助您改进您的问题
-
您的最后两行动态创建的 SQL 行将不会在
MESI$.MESE和PIVOT之间留下空格。代码基本上创建了以下字符串:"ORDER BY Year([Foglio1$].[DATA]), MESI$.MESEPIVOT MESI$.MESE;"当遇到与动态生成的 SQL 相关的问题时,将 SQL 字符串输出到调试窗口然后复制/粘贴到数据库中并按原样运行通常是一个很好的步骤看看是否会出现同样的错误。 -
如果这不能解决问题,您是否还可以添加运行此代码时收到的确切错误消息?
-
嗨 JNevill!错误消息是:“ TRANSFORM 的语法错误”