退出调用了不同过程的过程 VBA Excel

Exiting procedure that has called a different procedure VBA Excel

我有一个程序可以为我做一些错误检查,并且是从另一个程序调用的。我希望能够做的是,如果输入了不正确的数据并且错误检查程序发现了这一点,那么我想停止调用错误检查程序的程序。即如果错误检查程序是

sub errorCheck

主要程序是

sub main

并且主要调用错误检查。当发现错误时,我希望 sub errorCheck 停止 main。我曾尝试使用 exit sub 但这只会退出 errorCheck sub 而不是 main

非常感谢帮助

将其设为 returns 布尔值的函数。检查调用过程main中的值是否为False,然后在主过程中执行Exit Sub。

有点麻烦的方法:只需键入 End 而不是 Exit Sub。但是,这确实会完全停止代码的执行。

像这样:

Function errorcheck() As Boolean
' in this case it is always false of course
    errorcheck = False
End Function

Sub main()
    If Not errorcheck Then
        Exit Sub
    End If
End Sub

您可以使用全局对象 Err 来完成此任务。

看下面的例子:

Sub main()

    '(...)

    On Error Resume Next
    Call errorChecking
    If VBA.Err.Number = 999 Then
        Exit Sub
    End If
    On Error GoTo 0

    '(...)

End Sub

Sub errorChecking()

    If Error Then
        Call VBA.Err.Raise(999, "errorChecking", "Error found")
        Exit Sub
    End If

End Sub

在我们调用函数 errorChecking 之前,我们指示 VBA 如果发生任何错误它不应该停止 - 它应该忽略它并转到下一行代码。

errorChecking 函数中有一个条件语句来检查是否发生错误。 如果发生错误,此函数会使用您定义的数字引发新错误(在我的示例中为 999,您可以提供自己的数字)。

回到 Main 函数,我们检查 VBA.Err 对象的当前数量是否为 999。如果是,则意味着错误是由函数 errorChecking 引发的,我们可以离开 Main sub.

这是一个基于 Tom 的 回答的简单示例:

Sub MAIN()
    Dim rng As Range, CellIsNogood As Boolean
    Set rng = Application.InputBox(Prompt:="Enter range", Type:=8)
    Call ErrorCheck(rng, CellIsNogood)
    If CellIsNogood Then
        MsgBox "error in range"
    End If
End Sub

Sub ErrorCheck(r As Range, b As Boolean)
    Dim rr As Range
    b = False
    For Each rr In r
        If IsError(rr.Value) Then
            b = True
        End If
    Next rr
End Sub

在看到 Tom 和 Tom 所说的内容后,我做了一些研究并得到了这个工作。下面是我使用的代码。感谢其他答案:)

Private Function errorCheckingBox(box1, message) As Boolean
If Len(box1.value) = 0 Then
    MsgBox message, vbExclamation, "Invalid Selection" ' displays a messgae box
    box1.SetFocus
    errorCheckingBox = True
End If
End Function