带SQL的Excel VBA:指定Where子句时未返回行

带SQL的Excel VBA:指定Where子句时未返回行,sql,excel,vba,where-clause,listobject,Sql,Excel,Vba,Where Clause,Listobject,下面是我的代码摘录 这是SQL命令: vSQL=“选择OLIN.fk_cCUST作为CustomerKey,Sum(nolinseltata)作为ResultSumV” vSQL=vSQL&“FROM(在OLIN.fk_cTYOR=TYOR.cTYOR上的OLIN内部联接TYOR)在TYOR.fk_cMTYP=MTYP.cMTYP上的内部联接MTYP” vSQL=vSQL&“其中OLIN.fk_与'T180*'类似” vSQL=vSQL&“按OLIN.fk_cCUST分组” vSQL=vSQL&

下面是我的代码摘录

这是SQL命令:

vSQL=“选择OLIN.fk_cCUST作为CustomerKey,Sum(nolinseltata)作为ResultSumV”
vSQL=vSQL&“FROM(在OLIN.fk_cTYOR=TYOR.cTYOR上的OLIN内部联接TYOR)在TYOR.fk_cMTYP=MTYP.cMTYP上的内部联接MTYP”
vSQL=vSQL&“其中OLIN.fk_与'T180*'类似”
vSQL=vSQL&“按OLIN.fk_cCUST分组”
vSQL=vSQL&“;”
数据库的位置:

vDataSRC=“C:\\u projCuTOPs\bdd\GSF\u dataWHouse.accdb”
包含到数据库的字符串连接的变量:

vArrSRC=“OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password=”“”;用户ID=Admin
vArrSRC=vArrSRC&“数据源=&vDataSRC&;”
vArrSRC=vArrSRC&“Mode=Share Deny Write;扩展属性=“”;Jet OLEDB:系统数据库=“”;Jet OLEDB:注册表路径=“”;Jet OLEDB:数据库密码=“”;”
vArrSRC=vArrSRC&“Jet OLEDB:引擎类型=6;Jet OLEDB:数据库锁定模式=0;Jet OLEDB:全局部分批量操作=2;Jet OLEDB:全局批量事务=1;”
vArrSRC=vArrSRC&“Jet-OLEDB:New-Database-Password=”“”;Jet-OLEDB:Create-System-Database=False;Jet-OLEDB:Encrypt-Database=False;Jet-OLEDB:Don-Copy-Locale-on-Compact=False;”
vArrSRC=vArrSRC&“Jet-OLEDB:Compact无副本修复=False;Jet-OLEDB:SFP=False;Jet-OLEDB:Support-Complex-Data=False;Jet-OLEDB:Bypass-UserInfo-Validation=False;”
vArrSRC=vArrSRC&“Jet-OLEDB:Limited-DB-Caching=False;Jet-OLEDB:Bypass-ChoiceField-Validation=False”
结果的工作表:

ActiveWorkbook.Sheets.Add After:=工作表(Worksheets.Count)
ActiveWorkbook.Sheets(Worksheets.Count).Name=“RawDatas”
此命令将QueryTable添加为ListObject时返回零,因为Where子句,而SQL是OK的

如果删除Where子句,它可以工作,但我需要对行添加限制

使用ActiveSheet.ListObjects.Add(SourceType:=xlSrcExternal,Source:=vArrSRC,Destination:=Range($A$1)).QueryTable '>> .CommandType=xlCmdSql .CommandText=vSQL .rowNumber=False .FillAdjacentFormulas=False .PreserveFormatting=True .refreshinfoleopen=False .BackgroundQuery=True .RefreshStyle=xlInsertDeleteCells .SavePassword=False .SaveData=True .AdjustColumnWidth=True .RefreshPeriod=0 .PreserveColumnInfo=True '** .SourceDataFile=vDataSRC '** .ListObject.DisplayName=“tbl\u SQL\u SumTYOR” .Refresh BackgroundQuery:=False '>> 以
怎么了?我绝对需要使用Where子句。

在MS Access GUI(前端)和任何到MS Access(后端)的ODBC/OLDEB连接之间运行查询时,
LIKE
通配符的行为不同。请参见中ANSI-89和ANSI-92之间的差异

对于在Excel中进行的ODBC/OLEDB连接,
LIKE
需要ANSI-92通配符和
%

vSQL = vSQL & " Where OLIN.fk_cOHEAkey Like 'T180%' "
或者,为了在GUI和ODBC/OLEDB中同时使用
相似的
(类似ANSI),可以兼容:

vSQL = vSQL & " Where OLIN.fk_cOHEAkey ALike 'T180%' "

更好的是,将查询保存在MS Access中(引擎缓存统计数据和最佳执行计划时效率更高):

选择OLIN.fk_cCUST作为CustomerKey,
作为结果的总和(nOLINselTota)
FROM(OLIN.fk_cTYOR=TYOR.cTYOR上的OLIN内部联接TYOR)
TYOR.fk_cMTYP=MTYP.cMTYP上的内部联接MTYP
其中OLIN.fk_像'T180*'
OLIN.fk_cCUST分组
然后,在Excel中引用其名称(避免VBA连接):


您确定like子句中的
*
吗?也许你的意思是
%
可能是重复的。我甚至在SQL Access查询部分提交了它,它还可以。但是,我现在就试试。解决方案没问题。很高兴听到。好奇的是,你尝试过保存查询的方法吗?你是对的@Parfait,我知道这种方法。但是,我需要动态地从表中指定不同的条件作为日期限制和其他项。所以,保存的查询似乎不适合我。除非你有任何技巧。考虑一下你在哪里保存底层结构,但是只改变值:<代码> >从MySaveQuebug中选择MyDeCeCo之间的哪一个?和?
vSQL = "SELECT * FROM mySavedQuery"