dポイントプレゼントキャンペーン実施中!

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

   Do
   On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
   On Error GoTo 0
   Loop

ErrorTrap2:

End Sub

しかし、以下のようにSubで二つに分けるとエラーは出ません。

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

On Error GoTo 0

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error GoTo ErrorTrap2
      '-エラーの発生するコード 2
    On Error GoTo 0
    Loop

  ErrorTrap2:

End Sub

「On Error GoTo 0」がうまく解除できていないのかと思い、いろいろ試してみました。
しかし、どういった理由かはわかりませんでした。
「On Error GoTo」は、Subでは、ひとつしか使えないのでしょうか。

A 回答 (2件)

エラー処理の中でOn Error GoToを記述することはできません。




エラー処理の基本的な構造は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Exit Sub

ErrorTrap1:
  'エラー処理
  Resume Next

End Sub


エラー処理が2つある場合は、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1
On Error GoTo 0

Do
  On Error GoTo ErrorTrap2
    '-エラーの発生するコード 2
  On Error GoTo 0
Loop

Exit Sub

ErrorTrap1:
  'エラー処理1
  Resume Next

ErrorTrap2:
  'エラー処理2
  Resume Next

End Sub


Resume Next でエラーが発生した行の次の行から再開します。
Resumeには他の構文もありますので、調べてみてください。
    • good
    • 0
この回答へのお礼

Resumeの説明までいただき、ありがとうございました。

お礼日時:2012/12/20 16:07

>「On Error GoTo」は、Subでは、ひとつしか使えないのでしょうか。



違います。

On Error Goto で飛んだあとの、エラー処理ルーチンでは、ResumeするかExit Subするまでの間、On Error文は一切無視されます。

そして、エラー処理中は、すべてのエラーがシステムによりトラップされ、On Error Goto 0を行ったのと同様に、システムによるエラー表示が行われます。

なお、エラートラップは「関数ごと」に処理される為、エラートラップ中に関数を呼ぶと、呼ばれた関数の中にあるOn Error文は正常に機能します。

従って、質問者さんが書いたプログラムは、

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

   Do
      '-エラーの発生するコード 2 ←ここのエラーはシステムが通常のエラー表示を行う。
   Loop

ErrorTrap2:

End Sub

と同等です。2つに分けた場合も

Sub Macro1()

On Error GoTo ErrorTrap1
    '-エラーの発生するコード 1

ErrorTrap1:

Call Macro2

End Sub
Sub Macro2()

    Do
     On Error GoTo ErrorTrap2  ←このOn Error Gotoは、Macro1とは無関係なので、正常に機能する
      '-エラーの発生するコード 2
    On Error GoTo 0
    Loop

  ErrorTrap2:

End Sub

と同等です。
    • good
    • 0
この回答へのお礼

勉強になりました。
ありがとうございます。

お礼日時:2012/12/20 16:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!