Excel中的SQL查询提供“未定义的函数名称”错误

时间:2013-05-23 16:53:26

标签: sql excel vba ms-access

我在MS Access中编写了一个使用MonthName函数的SQL查询。在访问它完美无瑕。我将确切的SQL语句复制到我经常用于查询数据库的Excel模块中。当我运行查询时,excel不断告诉我MonthName是一个未定义的函数名。如果我删除MonthName部分,查询运行正常。

好像我错过了一个引用或什么......现在,我正在引用Microsoft ActiveX Data Objects Library 6.0。谁能指出我正确的方向?感谢

strSQL = "SELECT DISTINCT Customers.CustomerName, Employees.EmployeeName, [Policy data revised].EXDT, MonthName(Month([EXDT])) AS expMonth 
          FROM (([Service Team table] 
          INNER JOIN Customers 
          ON [Service Team table].CustID = Customers.CustID) 
          INNER JOIN Employees 
          ON [Service Team table].EmployeeID = Employees.EmployeeID) 
          INNER JOIN [Policy data revised] 
          ON Customers.CustID = [Policy data revised].CustID 
          WHERE ((([Service Team table].RoleExtension)='2.  Underwriting Assistant') 
          AND (([Policy data revised].EXDT) 
             BETWEEN #" & minExpDt & "# AND #" & maxExpDt & "#)) 
          ORDER BY [Policy data revised].EXDT ASC;"

2 个答案:

答案 0 :(得分:4)

MonthName()函数仅适用于在Access应用程序会话中运行的查询。请参阅“以下VBA函数在从属性表调用或在SQL语句中使用时将无效项目符号位于About Microsoft Jet Expression Service sandbox mode。在Access应用程序会话中,db引擎可以使用表达式服务来使用该沙盒功能。

由于您无法使用MonthName,请尝试使用此Format表达式。

Format([EXDT], 'mmmm') AS expMonth

答案 1 :(得分:1)

奇怪,我刚刚在Excel 2010(64位)中尝试了以下代码,它对我有用:

Sub foo()
'' Reference: "Microsoft ActiveX Data Objects 6.0 Library"
Dim con As ADODB.Connection, rst As ADODB.Recordset
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Gord\Desktop\Database1.accdb;"
Set rst = New ADODB.Recordset
rst.Open "SELECT MonthName(Month([BookingStart])) FROM Payment_tbl", con, adOpenStatic, adLockOptimistic
Debug.Print rst(0).Value
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
End Sub

修改

继HansUp的评论之后,Office 2007和Office 2010之间的某些内容必定已经发生了变化。我在运行Office 2010的32位计算机上运行了另一个测试,上面的代码针对Access 2000 .mdb文件运行,同时使用这两个文件。 ..

Provider=Microsoft.ACE.OLEDB.12.0;

...和...

Provider=Microsoft.Jet.OLEDB.4.0;

我还检查了......

下的SandBoxMode注册表值
HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines

...它是3,这是“已启用”的值(参考:here)。