4

我有以下两行代码:

On Error Resume Next
myWorkbook.Sheets("x").Columns("D:T").AutoFit

我已经进入宏并执行了该行On Error Resume Next,然后在下一行myWorkbook...执行以下操作:

在此处输入图像描述

为什么编译器不恢复下一行代码?

On Error已在整个程序代码中大量使用;我意识到最好的做法是尽可能少地使用它,但它似乎符合这个宏的目的。

阅读此SO QUESTION它说您不能在另一组中设置一组错误捕获。我如何保证在代码继续运行之前已经“关闭”了一组错误捕获 - 是否On Error Goto 0重置错误捕获?如果它确实重置了,那么为什么不恢复以下工作?:

Sub GetAction()
Dim WB As Workbook
Set WB = ThisWorkbook

On Error GoTo endbit:
'raise an error
Err.Raise 69
Exit Sub
endbit:
On Error GoTo 0

On Error Resume Next
WB.Sheets("x").Columns("D:T").AutoFit

End Sub
4

6 回答 6

11

还有一个 VBA 设置将导致On Error ...语句被忽略并且该对话框始终出现。有关检查/更改选项的更多详细信息,请参阅此答案:https ://stackoverflow.com/a/3440789/381588

于 2013-03-17T10:55:17.957 回答
3

初始错误未关闭时的错误示例。

Sub GetAction()
Dim WB As Workbook
Set WB = ThisWorkbook
On Error GoTo endbit:
'raise an error
Err.Raise 69
Exit Sub
endbit:
On Error Resume Next
WB.Sheets("x").Columns("D:T").AutoFit
End Sub
于 2013-03-17T10:33:52.627 回答
1

正如您所发现的,在同一个函数或子例程中,如果它仍然处于活动状态,On Error Resume Next则不会覆盖。On Error Goto ...

您是正确的,它On Error Goto 0恢复了默认的错误处理程序。

在某些情况下,On Error是处理异常情况的最合适方法。我更喜欢使用以下结构:

On Error Resume Next

statement which might fail

On Error Goto 0

if statement has failed then ...

这将所有内容保持在一起,但在其他情况下,在过程结束时使用通用错误处理程序可能会更好。

于 2013-03-17T10:48:12.883 回答
1

我发现在迭代嵌套对象的函数/子程序中,错误处理可能是 VBA 中的拖累。一个对我来说可以更好地处理复杂迭代的解决方案是将对象的设置分离到它们自己的函数中,例如

主函数/子函数:设置 FSOfolder = SetFSOFolder(FSOobject, strFolder)

Private Function SetFSOFolder(FSO as scripting.FileSystemObject, strFolder as string) as Scripting.Folder
    on error resume Next
    set SetFSOFolder = FSO.GetFolder(strFolder)
    on error goto 0
End Function

然后在主函数的下一行:

if (not fsofolder is nothing) then
于 2016-06-02T13:06:10.573 回答
1

我同意使用 On Error Resume Next 不是最佳实践,但我的大多数/许多 Access 应用程序对数据完整性中的细微差别(即分析或报告,而不是交易和未经审计)并不过分敏感。出于这个原因,我经常使用 OERN,因为 VBA 对某些您无法完全预料到的情况非常敏感。1 - 错误是否会导致数据损坏。如果是,处理它。我使用的许多例程只是处理大量记录,并且导入的数据中可能存在尚未修复的错误。通常我有很多转换过程可以让系统最终清理自己的数据。

2 - 是错误频繁且非关键(即不是关键)。如果是,则为 OERN,否则错误可能无法预测,您最终会崩溃或必须编写一堆 ITE 或 Select Case 逻辑来捕获它。

于 2018-01-24T20:24:15.640 回答
-4

不要On Error Resume Next改用编写不应崩溃的代码。

注意:我很小心我的措辞,因为你从不保证代码不会崩溃。但是如果你使用On Error Resume Next,那么你的代码自然流的一部分就是让它崩溃,这是错误的,大错特错。

于 2013-03-20T18:15:43.517 回答