【发布时间】:2018-01-09 16:41:19
【问题描述】:
我有一个宏,部分代码涉及: 1)检测一列是否包含空单元格 - 如果是这样,用一些值填充它们 2) 检测列是否包含包含错误的单元格(例如 N/A),如果是,则用一些值填充它们
现在如果列中没有错误/空单元格,找到它们的行会给出“运行时错误 1004 未找到单元格”。
我使用错误处理来跳过 GoTo。
下面是代码 - 第一个错误处理 GoTo 完美运行,而第二个给出了预期的错误,虽然设置了错误处理 GoTo,但这似乎不起作用。带有 cmets 的代码:
On Error GoTo EErrorOne
'depending on file I get, below line will generate error and code successfully skips to ErrorOne label
Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).SpecialCells (xlCellTypeBlanks)
' code to be skipped
Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).Select
Selection.SpecialCells(xlCellTypeBlanks).Select
Selection.Value = "Some Value"
' end of code to be skipped
EErrorOne:
' successfully skipped error line by now. Below line should set a new Error handling procedure.
On Error GoTo EErrorTwo
Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).Select
' Below line generates an error but does not skip to EErrorTwo label as detailed in the current Error handling procedure
Selection.SpecialCells(xlCellTypeFormulas, 16).Select
' code to be skipped
Selection.SpecialCells(xlCellTypeFormulas, 16).Select
Selection.Value = "Some Value"
' end of code to be skipped
EErrorTwo:
' Below line should reset error handling procedure to normal for subsequent handling of other errors:
On Error GoTo 0
似乎忽略了错误处理过程(GoTo 特定标签),而是显示一条错误消息,好像错误处理已重置为 GoTo 0。如何跳过第二个错误?
【问题讨论】:
-
最好创建不依赖错误处理程序来运行的代码。而是检查导致错误的条件并跳过您知道会导致错误的代码。
-
你的代码做的事情太多了。每个过程一个处理程序。处理错误时无法处理新错误,需要先处理第一个错误。
On Error在错误处理程序中毫无用处,您已经处于错误状态,您希望发生什么? FWIW 这将很快成为Rubberduck 检查。 -
braX,我尝试将相关单元格分配给一个范围,然后设置如果不是 rangename 什么都没有,但它仍然评估为错误消息。 Mat's Mug,我不是这方面的专家,虽然我怀疑我需要在重新开始之前退出错误处理,但我认为 On Error GoTo 0 会重置错误处理 - 结果应该是 On Error GoTo -1,正如我的问题已接受的答案中所指出的那样。无论如何,我没有在我应该有的地方重置错误处理,这是我的问题的解决方案。谢谢大家