通过VBA运行SQL

时间:2015-10-06 12:44:44

标签: excel vba excel-vba

我正在尝试运行以下查询:

SELECT Project.* FROM Project WHERE (((Projects.[End Date (PPL)])>=DateAdd('m',-6,Date())));

它在Access(2007)中运行良好但是当我将其移动到VBA时:

strQry = "SELECT Project.* FROM Project WHERE (((Projects.[End Date (PPL)])>=DateAdd('m',-6,Date())));"

我收到一条错误消息“没有为一个或多个必需参数指定值”

我可以使用以下代码运行它,但它没有提供正确的信息:

strQry = "SELECT Project.* FROM Project WHERE Project.[End Date (PPL)] >= DateAdd('m',-6,Date());"

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

您的问题的最终答案就在这里,在StackOverflow中:

VBA function in Excel ADODB query

简短的回答是:

您正在使用名为Jet-SQL的SQL方言,大多数人都是从Microsoft Access调用它,这是一个使VBA函数可供SQL引擎使用的数据库应用程序。

如果从任何其他平台运行Jet SQL(如ODBC或ADODB包装器) - VBA功能不可用:您拥有的就是Jet-SQL本机功能。

这里有一个原生Jet-SQL函数的列表:它几乎完成了,你可以看到它相当短:

MS Access: Functions - Listed by Category

......它并不包括NZ()

这些功能看起来像熟悉的VBA有点令人困惑 - 并且令人讨厌列出它们的网页被标记为“MS-Access'而不是Jet SQL。

该列表中有一个有趣的项目:内联'如果'函数IIF(),你可以用它代替NZ:


SELECT
    IIF(
        table1.[RIC] IS NOT NULL, 
        table1.[RIC],
        table2.[ISIN] + ', CODE:ISIN'
        )                               AS [RetrievalCode],
    table3.[Value], 
    table3.[DateStamp] 
FROM
    * The rest of your Query  *

希望有所帮助:我怀疑它不会,因为您可能正在调用命名查询(或其中带有命名子查询的SQL),并且这些查询中的所有非本机函数调用都是无效的,除非整个事情都是从MS-Access中调用的。

当然,您可以制作一个'架构'查询并解压缩SQL,解析出来,并用本机Jet-SQL函数替换所有VBA。但是,如果你超出了它的预期环境--Microsoft Access中的Query-By-Example可视化查询构建器 - Jet-SQL的语法会变得神秘 - 所以这个建议可能比做一些更多的时间和麻烦其他方式。