BACK
2010-04-05

[VBA]On Error gotoのスコープ?

「プロシージャ内のOn Error宣言は内部でのみ有効」みたいな記事を見て、
それってどういうことなのか実際に試してみた。

以下のプログラムで、存在しない\\test\a.txtを開いたときのエラー処理を見てみた。
呼び出しはtestMain

Sub testMain()
On Error GoTo aaa:
testSub
Dir "\\test\a.txt"
Exit Sub
aaa:
MsgBox "aaa"
End Sub

Sub testSub()
On Error GoTo bbb:
Dir "\\test\a.txt"
Exit Sub
bbb:
MsgBox "bbb"
End Sub

原文ままの場合:「bbb」->「aaa」
testSubのOn Errorをコメントアウト:「aaa」
testMainのOn Errorをコメントアウト:「bbb」->例外エラー発生

この結果から判断すると、
1.親で宣言したOn Errorは子でも有効。
2.ただし子で宣言している場合は子のものが優先される。
3.子のOn Errorは親では無効。

子のエラー処理が親に影響しないのはまっとうな仕様だ。
Basicだからもしかしてインタプリタ的に上書きされるのかと思ってたけど
そうではなかったっぽい。
(同様の理由で、子から親に戻る際にOn Error goto 0する必要はない)

BACK