使用DAO.Recordset时交叉表查询失效,Excel VBA执行报错求助
嘿,我之前也碰到过类似的情况——Access里跑的好好的交叉表,放到VBA里就报语法错,结合你的代码片段,这几个原因最可能导致你遇到的问题:
1. 交叉表查询缺了关键的PIVOT子句
这绝对是最常见的坑!Access的TRANSFORM交叉表查询必须带PIVOT子句,用来指定你要透视的字段(比如年份、类别这类)。你的代码片段到GROUP BY就断了,SQL解析器找不到预期的PIVOT部分,就会把错误指向前面的表名附近(也就是你看到的“Yearly PV附近”)。
完整的交叉表语法得是这样的:
TRANSFORM Sum([Yearly Pv].[Original_Print_volume]) AS SumOfPrintvolume SELECT [Yearly Pv].[Press1] FROM [Yearly Pv] WHERE ([Yearly Pv].[Year] = 2016 Or [Yearly Pv].[Year] = 2017) GROUP BY [Yearly Pv].[Press1] PIVOT [Yearly Pv].[Year]; -- 这里要换成你实际需要透视的字段,比如年份或者其他维度
对应到VBA里,得把PIVOT部分补全,比如:
StrQuery = "TRANSFORM Sum([Yearly Pv].[Original_Print_volume]) AS SumOfPrintvolume " & _ "SELECT [Yearly Pv].[Press1] " & _ "FROM [Yearly Pv] " & _ "WHERE ([Yearly Pv].[Year] = 2016 Or [Yearly Pv].[Year] = 2017) " & _ "GROUP BY [Yearly Pv].[Press1] " & _ "PIVOT [Yearly Pv].[Year];"
2. 字符串拼接时漏了空格
VBA里用& _换行拼字符串的时候,一定要注意每一行的开头或结尾留空格,不然关键字和表名会粘在一起,直接触发语法错误。比如如果你的第二行写成"SELECT[Yearly Pv].[Press1]"(SELECT后面没空格),就会变成SumOfPrintvolumeSELECT[Yearly Pv].[Press1],这肯定会报错。检查所有拼接的行,确保关键字之间都有空格。
3. 冗余括号搞晕了SQL解析器
你的WHERE子句套了好多层括号:WHERE ((([Yearly Pv].[Year]) = 2016 Or ([Yearly Pv].[Year]) = 2017))。虽然Access可视化设计器会自动生成这种括号,但Jet SQL解析时偶尔会出问题。不如简化成更清晰的写法:
WHERE [Yearly Pv].[Year] IN (2016, 2017)
对应的VBA代码就是:
"WHERE [Yearly Pv].[Year] IN (2016, 2017) " & _
这样既简洁,也减少了解析出错的概率。
4. 表名/字段名的拼写或大小写问题
虽然Access不区分大小写,但如果你的实际表名是Yearly PV(大写V),而代码里写的是[Yearly Pv](小写v),某些极端情况下Jet引擎可能会抽风。最好核对一下数据库里的表名、字段名和代码里的完全一致,包括空格和大小写。
内容的提问来源于stack exchange,提问作者Francisco Plácido

