『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 >
(検索) 2025/07/10(木) 09:45:30
おはようございます (*^^*)
解ったつもりで、あまりわかっていない、爺さんが←私^^; ご説明するより
On Error 有効範囲 とか
On Error スコープ とか
で、検索すると参考サイトがたくさん御座いますですよ m(__)m
(隠居Z) 2025/07/10(木) 09:48:27
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.