【发布时间】:2012-04-13 07:32:34
【问题描述】:
如何在 VBA 中的 MS Access 2007 中执行保存的查询?
我不想将 SQL 复制并粘贴到 VBA 中。我宁愿只执行查询的名称。
这不起作用...VBA 找不到查询。
CurrentDb.Execute queryname
【问题讨论】:
如何在 VBA 中的 MS Access 2007 中执行保存的查询?
我不想将 SQL 复制并粘贴到 VBA 中。我宁愿只执行查询的名称。
这不起作用...VBA 找不到查询。
CurrentDb.Execute queryname
【问题讨论】:
你可以这样做:
DoCmd.OpenQuery "yourQueryName", acViewNormal, acEdit
或
CurrentDb.OpenRecordset("yourQueryName")
【讨论】:
您应该调查为什么 VBA 找不到 queryname。
我有一个名为 qryAddLoginfoRow 的已保存查询。它将当前时间的一行插入我的 loginfo 表中。当CurrentDb.Execute 按名称调用时,该查询成功运行。
CurrentDb.Execute "qryAddLoginfoRow"
我的猜测是 queryname 是一个变量,其中包含当前数据库的 QueryDefs 集合中不存在的查询名称,或者 queryname 是文字名称现有查询,但您没有将其括在引号中。
编辑:
您需要找到一种方法来接受当前数据库的 QueryDefs 集合中不存在 queryname。将这两行添加到您的 VBA 代码中,就在 CurrentDb.Execute 行之前。
Debug.Print "queryname = '" & queryname & "'"
Debug.Print CurrentDb.QueryDefs(queryname).Name
这两行中的第二行将触发运行时错误 3265,“Item not found in this collection.”然后转到“立即”窗口以验证您要询问的查询的名称CurrentDb 到 Execute。
【讨论】:
要使用 CurrentDb.Execute,您的查询必须是一个操作查询,并用引号括起来。
CurrentDb.Execute "queryname"
【讨论】:
在 MS Access VBA 中运行 Action Query 有两种方法:
DoCmd.OpenQuery 语句。这使您可以控制这些警告:但是!请记住,即使在函数完成后,DoCmd.SetWarnings 仍将保持设置状态。这意味着您需要确保将其置于适合您需要的状态
Function RunActionQuery(QueryName As String)
On Error GoTo Hell 'Set Error Hanlder
DoCmd.SetWarnings True 'Turn On Warnings
DoCmd.OpenQuery QueryName 'Execute Action Query
DoCmd.SetWarnings False 'Turn On Warnings
Exit Function
Hell:
If Err.Number = 2501 Then 'If Query Was Canceled
MsgBox Err.Description, vbInformation
Else 'Everything else
MsgBox Err.Description, vbCritical
End If
End Function
CurrentDb.Execute 方法。这允许您保持操作查询失败
控制下。 SetWarnings 标志不影响它。查询总是在没有警告的情况下执行。Function RunActionQuery()
'To Catch the Query Error use dbFailOnError option
On Error GoTo Hell
CurrentDb.Execute "Query1", dbFailOnError
Exit Function
Hell:
Debug.Print Err.Description
End Function
值得注意的是,dbFailOnError 选项仅响应数据处理失败。如果 Query 包含错误(例如拼写错误),则会生成运行时错误,即使未指定此选项也是如此
另外,如果查询时间较长,您可以使用DoCmd.Hourglass True 和DoCmd.Hourglass False 来控制鼠标指针
【讨论】: