我正试着在excel中循环浏览表格。此表的前三列具有文本标题,其余列以日期作为标题。我希望将这些日期按顺序分配给一个date类型的变量,然后根据该date执行一些操作
为此,我在myTable.ListColumns上使用了一个foreach循环。由于前三列没有日期标头,因此我尝试设置循环,以便如果将标头字符串分配给日期类型变量时出现错误,循环将直接转到下一列
这似乎适用于第一列。但是,当第二列的标头被‘赋值’给date类型的变量时,即使宏在错误处理块中,它也会遇到错误
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再次重申,错误在循环的第二轮抛出,在语句中
myDate = CDate(myCol.Name)有人能解释一下On Error语句为什么停止工作吗?
发布于 2012-08-17 10:19:08
使用如图所示的代码,当您执行next语句时,实际上仍被视为处于错误处理例程中。
这意味着在从当前错误处理程序恢复之前,不允许使用后续的错误处理程序。
更好的架构应该是:
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>:语句。例如,以下代码将无法正常工作:
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语句捕获。
发布于 2012-08-17 10:18:41
您需要在错误处理代码中添加某种类型的resume,以指示错误处理已结束。否则,第一个错误处理程序仍处于活动状态,您永远不会被“解决”。
参见http://www.cpearson.com/excel/errorhandling.htm (特别是标题“错误处理块和On Error Goto”及后续部分)
发布于 2015-07-21 23:48:10
对paxdiablo公认的答案的后续行动。这是可能的,允许在同一个子中一个接一个地捕获两个错误陷阱:
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不会这样做!)。这是不是一个好主意留给读者作为练习,但它是有效的!
https://stackoverflow.com/questions/11998836
复制相似问题