Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4459 / 13646 ツリー ←次へ | 前へ→

【56521】エラー制御に関して EDE 08/6/19(木) 21:17 質問[未読]
【56522】Re:エラー制御に関して EDE 08/6/19(木) 21:40 発言[未読]
【56526】Re:エラー制御に関して neptune 08/6/19(木) 22:46 発言[未読]
【56527】Re:エラー制御に関して EDE 08/6/19(木) 23:05 お礼[未読]
【56548】Re:エラー制御に関して neptune 08/6/20(金) 12:03 発言[未読]
【56553】Re:エラー制御に関して mizunu 08/6/20(金) 15:06 回答[未読]

【56521】エラー制御に関して
質問  EDE  - 08/6/19(木) 21:17 -

引用なし
パスワード
   On Error GoToの動作についてお教え下さい。
以下のようなコードにおいて、a?="a?"は実行時エラー13を発生し、
a1="a1"はLabal1にジャンプしますが、
a2="a2"はエラーをトラップできず困っております。
Label1の後ろにErr.Clearを挿入してみましたが、
a2="a2"でエラーが発生します。

a2="a2"のエラーをトラップしたい場合、
どこを変更したら良いでしょうか。
説明不足の点が御座いましたらご指摘下さい。

Sub ErrorTest()
  Dim a1 As Long
  Dim a2 As Long
  MsgBox Err
  On Error GoTo Label1
  a1 = "a1"
Label1:
  On Error GoTo Label2
  a2 = "a2"
Label2:
End Sub

【56522】Re:エラー制御に関して
発言  EDE  - 08/6/19(木) 21:40 -

引用なし
パスワード
   補足です。

動作上は、
  On Error GoTo
  a?="a?"
  Labal?:
をそれぞれ別の関数とすれば意図した動作となりますが、
言語仕様を理解したく質問させていただきました。

また、下記のMsgBox Errは無視して下さい。


>On Error GoToの動作についてお教え下さい。
>以下のようなコードにおいて、a?="a?"は実行時エラー13を発生し、
>a1="a1"はLabal1にジャンプしますが、
>a2="a2"はエラーをトラップできず困っております。
>Label1の後ろにErr.Clearを挿入してみましたが、
>a2="a2"でエラーが発生します。
>
>a2="a2"のエラーをトラップしたい場合、
>どこを変更したら良いでしょうか。
>説明不足の点が御座いましたらご指摘下さい。
>
>Sub ErrorTest()
>  Dim a1 As Long
>  Dim a2 As Long
>  MsgBox Err
>  On Error GoTo Label1
>  a1 = "a1"
>Label1:
>  On Error GoTo Label2
>  a2 = "a2"
>Label2:
>End Sub

【56526】Re:エラー制御に関して
発言  neptune  - 08/6/19(木) 22:46 -

引用なし
パスワード
   ▼EDE さん:
こんにちは

VBのエラーハンドラー内(ラベルの下)ではエラー処理は出来ません。
Helpの「On Error ステートメント」
の解説部分に詳しく書いていますので、ご覧下さい。

サンプルで言えば、最初の
on error goto label1
が有効な状態で、label1のルーチンに処理が移ってきています。
そのルーチンの中で発生したエラー処理は出来ないと言う事だと思います。

【56527】Re:エラー制御に関して
お礼  EDE  - 08/6/19(木) 23:05 -

引用なし
パスワード
   ▼neptune さん:

お返事有難う御座います。大変勉強となりました。

連続したエラーが処理できないという誤った認識を持っておりましたが、
正しくはエラー処理ルーチン内なのでOn Errorステートメントが有効ではない、
ということなのですね。

回答にありましたHELPの文章とは、以下でよろしいでしょうか。
読んだつもりになっておりましたが、正しく理解できておりませんでした。

> "使用可能な" エラー処理ルーチンとは、On Error ステートメントによって
> 有効になっている処理ルーチンのことです。"アクティブな" エラー処理
> ルーチンとは、エラー処理中の使用可能な処理ルーチンのことです。
> エラー処理ルーチンがアクティブになっている間
> (エラーの発生と Resume、Exit Sub、Exit Function、
> または Exit Property ステートメントの間) は、
> カレント プロシージャのエラー処理ルーチンはエラーを処理できません。

【56548】Re:エラー制御に関して
発言  neptune  - 08/6/20(金) 12:03 -

引用なし
パスワード
   ▼EDE さん:
こんにちは

>連続したエラーが処理できないという誤った認識を持っておりましたが、
>正しくはエラー処理ルーチン内なのでOn Errorステートメントが有効ではない、
>ということなのですね。
私も、エラー処理ルーチンではエラー処理が出来ないとしか覚えてなかったので
改めてHelpをみて勉強になりました。

はい、これです。
>> "使用可能な" エラー処理ルーチンとは、On Error ステートメントによって
>> 有効になっている処理ルーチンのことです。"アクティブな" エラー処理
>> ルーチンとは、エラー処理中の使用可能な処理ルーチンのことです。
>> エラー処理ルーチンがアクティブになっている間
>> (エラーの発生と Resume、Exit Sub、Exit Function、
>> または Exit Property ステートメントの間) は、
>> カレント プロシージャのエラー処理ルーチンはエラーを処理できません。

【56553】Re:エラー制御に関して
回答  mizunu  - 08/6/20(金) 15:06 -

引用なし
パスワード
   >a2="a2"のエラーをトラップしたい場合、
>どこを変更したら良いでしょうか。

エラー処理ルーチンを終了して次のエラー処理を行う事を前提にすれば、
以下のようになるでしょう。(1例です)

Sub ErrorTest()
  Dim a1 As Long
  Dim a2 As Long
  On Error GoTo Label1
  a1 = "a1"
  On Error GoTo Label2
  a2 = "a2"
  Exit Sub
Label1:
  MsgBox "エラー処理ルーチン1" '確認用
  '
  Resume Next
Label2:
  MsgBox "エラー処理ルーチン2"
  '
End Sub

補足:
同じプロシージャで、エラー処理ルーチンを終了してプログラムを継続するには
Resumeステートメントを用います。
詳細はヘルプでどうぞ。

4459 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free