我有一个访问数据库,可以从异常表中提取卷。每个卷都有一个ID。我已创建查询以提取所有可能卷的详细信息,并使用与每个卷ID相同的名称保存每个查询。每次将卷异常拉入此数据库时,卷ID都可以更改。因此,运行的查询会使用新ID更新卷表。
除非您知道使用查询执行此操作的方法,否则我需要编写将循环访问卷表的Access VBA代码,标识每个查询的名称,然后运行这些查询,直到它到达表的末尾。例如,代码需要查看卷表中的第一条记录,比如它是1040.这是需要运行的查询的名称。然后代码需要找到名为1040的查询并运行它。这是一个make table查询。
表名是FacilityVolume,它有一个名为Volume的字段。字段中的值是短文格式,即使它是数字。
我尝试了几件不同的事情。这是我最近的尝试。
Dim db as Database
Dim vol as Recordset
Dim code as QueryDef
Set db = CurrentDb()
Set vol = db.OpenRecordset("FacilityVolume")
Set Volume = vol.Fields("Volume")
Vol.MoveFirst
Do Until vol.EOF = True
If QueryDef.Name = Volume Then
DoCmd.OpenQuery
Else MsgBox("The query does not exist")
vol.MoveNext
Loop
End Sub
我已经在互联网上搜索了几天,无法找到对此特定代码的任何引用。我确定其他用户想知道如何做到这一点。我是一名新手,仍在学习VBA,因此非常感谢您提供的任何帮助。
答案 0 :(得分:1)
即使您找到了查询并且未将Query-Name传递给OpenQuery命令,您的代码也会循环播放...这不起作用...
集合CurrentDb.QueryDefs
知道所有现有查询,但没有“存在”或“包含”方法。
所以:这种方法将是一个循环(当你尝试它时)或错误处理。
自从我用VBA编码以来,很久以前了,但我想你可以试试:
On Error Resume Next
DoCmd.OpenQuery "YourQueryName"
If Err Then
MsgBox("The query does not exist!")
Err.Clear
End If
On Error Goto 0
答案 1 :(得分:1)
@Shnugo的答案已经很好了。只是为了给你一个完整的VBA功能,这应该适合你。
Public Sub MySub()
On Error GoTo err_mySub
Dim db as Database
Dim vol as Recordset
Set db = CurrentDb()
Set vol = db.OpenRecordset("FacilityVolume", dbOpenDynaset) ' I don't know if you want to run all queries of the table "FacilityVolume".
'So maybe you could also use something like "SELECT Volume FROM FacilityVolume WHERE Volume LIKE ""*10*"""
Vol.MoveFirst
Do Until vol.EOF = True
DoCmd.OpenQuery vol!Volume
vol.MoveNext
Loop
exit_MySub:
Exit Sub
err_MySub:
If Err.Number = 7874 Then
MsgBox "The Query """ & Vol!Volume & """ wasn't found."
Resume Next
Else
MsgBox Err.Description
Resume exit_MySub
End If
End Sub
答案 2 :(得分:1)
我建议在VBA中使用完整的DAO来实现目标。 DoCmd.OpenQuery
实际上是一个模仿宏RunQuery
操作的VBA函数。您无法获得太多控制或真正的错误处理能力。
这是一个完整的代码函数
这是代码。您将需要修改SQL语句以获取正确的表名和字段名,但这应该是一个很好的例子,可以帮助您顺利完成。
Public Function lsProcessQuerySet() As Long
On Error GoTo Err_PROC
Dim ErrMsg As String
Dim db As DAO.Database
Dim rstEdits As DAO.Recordset
Dim qdf As DAO.QueryDef
Dim mssql As String
Dim ReturnCode As Long
Set db = CurrentDb()
'============================
'Select the list of Queries you want to process
'============================
mssql = "SELECT tblQueryList.ID, tblQueryList.QueryName, "
mssql = mssql & "tblQueryList.QueryShortDesc "
mssql = mssql & "FROM tblQueryList "
mssql = mssql & "WHERE tblQueryList.QueryActive = True "
mssql = mssql & "ORDER BY tblQueryList.SortOrder;"
Set rstEdits = db.OpenRecordset(mssql, dbOpenDynaset)
DoCmd.Hourglass True
'============================
'Execute each query, allowing processing to continue
'if the query does not exist (an error occurs)
'============================
Do While Not rstEdits.EOF
Set qdf = db.QueryDefs(rstEdits("QueryName"))
qdf.Execute dbSeeChanges
ResumeNextEdit:
rstEdits.MoveNext
Loop
rstEdits.Close
Exit_PROC:
lsProcessQuerySet = ReturnCode
Set qdf = Nothing
Set rstEdits = Nothing
db.Close
Set db = Nothing
DoCmd.Hourglass False
Exit Function
Err_PROC:
Select Case Err.Number
Case 3265 'Item Not Found in this Collection
ReturnCode = Err.Number
ErrMsg = "Query Not Found:" & vbCrLf & vbCrLf
ErrMsg = ErrMsg & rstEdits("QueryName")
DoCmd.Hourglass False
MsgBox ErrMsg, vbOKOnly + vbCritical, "Function lsProcessQuerySet"
Resume ResumeNextEdit
Case Else
ReturnCode = Err.Number
ErrMsg = "Error: " & Err.Number & vbCrLf
ErrMsg = ErrMsg & Err.Description
DoCmd.Hourglass False
MsgBox ErrMsg, vbOKOnly + vbCritical, "Function lsProcessQuerySet"
Resume Exit_PROC
End Select
End Function