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