Scope of 'On Error Resume Next'?

M

Matt Jensen

What is the 'scope' of On Error Resume Next?
Is it for a sub, for the next line after the statement only, for a module,
or for a workbook/project?
If more than one of these, how does one specify the different ones?
Thanks
Matt
 
S

Sharad Naik

The scope is the for that Sub.
After exiting the sub it is - say - reset.
As to specify different ones within the sub,
you can do On Error GoTo 0

'0' is not a label, it is just used to reset the Resume.

Thus if

On Error Resume Next
'line one of code
'line two of code
On Error GoTo 0

The resume next part will work only for the lines between Resume Next and
GoTo 0, After the GoTo 0 .

You can again use Resume Next "after the GoTo 0" on
any further down lines. (and use again GoTo 0)

Sharad
 
B

Bob Phillips

Matt,

Try this code

Sub test()
testa
testb
End Sub

Sub testa()
Dim rng As Range
On Error Resume Next
rng = Range("A1")
End Sub

Sub testb()
Dim rng As Range
rng = Range("A1")
End Sub

What exactly do you mean by the secnd part?

--

HTH

RP
(remove nothere from the email address if mailing direct)
 
M

Matt Jensen

Thanks Bob
So it's applicable to a procedure only then.
Cool, that answers the second part then thanks
Matt
 
J

Jake Marx

Hi Matt,

Matt said:
What is the 'scope' of On Error Resume Next?
Is it for a sub, for the next line after the statement only, for a
module, or for a workbook/project?
If more than one of these, how does one specify the different ones?
Thanks
Matt

There is one more thing worth mentioning here. Yes, error handling set in a
routine will be reset when that routine has finished executing. However,
any procedures called *by that routine* that do not have their own error
handling will inherit the error handling of the calling routine. This can
cause unexpected results if you aren't prepared for it.

For example:

Sub Demo()
On Error Resume Next

SubA
SubB

On Error Goto 0
End Sub

Sub SubA()
Dim rng As Range

rng = Range("A1")
End Sub

Sub SubB()
Dim l As Long

l = CLng("ABC")
End Sub


Even though runtime errors are generated by both SubA and SubB, no error
message will be displayed. That is because error handling rolls "uphill" -
since SubA has no error handling, the error is raised back up the call stack
to the Demo subroutine, which then handles the error by Resume Next and
continues on to call SubB. Since SubB has no error handling defined, the
same thing happens when it encounters a runtime error. This behavior
extends all the way through the call stack, so if you have SubA that calls
SubB, which in turn calls SubC, and SubB and SubC have no error handling
defined, the error handler in SubA would catch any errors from SubA, SubB,
or SubC.

Just thought I'd mention this behavior in case you weren't aware of it.

--
Regards,

Jake Marx
MS MVP - Excel
www.longhead.com

[please keep replies in the newsgroup - email address unmonitored]
 
T

Tom Ogilvy

An error handler handles errors in subordinate routine if they don't have
their own error handler. When the error is encounterd, the subordinate
routine exits up to the next routine with an error handler. that is why the
last msgbox in each subordinate routine is not executed:

Sub test()
On Error Resume Next
MsgBox "test Before A err:" & Err.Number
testa
MsgBox "test After A err:" & Err.Number
testb
MsgBox "ending err:" & Err.Number
End Sub

Sub testa()
Dim rng As Range
MsgBox "In TextA Line1 err: " & Err.Number
Err.Raise 5000
MsgBox "In TestA Last Line err:" & Err.Number
End Sub

Sub testb()
Dim rng As Range
MsgBox "In TextB Line1 err: " & Err.Number
Err.Raise 6000
MsgBox "In Testb Last Line err: " & Err.Number
End Sub
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top