访问vba运行时错误91-仅失败一次

访问vba运行时错误91-仅失败一次,vba,ms-access-2010,Vba,Ms Access 2010,问题:是否存在已知的Access/VBA问题,即出现错误91,然后通过调试/F5手动继续运行代码(不更改任何内容),错误不再出现 这是一个大项目,我不确定是什么导致了这个错误。我知道不是一个未设置的变量,因为我只得到一次错误。以下是场景: 复制步骤: 假设一个Access 2010.accdb文件(拆分表单) 我打开应用程序并按下一个按钮,该按钮调用许多函数以实现特定目标。这些函数创建各种类实例,访问数据库(通过DAO记录集和db.executesql更新)。函数序列从一个表中读取数据,并根据一

问题:是否存在已知的Access/VBA问题,即出现错误91,然后通过调试/F5手动继续运行代码(不更改任何内容),错误不再出现

这是一个大项目,我不确定是什么导致了这个错误。我知道不是一个未设置的变量,因为我只得到一次错误。以下是场景:

复制步骤:

  • 假设一个Access 2010.accdb文件(拆分表单)
  • 我打开应用程序并按下一个按钮,该按钮调用许多函数以实现特定目标。这些函数创建各种类实例,访问数据库(通过DAO记录集和db.executesql更新)。函数序列从一个表中读取数据,并根据一些预定义的业务逻辑更新另一个表。假设源表中的数据没有变化,按下按钮将始终导致处理相同的数据和相同的代码序列-我试图确定第一次和后续按下按钮不会以任何方式改变程序流
  • 行为:

  • 在启动应用程序后,我第一次按下按钮时,总是会出现错误91
  • 收到错误后,我进入调试模式(按“调试”按钮)
  • 一旦进入调试模式,我所要做的就是按F5继续运行程序,这样就不会再抛出运行时错误91,操作将顺利完成
  • 任何后续按钮按下都不会出现任何错误
  • 我不确定这是否相关,但以下是调试器执行的代码行及其调用的函数:

    If Not DBUpdate(strSQL, Application.VBE.ActiveCodePane.CodeModule, "DBLocked", "") Then Exit Function
    
    
    Public Function DBUpdate(str_SQL As String, str_Module As String, Optional str_Function As String, Optional str_ErrorDetails As String) As Boolean
        Dim booDBUpdateFail As Boolean
        Dim intFailCount As Integer
        DBUpdate = True 'assume success
        intFailCount = 0
        On Error GoTo DBUpdateError
        Do
            booDBUpdateFail = False
            db.Execute str_SQL, dbFailOnError
        Loop Until booDBUpdateFail = False Or intFailCount = P_DBUpdateRetriesOnFailure
        If intFailCount = P_DBUpdateRetriesOnFailure Then DBUpdate = False  'return failure
        Exit Function
    DBUpdateError:
        intFailCount = intFailCount + 1
        modIO.AppendToDBLog CStr(Now()) & ": " & str_Module & " - ErrorDBExecute - " & str_Function & " - " & str_ErrorDetails & " - TryCount: " & CStr(intFailCount)
        booDBUpdateFail = True
        Wait P_DBUpdateRetryIntervalSeconds * 1000 'wait
        Resume Next
    End Function
    
    注意:上面的DB是由应用程序启动时启动的隐藏表单的加载事件实例化的公共对象。初始化子节点:

    Public Sub InitPublic()
        If db Is Nothing Then Set db = CurrentDb() 'Open connection to current Access database
        If UserPerm Is Nothing Then Set UserPerm = New clsUserPerm
        If wfstatus Is Nothing Then Set wfstatus = New clsWFStatus
        If Log Is Nothing Then Set Log = New clsLog
        If PurchaseLevels Is Nothing Then Set PurchaseLevels = New clsPurchasingLevels
        If objPrintTemplate Is Nothing Then Set objPrintTemplate = New clsPrintTemplate
        If objPrintReport Is Nothing Then Set objPrintReport = New clsPrintTemplate
    End Sub
    

    在您第一次按下按钮之前,VBE是否已打开?因为您正试图访问
    Application.VBE.ActiveCodePane.CodeModule
    ,如果VBE未打开,则该文件可能不存在(并且一旦处于调试模式,VBE将打开,因此F5和后续调用将正常工作)。嗨,Vincent,感谢您指出这一点。的确是VBE。现在觉得自己很愚蠢……:)您知道在运行时(不打开VBE)获取当前模块(理想情况下是函数/子名称)的方法吗?我需要它以静默方式记录错误,并且不希望每次都键入模块和函数名。在您第一次按下按钮之前,VBE是否已打开?因为您正试图访问
    Application.VBE.ActiveCodePane.CodeModule
    ,如果VBE未打开,则该文件可能不存在(并且一旦处于调试模式,VBE将打开,因此F5和后续调用将正常工作)。嗨,Vincent,感谢您指出这一点。的确是VBE。现在觉得自己很愚蠢……:)您知道在运行时(不打开VBE)获取当前模块(理想情况下是函数/子名称)的方法吗?我需要它以静默方式记录错误,并且不希望每次都键入模块和函数名。