VBA 如何在出错时退出函数?不工作。访问 2007

VBA How to exit function on error? Not working. Access 2007

在 Access 2007 中,我的错误陷阱设置为 出现未处理的错误时中断

我希望代码在发生错误的那一行停止并退出函数,而不是继续到下一行代码。但是它似乎并不适合我。我特意在第 6 行创建了一个错误,看它是否会在该行之后退出该函数,但它只提示错误处理程序消息,并在发生错误后继续恢复到下一行。 这是我的代码:

GoToBackend():

'Go to current linked backend database

Private Function GoToBackend()

On Error GoTo BackendErrorHandler

    'To update BEPath requires two sets of proc.
    'Delete Exisiting
     RunQuery "DeleteBEEPath"   'Here is where I created error by miss spelling it
    'Insert Into
     RunQuery "InsertBEPath"

    'Prompt alert
    MsgBox "Front end tables succesfully linked. Access now needs to run the backend database to complete the linking process. Please ensure macros/vba are enabled if prompted.", 48
    Hyperlink.GoHyperlink (Hyperlink.PrepHyperlink(GetBackendPath))

ExitFunction:
    Exit Function   'Why won't this exit the function? 

BackendErrorHandler:
    Dim Msg As String
    Msg = Err.Number & ": " & Err.Description
    MsgBox Msg
    Resume ExitFunction
End Function     

RunQuery():

'Run a given query name
Private Function RunQuery(qName As String)
On Error GoTo RunQueryErrorHandler
   DoCmd.SetWarnings False
   DoCmd.OpenQuery qName
   DoCmd.SetWarnings True

ExitFunction:
    Exit Function
RunQueryErrorHandler:
    Dim Msg As String
    Msg = Err.Number & ": " & Err.Description
    MsgBox Msg
    Resume ExitFunction
End Function 

错误本身发生在您的 RunQuery 函数中,因此错误在那里得到处理。在那里你说用 Msg = Err.Number & ": " & Err.Description 显示错误消息所以它弹出并且错误被认为是 "Handled" 并且原始函数继续到 运行.

你的线路:

RunQuery "DeleteBEEPath"

不管你的字符串是什么,在它看来你已经正确地提供了一个字符串来传递给函数。一旦它进入实际错误发生的地方的功能。我没有对此进行测试,但我相信如果您关闭第二个函数中的错误处理,那么 GoToBackend 中的错误处理应该按照您希望的方式进行处理。所以你的第二个函数应该是这样的:

Private Function RunQuery(qName As String)
   DoCmd.SetWarnings False
   DoCmd.OpenQuery qName
   DoCmd.SetWarnings True
End Function 

再一次,我还没有真正能够对此进行测试,但这应该会让您走上正确的道路,或者如果周围有更多经验的人,他们可能会提供比我更好的答案。

我还建议将 DoCmd.SetWarnings (True) 放入您的错误处理中,这样如果在您将其设置为 false 后发生错误,它们将重新打开。

编辑:我想我会加入我新概念化的函数。 (未测试)

Public Function RunSQLNoWarnings(strSQLQuery As String) As Boolean
On Error GoTo Err_Handler


    DoCmd.SetWarnings (False)
    DoCmd.RunSQL (strSQLQuery)
    DoCmd.SetWarnings (True)

    RunSQLNoWarnings = True

Exit_Handler:
    Exit Function

Err_Handler:
    DoCmd.SetWarnings (True)
    Call LogError(Err.Number, Err.Description, strMODULE_NAME & ".RunSQLNoWarnings on SQL Query: " & strSQLQuery)
    RunSQLNoWarnings = False
    Resume Exit_Handler
End Function