VBA DAO.OpenRecordSet 不一致的错误

Posted

技术标签:

【中文标题】VBA DAO.OpenRecordSet 不一致的错误【英文标题】:VBA DAO.OpenRecordSet Inconsistent Errors 【发布时间】:2016-07-12 23:16:30 【问题描述】:

运行访问 2016

我正在尝试从 Excel 的 MS Access .mdb 表中导入数据。 (我的客户端使用的专有软件只能识别 *.mdb 文件。)当我在表关闭时运行此代码时,我收到错误:

Run-Time Error 3061
Too few parameters - Expected 2

如果我在 Access 中打开表时运行代码,一半的时间,我得到那个错误和一半的时间:

Run-Time error '3008'
The table 'Daily_Logs_of_Flows' is already opened exclusively by 
another user, or it is already open through the user interface 
and cannot be manipulated programmatically.

这似乎表明 VBA 有时会通过第一个错误。

由于this post on ***,我检查了变量名称,并在monthToImport 前后使用了单引号和数字符号(#)。错误来自

Expected 3 

Expected 2

这里是代码

Sub importPLCDataFromAccess(monthToImport As Date)

Dim myDbLocation As String
myDbLocation = "K:\Users\WWTP Computer\Documents\POV_Projects\PLC Interface\PLC_Data.mdb"

DIM mysqlCall as String

Set myWorkbook = ActiveWorkbook
Set myDataSheet = myWorkbook.Worksheets("Page 1")

Set myEngine = New DAO.DBEngine
'Set myWorkspace = myEngine.Workspaces(0)
Set myDB = myEngine.OpenDatabase(myDbLocation)
' I deleted the workspace
' Set myDB = myWorkspace.OpenDatabase(myDbLocation)

mySQLCall = "SELECT Time_Stamp, GolfVolume, CreekVolume, InfluentVolume FROM Daily_Logs_of_Flows "
' Limit records to month requested...
mySQLCall = mySQLCall & "WHERE (DATEPART(m,Time_Stamp) = DATEPART(m,#" & monthToImport & "#)) "
'  ... during the year requested
mySQLCall = mySQLCall & "AND (DATEPART(yyyy,Time_Stamp) = DATEPART(yyyy,#" & monthToImport & "#)) "
mySQLCall = mySQLCall & "ORDER BY Time_Stamp"

Debug.Print "mySQLCall = " & mySQLCall
Debug.Print "monthToImport: " & monthToImport

'Error occurs on next line where execute query & populate the recordset

Set myRecordSet = myDB.OpenRecordset(mySQLCall, dbOpenSnapshot)

'Copy recordset to spreadsheet
Application.StatusBar = "Writing to spreadsheet..."
Debug.Print "RecordSet Count = " & myRecordSet.recordCount

If myRecordSet.recordCount = 0 Then
    MsgBox "No data retrieved from database", vbInformation + vbOKOnly, "No Data"
    GoTo SubExit
End If
'....
End Sub  

这是当前读取的 SQL 语句的 Debug.Print:

mySQLCall = SELECT Time_Stamp, GolfVolume, CreekVolume, InfluentVolume FROM Daily_Logs_of_Flows WHERE (DATEPART(m,Time_Stamp) = DATEPART(m,#6/1/2016#)) AND (DATEPART(yyyy,Time_Stamp) = DATEPART(yyyy,#6/1/2016#)) ORDER BY Time_Stamp

对我在这里缺少什么有什么想法吗?提前感谢您的帮助。

【问题讨论】:

我不知道答案,但是“排他性”错误实际上是“第一个”错误,所以当您收到运行时错误 3061 时,您实际上已经克服了那个错误,而不是另一个一路走来。 拿走SQL语句的Debug.Print直接在Access中运行会发生什么? 【参考方案1】:

问题是 DATEPART 函数需要第一个参数用引号引起来,否则它会查找字段yyyym

例如:

DATEPART("yyyy", #6/1/2016#)

DATEPART("m", #6/1/2016#)

总共:

SELECT Time_Stamp, GolfVolume, CreekVolume, InfluentVolume _
FROM Daily_Logs_of_Flows 
WHERE (DATEPART("m",Time_Stamp) = DATEPART("m",#6/1/2016#)) 
      AND (DATEPART("yyyy",Time_Stamp) = DATEPART("yyyy",#6/1/2016#)) 
ORDER BY Time_Stamp

要在 VBA 中执行此操作(如果您不知道,但我猜您知道),只需在每次调用 DATEPART 函数时将引号加倍...

例如:

mySQLCall = mySQLCall & "AND (DATEPART(""yyyy"",Time_Stamp)...."

为了完整起见,运行时错误“3008”实际上是第一个错误......Access 不会尝试运行任何 SQL,直到它可以确定它具有适当的权限。

【讨论】:

同样的事情 DATEPART("m" 在 SQL 的早期部分(你在你的例子中得到) 是的,我应该更清楚地知道两者都需要这样做。编辑澄清。 我会因为发现这一点而停滞不前!谢谢!成功了。

以上是关于VBA DAO.OpenRecordSet 不一致的错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试将字符串从 MS Word 复制/粘贴到 MS Excel 时,Excel VBA 代码失败不一致

Excel VBA 自动化错误:调用的对象已与其客户端断开连接——不一致的错误

两个数据表如何VBA实现比对?

如何在“找不到文件”错误后增加 VBA 错误输出以诊断一致崩溃

求VBA代码(CSV文件内容导入excel)

VBA 导入 MS Access 到 MS Word