[[20250710091029]] 『OnErrorがわかりません。』(初心者遺産) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『OnErrorがわかりません。』(初心者遺産)

Subの呼び出しを行った時の
OnErrorの動作が理解できなくていろいろ調べてます。
・呼び出し後、帰った時にerr.numberが
 引き継がれたり、クリアされたりする条件は?。
・サブで指定したOnError〜はサブの中だけで有効?
 ただし、Err.Numberは呼び出した側に戻る?
・サブのときだけOnErroGoto0を呼び出しても
 プログラムの停止はしなくなるのはどうして?
・OnError〜の使い方が理解できる情報源はどこかにありませんか?

 Private Sub CommandButton4_Click()
    On Error Resume Next
    Call test_1
    Debug.Print Err.Number	' Err.Number=0
 End Sub

 Private Sub test_1()
    On Error GoTo ERROR
    Dim a As Long: a = a / a	' ERRORに飛ぶ
    Debug.Print "error1(" & Err.Number & ")"
 ERROR:
    Debug.Print "error2(" & Err.Number & ")"	' Err.Number=6
 End Sub

 Private Sub CommandButton5_Click()
    On Error Resume Next
    Call test_2
    Debug.Print Err.Number	' Err.Number=6
 End Sub

 Private Sub test_2()
    On Error GoTo 0
    Dim a As Long: a = a / a	'強制終了以降は処理されない
    Debug.Print "error1(" & Err.Number & ")"
 End Sub

< 使用 Excel:Excel2016、使用 OS:Windows11 >


>・OnError〜の使い方が理解できる情報源はどこかにありませんか?
今はネット時代。
OnError〜の使い方でググってみれば。
後は本屋さんにいってみることですね。

(検索) 2025/07/10(木) 09:45:30


すでに、適切なご案内があったようですが

おはようございます (*^^*)

解ったつもりで、あまりわかっていない、爺さんが←私^^; ご説明するより
On Error 有効範囲 とか
On Error スコープ とか

で、検索すると参考サイトがたくさん御座いますですよ m(__)m
(隠居Z) 2025/07/10(木) 09:48:27


Error.クリアとかしないと(スペル分からん)

 On Error GoTo 0
ってやっても、エラー値は残ります
単にエラートラップを設定しなおしているだけだから
(普通) 2025/07/10(木) 10:11:47

 こういう掲示板だと、こうしたい場合はどすれば? という個々のケースについては回答しやすいですが、
 一般的な使い方を解説しろといわれると、ちょっと厳しいので、

 参考層を探すなら 古本屋でVB6の参考書を探す方が詳しいと思いますし
 Webサイトを検索するなら、  On Errorステートメント VB6  というキーワードで検索してみてください。  
  
 関連するステートメントはこんな感じですが、

 1) エラー処理の方法を設定するステートメント
   On Error Goto ラベル ・・・・ ラベル以降のエラー処理ルーチンにジャンプする
   On Error Resume Next  ・・・・  エラーが発生しても、エラーが発生した次の行を実行して継続する

 2) エラー処理の方法を解除するステートメント
   On Error Goto 0       ・・・・  On Error Goto ラベルが有効な場合は、エラーが起きてもエラー処理ルーチンにジャンプしなくなる
                                   On Error Resume Next が有効な場合は、エラー発生行で処理がストップする
                  いずれの場合もエラーはクリアされる

 3) エラー処理ルーチン内で使うステートメント
   Resume                ・・・・  エラーをクリアして、エラー発生行から実行を継続する
   Resume Next           ・・・・  エラーをクリアして、エラー発生の次の行から実行を継続する
   Resume ラベル         ・・・・  エラーをクリアして、ラベル行から実行を継続する 

 1)の2つのステートメントは、使われたプロシジャ内およびそれが有効な範囲内でCallされたサブプロシジャで有効です
 エラーは、Call元のプロシジャに上位に伝播します。
 2)の On Error Goto 0 は同じプロシジャで設定された On Error ステートメントに対してだけ聞きます。

 Private Sub CommandButton5_Click() で設定された On Error Resume Next は
 Private Sub test_2() の冒頭の On Error GoTo 0 では無効になりません
 CommandButton5_Clickだけで見ると、Call test_2 でエラーが発生するので、その次の行が実行されます
(´・ω・`) 2025/07/10(木) 10:17:04

 こんなサンプルはどうでしょう
 割り算をする関数 DIVを作成しました
 0除算の場合は、実行時エラーが発生しないで、エラー値を返します。
 0除算以外のエラーは、実行時エラーが発生します。      

    Sub sample()
      Dim ret1 As Variant, ret2 As Variant
      On Error GoTo Err_Handler
         ret1 = DIV(1, 0)             ' 0で割る
         Debug.Print "retult="; ret1
         ret2 = DIV(1, "a")           ' 数値ではなく文字で割る
         Debug.Print "retult="; ret2
      On Error GoTo 0
      Exit Sub

    Err_Handler:
      MsgBox Err.Number & vbLf & Err.Description
      Resume Next
    End Sub

    Function DIV(x, y) As Variant
      On Error GoTo Err_Handler
         DIV = x / y
      On Error GoTo 0
      Exit Function

    Err_Handler:
      Select Case Err.Number
         Case 11                                     ' 0除算
            DIV = CVErr(xlErrDiv0)                   ' エラー値を返す
            Resume Next
         Case Else                                   ' 0除算以外
            Err.Raise Err.Number, , Err.Description  ' エラーを再発生させる
      End Select
    End Function
(´・ω・`) 2025/07/10(木) 12:54:13

 >呼び出し後、帰った時にerr.numberが
 >引き継がれたり、クリアされたりする条件は?
 明示的にクリアしない限り、クリアされません。
 Errオブジェクトはグローバルなので、
 メインプロシージャに処理が戻った際には
 サブプロシージャで起きた例外の情報が残っています。
 サブプロシージャで例外処理を記述している場合、
 サブプロシージャ内で例外処理が実行されますが
 その後にメインプロシージャで再度何かしらの例外が発生した場合
 Errオブジェクトが更新され、メインプロシージャ内の例外処理が実行されます。

 > サブで指定したOnError〜はサブの中だけで有効?
 サブという言葉がサブプロシージャのことを指していると仮定すると
 その通りです。On Error ステートメントのスコープはプロシージャ内です。

 >サブのときだけOnErroGoto0を呼び出して
 >プログラムの停止はしなくなるのはどうして?
 サブプロシージャ内で発生した例外は
 サブプロシージャ内のOn Errorステートメントで処理されます。
 明示的に再スローしない限り、メインプロシージャ内の例外処理には移行しません。
 しかしエラーが発生した情報が消失するわけではありません。

 > OnError〜の使い方が理解できる情報源はどこかにありませんか?
 既に有効な回答がいくつか出ています。
 さらに言うならば、理解できていないのであれば 
 わざわざ記述する必要はありません。
 エラーが出るから面倒くさいというだけの話であれば
 寧ろ記述せずにエラーが起きている方がマシです。
(デボラ) 2025/07/11(金) 23:09:49

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.