
No.3ベストアンサー
- 回答日時:
>Callで呼んだプロシージャにも効くなら、
>Msgbox"test2-2"も表示されるはずですよね?
あ、いや、On Error Resume Nextがかかれたプロシージャだけで有効です。
No1の補足のケースで言いますと、test1()はエラーを無視しますが、
test2()にはOn Error Resume Nextとはかかれていないのでエラーとなり
そこで処理は抜けてしまって制御がtest1()に戻ります。
しかしtest1はエラー無視なのでそのまま処理は進みます。
具体的には・・
Sub test1()
Dim x, y
On Error Resume Next
y = x / 0 →[1]エラーですが無視
MsgBox "test1-1" →[2]表示
Call test2 →[3]CALL
→[6]test2はエラーだったが無視
MsgBox "test1-2" →[7]表示
End Sub
Sub test2()
Dim x, y
MsgBox "test2-1" →[4]表示
y = x / 0 →[5]エラーでTest2は抜ける(終了)
MsgBox "test2-2"
Call test3
End Sub
もし、エラーでも"test2-2"を表示したいのでしたら、
test2にもOn Error Resume Nextをかく必要があります。
No.2
- 回答日時:
>そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。
記述の在るプロシージャ内だけだと思います。
が、その中でCALLしているプロシージャを含みます。
Sub f_functin1()
On Error Resume Next
Call f_function2
End Sub
例えば上のような場合ですと、f_function2でエラーがあったとしても無視されるかと思います。
f_function2はf_functin1プロシージャ内と解釈できるからです。
もし、実行時エラーはだしたくないが、エラー処理はしたいのであれば、私ならこんな感じでかきます。
Sub f_functin1()
On Error GoTo ERR
Call f_function2
EXT:
Exit Sub
ERR:
MsgBox ERR.Description 'エラー処理
Resume EXT
End Sub
この回答への補足
ありがとうございます。
No1の補足にも書いたとおりです。
Callで呼んだプロシージャにも効くなら、Msgbox"test2-2"も表示されるはずですよね?
No.1
- 回答日時:
merlionXXさん
>End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降
単独プロシージャでは、そんなことはないはずです。実際のコードを見なければ、はっきりといえませんが、サブルーチン上では、そのまま引き継ぎますので、つい、うっかり失敗しますね。これが、なかなか分からないです。
もう1つ、うっかりするのは、ループなどしている場所で、On Error Resume Next と On Error Gto 0 で挟まれた場所の変数は、Err の発生する前の値を確保しているので、Err が発生したら、その変数の中を、一旦空にしてあげないといけませんね。(Test_Err3)
'サンプル
Sub test_Err1()
On Error Resume Next
Err.Raise 3
If Err.Number > 0 Then
MsgBox Err.Description
End If
Call test_Err2
On Error Goto 0
End Sub
Sub test_Err2()
If Err.Number > 0 Then
MsgBox Err.Description
End If
End Sub
'----------
Sub Test_Err3()
Dim i As Long, a As Long
For i = 65534 To 65538
On Error Resume Next
a = Cells(i, 1).Row
On Error GoTo 0
MsgBox a
Next i
End Sub
この回答への補足
いつもすみません。
こういうケースです。
Sub test1()
Dim x, y
On Error Resume Next
y = x / 0
MsgBox "test1-1"
Call test2
MsgBox "test1-2"
End Sub
Sub test2()
Dim x, y
MsgBox "test2-1"
y = x / 0
MsgBox "test2-2"
Call test3
End Sub
Sub test3()
Dim x, y
MsgBox "test3-1"
y = x / 0
MsgBox "test3-2"
End Sub
test1からtest2を呼び出し、MsgBox "test2-1"まで表示されますが、次のエラーは表示されず、MsgBox "test1-2"へ戻るようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
callで順に実行されるプロシー...
-
Access VBAで行ラベルが定義さ...
-
Excel VBAで「プログラム実行」...
-
或るプロシージャの呼び出し元判定
-
エクセルVBAが対応できるプログ...
-
【Excel VBA】 WorksheetやRa...
-
エクセルVBAでUserFormを起動し...
-
VBA ユーザーフォームの値の取...
-
VBAのプロシージャー間で、変数の受...
-
PL/SQLのエラーについて
-
Statement ignored というエラー
-
Accessの数値から時間に変換す...
-
ODBCリンクの際にACCESSでは読...
-
WHERE句の実行順序
-
sqlplusでヘッダーが付かない
-
sqlplusのspoolで空白行出現
-
PL/SQLの例外
-
キャッシュを使わずにSELECTを...
-
会社の〇〇部と〇〇課の違いっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
callで順に実行されるプロシー...
-
エクセルVBAでUserFormを起動し...
-
【Excel VBA】 WorksheetやRa...
-
OutlookVBAで作成したマクロに...
-
Excel VBAで「プログラム実行」...
-
或るプロシージャの呼び出し元判定
-
Accessでグローバル変数を宣言...
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
VBA プロシージャの名前の取得
-
エクセルVBAが対応できるプログ...
-
PL/SQLのエラーについて
-
ACCESS2007インポート時の空白...
-
Excel2000 セルデータ検索ウィ...
-
ブックオープン時にテキストボ...
-
ACCESS マクロをモジュールに変...
-
連番欠番アルゴリズム
-
DB2でのストアドプロシージャの...
-
ExcelVBAのInputBoxメソッドの...
おすすめ情報