Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : その他)
以降の処理で影響が出ないようにするOn Error GoTo ラベル名の使い方
投稿日時: 22/08/18 10:17:40
投稿者: Alice

Excel for Microsoft 365 MSOを使用しています。
 
サブルーチンでエラー発生した場合、エラー発生箇所で止まらずに、メインルーチンの下記「★」印で止まって「For ループが初期化されていません」MSGが表示されます。
 
こちらで質問を挙げるにあたり、簡単なコードで再現させたところ、On Error GoTo ラベル名の使い方が原因のようです。
 
どのような措置をすれば、サブルーチンでエラー発生した場合その場で止まるでしょうか?
基本が分かっておらずお恥ずかしいですが、ご教示いただけると幸いです。
 
宜しくお願い致します。
 
======== ↓↓ このようなコードです ↓↓ ========
【メインルーチン】
Sub main()
 
    On Error GoTo try
     
        For Each ws In Worksheets
         
            Worksheets(ws.Name).Select
            Range("A1") = "テスト"
         
try:
         
        Next '★
         
            Call test
End Sub
 
【サブルーチン】
Sub test()
 
    On Error Resume Next
    On Error GoTo 0
     
        On Error Resume Next
        On Error GoTo 0
         
            On Error Resume Next
            On Error GoTo 0
             
                Cells(1, 0).Select 'エラーを発生させる為にあり得ないコードにしています
             
End Sub

回答
投稿日時: 22/08/18 11:31:27
投稿者: WinArrow
投稿者のウェブサイトに移動

サブルーチンの中で
 
On Error Reme Next
On Error Goto 0
と記述しています。
このコードは、あってもなくても、実行には無意味です。(記述しなくても同じ)
 
Mainプロシジャの中でTestプロシジャ内のエラーを検知した
ということですね・・・

回答
投稿日時: 22/08/18 11:38:43
投稿者: Suzu

引用:
どのような措置をすれば、サブルーチンでエラー発生した場合その場で止まるでしょうか?

 
その場 とは、 どの位置を指すのでしょうか?
 
サブルーチン側/メインに戻って なのかどちらですか?
 
 
引用:
On Error GoTo ラベル名の使い方が原因のようです。

 
これは、エラー発生時に ラベルの所に行きなさいと言うこと。
エラーが発生したので、
引用:
try:
          
        Next '★

 
try に行き、次の Next が実行されようとしているけど、
 For Each の ループは既に終了しているので、Next なんて実行できないよ と言うエラーが発生しています。
 
使い方ではなく、飛ぶ位置 が問題なのです。 Next の直前が悪いのです。
 
 
普通は、
 
Sub Main2()
  On Error GoTo Err_Main
 
  '処理
  For Each ○○
  Next
 
  Call test
 
Exit_Main:
  Exit Sub
 
Err_Main:
  MsgBox Err.Description
  Resume Exit_Main
End Sub
 
こんな感じとか、
 
或いは サブルーチン側でエラートラップを入れるかでしょう。

回答
投稿日時: 22/08/18 11:41:47
投稿者: WinArrow
投稿者のウェブサイトに移動

追加コメント
  
 
 

サブルーチンでエラー発生した場合、エラー発生箇所で止まらずに

  
この説明から
On ErrOr Resume Next

On Error Goto 0
をきちんと理解することをお勧めします。

回答
投稿日時: 22/08/18 12:37:23
投稿者: WinArrow
投稿者のウェブサイトに移動

以下のよういれば、Testプロシジャyの中でエラー停止します。
 

Sub main()
 
    On Error GoTo try
     
        For Each ws In Worksheets
         
            Worksheets(ws.Name).Select
            Range("A1") = "テスト"
         
try:
         
        Next '★
         [b]On Error GoTo [/b]0
            Call test
End Sub


Sub test()
    Cells(1, 0).Select 'エラーを発生させる為にあり得ないコードにしています
End Sub

投稿日時: 22/08/18 16:23:48
投稿者: Alice

WinArrow様、Suzu様
 
早速のアドバイスありがとうございます。
 
WinArrow様が記載して下さった下記アドバイスで解決しました。
(サブルーチン側で「'エラーを発生させる為にあり得ないコードにしています」とコメントアウトしている箇所で止まりました。)
 

引用:
Next '★
         On Error GoTo 0
            Call test
End Sub

------------------------------
 
メインルーチンの、On Error GoTo try がサブルーチンにまで影響を及ぼすとは思いませんでした。
 
サブルーチンに、On Error Resume NextとOn Error GoTo 0の組み合わせを3回記載したのは、実際のコードでこのように記載しており、当初サブルーチン側のこれらの箇所が原因につながっているのかと思い、念の為ここでの質問でも記載した次第です。
(On Error Resume NextとOn Error GoTo 0の間の記述は、ここでは割愛しました。)
 
今後は同様のことが起こらないように、On Error GoTo 0はセットで使うようにします。
(エラー措置についても、学び直します。)
 
大変助かりました。心から感謝です Very Happy