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

时间:2017-01-19 07:37:11

标签: vba ms-access-2010

问题:是否存在已知的Access / VBA问题,其中一个获得错误91然后一旦手动继续通过Debug / F5运行代码(不更改任何内容),错误不再出现?

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

重现的步骤:

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

    1. 首次启动应用程序后按下按钮,我总是得到错误91。
    2. 收到错误后,我进入调试模式(按下' Debug'按钮)
    3. 一旦进入调试模式,我所要做的就是按F5继续运行程序,并且不再抛出运行时错误91,并且操作完成没有问题。
    4. 任何后续按钮按下工作都没有任何错误。
    5. 我不确定这是否相关,但这是调试器带我的代码行,以及它调用的函数:

      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是由应用程序启动时启动的隐藏表单的On Load事件实例化的公共对象。初始化子:

      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
      

0 个答案:

没有答案