' -2147467259(80004005)'使用SQL SELECT字符串,否则可以工作

时间:2017-07-10 16:42:51

标签: sql vba excel-vba excel

我有一个SELECT语句,当它在VBA代码中时有效,但不是在它是单元格的内容时。这是工作SQL:

SELECT Contacts.[Last Name], Contacts.[First Name], Contacts.[E-Mail],    Contacts.[Project, Org, Team]
FROM Contacts 
WHERE (((Contacts.[Project, Org, Team]) Like ""Team%"") AND ((Contacts.[Active?])=Yes)) 
ORDER BY Contacts.[Last Name];

连接字符串如下(适用于工作和非工作脚本):

ConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=1;RetrieveIds=Yes;" & _
"DATABASE=" & SharepointURL & ";" & _
"LIST=" & ListID & ";"

如果我将SELECT语句文本放入格式化为文本的单元格以及双引号中,则在尝试使用它时会出现语法错误(' -2147217900(80040e14)') 。以下是我必须使用的陈述:

myQuery = Range("Project1Query").Value
ReviewersData.Open myQuery, ReviewersConn, adOpenStatic, adLockOptimistic

如果我将双引号更改为单引号,则查询如下所示:

SELECT Contacts.[Last Name], Contacts.[First Name], Contacts.[E-Mail], Contacts.[Project, Org, Team] 
FROM Contacts 
WHERE (((Contacts.[Project, Org, Team]) like "Team%") AND ((Contacts.[Active?])=Yes)) 
ORDER BY Contacts.[Last Name];

我得到一个无法连接的错误(' -2147467259(80004005)')。

关于如何调整SQL查询语法的任何想法?回想一下,当SELECT语句在VBA中时,我可以连接并使用查询。当语句在单元格中时,它不起作用。

3 个答案:

答案 0 :(得分:1)

必须是' Team%'不是“团队%”。

答案 1 :(得分:0)

Like ""Team%""中重复双引号的目的是向VBA编译器指示您希望在字符串中包含文字双引号字符。结果字符串仅包含单个双引号字符而不是重复字符。这可以通过运行以下代码来验证:

MsgBox "Like ""Team%"""

导致此输出:

An Excel message box showing the phrase: Like Team% with the Team% part enclosed in double quotes

VBA编译器解释VBA宏的文本 - 它将宏的文本转换为可以运行的程序。编译器仅处理直接输入VBA编辑器的文本。它不关心宏在运行时处理的文本 - 例如来自用户输入,文本文件,Excel单元格值 - 即使该文本在某个时刻被读入VBA变量。

将SQL查询文本直接放入Excel单元格中,绕过VBA编译器及其解释重复双引号的方式。如果将Like ""Team%""复制并粘贴到格式化为文本的Excel单元格中,然后将MsgBox复制并粘贴到单元格的值,则会得到以下结果:

An Excel message box showing the phrase: Like Team% with the Team% part enclosed in repeated double quotes - two double quotes before the text and two double quotes after the text

因此,将查询直接放在Excel单元格中会导致包含额外的双引号字符,因为查询的格式就好像它将被VBA编译器解释,但单元格值不会以这种方式解释。

要使查询与Excel单元格中存储的文本一起使用,只需将查询字符串中任何重复的双引号字符替换为单独的双引号字符:Like "Team%"

你也可以使用单引号字符而不是双引号字符,但同样不需要重复字符:Like 'Team%'

另一种方法是从VBA设置单元格值,因为这会导致重复的双引号由VBA编译器解释(因为文本值现在直接在VBA编辑器中作为宏的一部分)在单元格值之前已设置:Worksheets("Sheet1").Range("A1").Value = "Like ""Team%"""

编辑:如果查询在VBA代码中仍然有效,请执行以下操作:

myQuery = "SELECT Contacts.[Last Name], Contacts.[First Name], Contacts.[E-Mail],    Contacts.[Project, Org, Team] " & _
    "FROM Contacts " & _
    "WHERE (((Contacts.[Project, Org, Team]) Like ""Team%"") AND ((Contacts.[Active?])=Yes)) " & _
    "ORDER BY Contacts.[Last Name];"
ReviewersData.Open myQuery, ReviewersConn, adOpenStatic, adLockOptimistic

然后尝试这个版本:

Range("Project1Query").NumberFormat = "@"
Range("Project1Query").Value = "SELECT Contacts.[Last Name], Contacts.[First Name], Contacts.[E-Mail],    Contacts.[Project, Org, Team] " & _
    "FROM Contacts " & _
    "WHERE (((Contacts.[Project, Org, Team]) Like ""Team%"") AND ((Contacts.[Active?])=Yes)) " & _
    "ORDER BY Contacts.[Last Name];"
myQuery = Range("Project1Query").Value
ReviewersData.Open myQuery, ReviewersConn, adOpenStatic, adLockOptimistic

将范围的数字格式设置为“@”指定范围应格式化为文本。

如果这样做,那么之前必须出现关于如何输入单元格值的错误

答案 2 :(得分:0)

我认为像团队%'是正确的。另外如果是文本,则将其转换为“是”'