VBA中的On Error GOTO语句

3
我有一段代码,使用Ctrl+F命令在Excel表格中查找特定值,但当代码没有找到任何内容时,我希望它能抛出一个消息。
    sub test()
    f=5
    do until cells(f,1).value=""    
    On Error goto hello  
        Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _
                    lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                    MatchCase:=False, SearchFormat:=False).Activate

f=f+1

        hello: Msgbox"There is an error"

    loop

    endsub

问题在于,即使没有发现错误,仍然会显示消息。我希望只有在出现错误时才显示消息框。

使用Err.Number,例子:If Err.Number <> 0 then Msgbox"There is an error" - Daniel Dušek
好的,如果我有多个这样的条件,VB如何知道哪个err.number属于哪个条件? - Anarach
Err 对象包含有关运行时错误的信息。当出现错误时,Err 对象的属性将被填充。因此,Err 对象不属于任何条件,它只是通知是否发生了错误。也请参阅 Err.Clear - Daniel Dušek
2个回答

8

对于这种情况,您应该使用Exit SubExit Function,并让您的hello标签位于代码的最后一部分。请参见示例:

Sub test()

    f = 5

    On Error GoTo message

check:
    Do Until Cells(f, 1).Value = ""

        Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _
              lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
              MatchCase:=False, SearchFormat:=False).Activate
    Loop

    Exit Sub

message:
    MsgBox "There is an error"
    f = f + 1
    GoTo check

End Sub

我不希望代码在出现错误后就结束,我希望它能够继续执行。 - Anarach
我已经更新了问题,我不想从do until循环中退出。 - Anarach
不,当发现错误时,它会显示错误并停止进程。如果没有错误,消息就不会出现。 - R.Katnaan
如何做到这一点?在消息后面编写另一个goto语句,以返回循环中?它会这样工作吗?它会继续执行。 - Anarach
“End Sub”是一个语法元素,它表示“Sub”定义的结束。“Exit Sub”是一条语句,它会导致控制权离开当前的“Sub”。 - Paul Ogilvie
显示剩余4条评论

4
hello: Msgbox"There is an error"之前,您需要加上exit sub(如果这是一个子程序)或exit function(如果这是一个函数),否则它下面的代码将总是被执行。参考此帖子-如何自动停止VBA宏?
代码示例-
on error goto bad
    call foo
    exit sub
bad:
    msgbox "bad"
    'clean up code here
exit sub

public sub foo
    msgbox 1/0  'could also trigger the error handling code by doing err.raise, to use user defined errors
end sub

更新:

要修复您的循环,您应该将错误处理代码移到循环外面,但仍然保留exit sub在其前面,以防止它被执行。

sub test()
f=5

do until cells(f,1).value=""    

On Error goto hello  

    Cells.Find(what:=refnumber, After:=ActiveCell, LookIn:=xlFormulas, _
                lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                MatchCase:=False, SearchFormat:=False).Activate


loop

exit sub

hello: 
    Msgbox"There is an error"

endsub

我已更新问题,我不想从 do until 循环中退出。 - Anarach
我理解当发现错误时会跳出循环,但我希望它能重新进入循环。这是否可能? - Anarach
@Anarach,你需要一个单独的goto语句(在错误处理代码中),它将把你带回循环中(当然,在之前要进行条件测试)。 - John Smith
如何做到这一点?在“message”后面编写另一个goto语句以返回循环?那样行得通吗?它会继续执行。 - Anarach
我认为这样做是一种混乱的做法,我建议重新思考你正在设计的任何东西,因为你似乎经常期望出现错误。 - John Smith
尼古拉斯比我先回答了,但如果您想让错误代码重新进入循环,那就是它的样子。是的,如果发生错误,它会类似于“continue”-虽然我建议不要使用这种策略来处理错误(它将捕获所有错误,超出您预期的特定错误),除非您无法重新设计以最小化错误的发生。 - John Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接