从访问表中获取查询的名称,然后运行查询

时间:2015-09-29 22:57:09

标签: access-vba

我有一个访问数据库,可以从异常表中提取卷。每个卷都有一个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,因此非常感谢您提供的任何帮助。

3 个答案:

答案 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函数。您无法获得太多控制或真正的错误处理能力。

这是一个完整的代码函数

  1. 为您提供一个示例,说明如何从表中选择列出查询的所有或部分记录,包括仅选择“活动”记录的功能,甚至可以按特定执行顺序对它们进行排序
  2. 处理表中查询名称不存在的实例
  3. 允许您显示有关发生的任何错误的消息
  4. 允许您将退出代码返回给调用过程,以便您可以对运行这些查询的结果采取行动(例如,如果此函数遇到任何类型的错误,则选择不在代码中执行下一步(返回非零值)
  5. 这是代码。您将需要修改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