【初月無料キャンペーン中】gooドクター

VBAのエラー処理に関する質問です。
resume next や goto文など基礎的なエラー処理は学びました。

とあるプロシージャでエラーが発生した際に、同一モジュール内の別プロシージャに飛ばす方法はありますでしょうか?

非常に雑な例ですが、a1プロシージャの、とある箇所でエラーになった場合、a2プロシージャの、とある箇所に飛ばすイメージです。

------------------------------
Sub a1()

On Error GoTo MyError:

Dim a As Long
a = "あああ"

End Sub
------------------------------
Sub a2()

'~~処理~~~

MyError: '←ここに飛びたい

'~~処理~~~

End Sub
------------------------------

※「ひとつのプロシージャ内で処理を完結させればよいのでは?」というご回答は不要です。

gooドクター

A 回答 (2件)

もしかしてと思ってやってみましたが、やっぱり「コンパイルエラー」ですね。


やはりMyError以降の処理を別にするしかないようです。

sub (共通処理?)
’MyError: '←ここに飛びたい:意向を別プロシージャーに!

'~~処理~~~

End Sub
を分けて、

------------------------------
Sub a1()

On Error GoTo MyError:

Dim a As Long
a = "あああ"
Exit Sub
MyError:
Call (共通処理?)
End Sub
------------------------------
Sub a2()

'~~処理~~~
Call (共通処理?)
End Sub
------------------------------
とするしかないようですが、
これでも、質問者さんの意図にはそぐわないのでしょうね。
    • good
    • 0
この回答へのお礼

意図にそぐいました。情報量の少ない中、建設的なご回答ありがとうございます。ベストアンサーにさせていただきます。

お礼日時:2017/11/22 21:54

>※「ひとつのプロシージャ内で処理を完結させればよいのでは?」というご回答は不要です。


初歩のブログラミングで自己流を通したいというのは、ありえませんよ。

ふつう、Mainで起きたトラブルは、サブルーチンに処理を任すことはしません。Main 側で決着をつけるか終わらせます。仮に、サブルーチン側でトラブルが起きた時は、Main にフィードバックして、そこで終わらせます。なぜかというと、オブジェクトの生成が、Mainで起こされているからです。しかし、あまり道のりが長すぎた時は、伝家の宝刀のごとく、"End" メソッドを使って中断させてしまいます。

ただ、このようなマクロは、ある程度の規模になったら、バグ潰しに手を焼きます。
コードは、分散化してよいものとそうでないものがあります。

'//
Private Flg As Boolean
Sub A1()
 Flg = False
 On Error GoTo ErrHandler
 Dim a As Long
 a = "あああ"

 Exit Sub
ErrHandler:
 Flg = True
 Call A2
End Sub

Sub A2()
 If Flg Then GoTo MyError
 '~~処理~~~

MyError:  '←ここに飛ぶ

 '~~処理~~~

End Sub
    • good
    • 0
この回答へのお礼

質問を省略しすぎて意図が伝わらず申し訳ございませんでした。ご指導いただきありがとうございました。失礼いたします。

お礼日時:2017/11/21 07:32

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング