首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel VBA: On Error Goto语句在For-Loop中不起作用

Excel VBA: On Error Goto语句在For-Loop中不起作用
EN

Stack Overflow用户
提问于 2012-08-17 09:52:20
回答 4查看 75.3K关注 0票数 20

我正试着在excel中循环浏览表格。此表的前三列具有文本标题,其余列以日期作为标题。我希望将这些日期按顺序分配给一个date类型的变量,然后根据该date执行一些操作

为此,我在myTable.ListColumns上使用了一个foreach循环。由于前三列没有日期标头,因此我尝试设置循环,以便如果将标头字符串分配给日期类型变量时出现错误,循环将直接转到下一列

这似乎适用于第一列。但是,当第二列的标头被‘赋值’给date类型的变量时,即使宏在错误处理块中,它也会遇到错误

代码语言:javascript
复制
Dim myCol As ListColumn
For Each myCol In myTable.ListColumns
    On Error GoTo NextCol

    Dim myDate As Date
    myDate = CDate(myCol.Name)

    On Error GoTo 0

    'MORE CODE HERE

NextCol:
    On Error GoTo 0
Next myCol

再次重申,错误在循环的第二轮抛出,在语句中

代码语言:javascript
复制
myDate = CDate(myCol.Name)

有人能解释一下On Error语句为什么停止工作吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-17 10:19:08

使用如图所示的代码,当您执行next语句时,实际上仍被视为处于错误处理例程中。

这意味着在从当前错误处理程序恢复之前,不允许使用后续的错误处理程序。

更好的架构应该是:

代码语言:javascript
复制
    Dim myCol As ListColumn
    For Each myCol In myTable.ListColumns
        On Error GoTo ErrCol
        Dim myDate As Date
        myDate = CDate(myCol.Name)
        On Error GoTo 0
        ' MORE CODE HERE '
NextCol:
    Next myCol
    Exit Sub ' or something '

ErrCol:
    Resume NextCol

这清楚地将错误处理与常规代码区分开来,并确保当前正在执行的错误处理程序在您尝试设置另一个处理程序之前完成。

This site对这个问题有很好的描述:

错误处理块和On Error Goto

错误处理块,也称为错误处理程序,是通过On Error Goto <label>:语句将执行转移到的一段代码。此代码应设计为修复问题并在主代码块中恢复执行,或者终止过程的执行。您不能只跳过行而使用On Error Goto <label>:语句。例如,以下代码将无法正常工作:

代码语言:javascript
复制
    On Error GoTo Err1:
    Debug.Print 1 / 0
    ' more code
Err1:
    On Error GoTo Err2:
    Debug.Print 1 / 0
    ' more code
Err2:

当引发第一个错误时,执行转移到Err1:后面的行。当第二个错误发生时,错误处理程序仍处于活动状态,因此第二个错误不会被On Error语句捕获。

票数 43
EN

Stack Overflow用户

发布于 2012-08-17 10:18:41

您需要在错误处理代码中添加某种类型的resume,以指示错误处理已结束。否则,第一个错误处理程序仍处于活动状态,您永远不会被“解决”。

参见http://www.cpearson.com/excel/errorhandling.htm (特别是标题“错误处理块和On Error Goto”及后续部分)

票数 8
EN

Stack Overflow用户

发布于 2015-07-21 23:48:10

对paxdiablo公认的答案的后续行动。这是可能的,允许在同一个子中一个接一个地捕获两个错误陷阱:

代码语言:javascript
复制
Public Sub test()
    On Error GoTo Err1:
    Debug.Print 1 / 0
    ' more code
Err1:
    On Error GoTo -1     ' clears the active error handler
    On Error GoTo Err2:  ' .. so we can set up another
    Debug.Print 1 / 0
    ' more code
Err2:
    MsgBox "Got here safely"
End Sub

使用On Error GoTo -1会取消活动的错误处理程序,并允许设置另一个错误处理程序(而err.clear不会这样做!)。这是不是一个好主意留给读者作为练习,但它是有效的!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11998836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档