• ベストアンサー

エクセルVBA 「On Error GoTo 0」について

「On Error GoTo 」ステートメントの意味は、だいたい理解しています。 「On Error GoTo 0」 ステートメントについて、ご教授お願いします。 参考書には「エラーのトラップ処理を無効にする」と載っていましたが、よくわかりません。 具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3の回答者ですが、コードのどこが原因か特定し、実行時エラーとして、そのエラーが不可避な場合において、On Error Resume Next を付けますから、On Error Goto ErrHandler よりも、扱い方が難しいです。当然、その部分だけの範囲を囲うので、On Error Goto 0 を入れると思いますし、今では、使う場面が限定されているはずです。 後はテキストを参考にしてください。当面、このようなコードが必要になることはないと思いますが。

taka1012
質問者

お礼

度々のご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.4

ごめんなさい。いくつもスペル間違えていました。 sub aaa() on error resume next dim kazu as string open "c:\aaa.txt" for input as #1 if err.number=0 then   input #1,kazu   close #1   end if on error goto 0 msgbox 5/cdbl(kazu) end sub でも、aaa.txtというファイルには データとして、 0 を入れて置いてください。 (これは、メモ帳あたりで作成していただければよいですが 。) aaa.txtというファイルを作成するコードです Sub mk_sample()   Open "c:\aaa.txt" For Output As #1   Print #1, 0   Close #1 End Sub プロシジャーaaaは、aaa.txtに0が入っていればエラーになる例ですよ。 念のため。 >大昔のBasicの名残です。 と前回申し上げましたが、昔のBasicには、プロシジャーのという概念が ない時代がありました。 それでもコードを機能的に分割するためにラベルが使われていたんです。 VBAにも名残が残っていて以下のようなコードが書けます。 Sub samp()   Dim a As Long   Dim b As Long   Dim c As Variant   a = 5   b = 0   GoSub 割り算   MsgBox c   MsgBox 1 / 0    '↑このコードはここでエラーになります 0で割り算している   Exit Sub 割り算:   On Error Resume Next   c = a / b   If Err.Number <> 0 Then    c = "エラー"    End If   On Error GoTo 0 'しかし、このコードがないとエラーが発生しません   Return End Sub 昔は on error goto 0 がかなりの頻度で必要だったんですよ!! 先に述べたように >sub aaa() >  on error resume next >  処理コード >  on error goto 0 >end sub >実は、「on error goto 0」を入れなくても >プロシージャの終了時に自動的に無効になります。 >でも、私は付けています。 これは、上記に例の名残であると同時に エラー処理ルーチンの有効区間をはっきりさせるためにも 付けています。

taka1012
質問者

お礼

度々のご回答ありがとうございます。 >これは、上記に例の名残であると同時に >エラー処理ルーチンの有効区間をはっきりさせるためにも >付けています よくわかりました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >ご提示いただいたコードでは >「On Error GoTo 0」はあってもなくても反応します。 >何か見やすくするため等の理由で、これを使うのでしょうか? そんなことはありません。 「On Error GoTo 0」は、エラートラップ(On Error Resume Next)の終了のためのコードです。一応、終了を入れておくというのが、決まりです。 On Error Resume Next '-エラーの発生するコード On Error Goto 0 と挟みますが、あまり長い場所を挟むのは良くありません。 例えば、If ------- というようなコードではなく、 On Error Resume Next dummy = プログラム On Error Goto 0 If IsEmpty(dummy) などと行って、範囲を広げないことがコツです。 それは、 On Error Resume Next という意味は、エラーが発生したとき(On Error)に、次(Next)に進め(Resume)という意味だからです。だから、値が取れていないのに、次に進んだら困りますから、短い範囲にします。 On Error Goto ErrHandler とは似ていますが、使い方が違います。 なお、#2 のプログラムでは、A1 に、「z」 を入れてみて、検索の結果がどうなるか、Error のコードにコメントブロックを入れたりして試してみてください。 他に、どうしても、この On Error Resume Next が必要なのは、配列の次元を取るためのコードです。なお、これを使いこなすのは、VBAでは、上級コースに入ります。

taka1012
質問者

お礼

度々のご回答ありがとうございます。 >「On Error GoTo 0」は、エラートラップ(On Error Resume Next)の終了のためのコードです。一応、終了を入れておくというのが、決まりです。 よくわかりました。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。 代表的な使い方としては、ワークシート関数でエラーを返すものがあります。 以下の場合では、 Application.Matchという古い書き方もあるのですが、Excel2000 以降では、以下のような書き方が標準的としています。 Sub Test() Dim i As Integer On Error Resume Next i = 0 '値を一旦空にする i = WorksheetFunction.Match(Range("A1"), Range("B1:B10"), 0) On Error GoTo 0 If i > 0 Then   MsgBox "B" & i & "にあります。" Else   MsgBox "該当セルが見つかりません。", vbCritical End If End Sub A1 の値をMatch関数でB列で調べる場合、   A列  B列 1  c  a 2    b 3    c 4    d 5    e 6    f 7    g 8    h 9    i 10    j --------------------------- なお、仮に実行時エラーでも、エラーが想定できて、エラーの回避が出来る場合には、On Error Resume Nextは使いません。

taka1012
質問者

補足

ご回答ありがとうございます。 私の勘違いだったらすみませんが、ご提示いただいたコードでは 「On Error GoTo 0」はあってもなくても反応します。 何か見やすくするため等の理由で、これを使うのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.1

あるプロシジャーの先頭で sub aaa()   on error resume next   処理コード   on error goto 0 end sub 実は、「on error goto 0」を入れなくても プロシージャの終了時に自動的に無効になります。 でも、私は付けています。 これは、大昔のBasicの名残です。 後は、エラー処理ルーチンを使わないと拾えないエラーと それ以外のバグによるエラーをはっきりさせるために エラー処理を必要最小限にする場合は、 on error goto 0 を使います。 sub aaa() on error reasume next dim mazu as string open "c:\aaa.txt" as input #1 if err.number=0 then   input #1,kazu   close #1   end if on error goto 0 msgbox 5/cdbl(kazu) end sub なんて、コードで変数kazuに"0"が入っていたら、デバッグ時は エラーになってくれないとバグが発見しにくいですよね? (on error goto 0がないとエラーにならないので見つけにくい) こんな使い道がありますが、いかがですか?

taka1012
質問者

補足

ご回答ありがとうございます。 ご提示いただいたコードaaaを試したくてコピペしたらば、 「on error reasume next」と「open "c:\aaa.txt" as input #1」が 赤字になり実行できません。 なぜでしょうか? よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • On Error GoTo でエラーが発生する

    Sub Macro1() On Error GoTo ErrorTrap1     '-エラーの発生するコード 1 ErrorTrap1: On Error GoTo 0    Do    On Error GoTo ErrorTrap2       '-エラーの発生するコード 2    On Error GoTo 0    Loop ErrorTrap2: End Sub しかし、以下のようにSubで二つに分けるとエラーは出ません。 Sub Macro1() On Error GoTo ErrorTrap1     '-エラーの発生するコード 1 ErrorTrap1: On Error GoTo 0 Call Macro2 End Sub Sub Macro2()     Do      On Error GoTo ErrorTrap2       '-エラーの発生するコード 2     On Error GoTo 0     Loop   ErrorTrap2: End Sub 「On Error GoTo 0」がうまく解除できていないのかと思い、いろいろ試してみました。 しかし、どういった理由かはわかりませんでした。 「On Error GoTo」は、Subでは、ひとつしか使えないのでしょうか。

  • On Error GoToで飛んだ元の位置が知りたい

    タイトル通りですが、VB6でOn Error GoTo XXXとしておくと、エラー発生時、XXXのラベルから実行されます。この時、どこから、このエラー処理(XXX)に飛んできたかを知ることは出来ないのでしょうか。要はエラーの発生した場所(ステートメント)を知りたいのですが、どのようにすれば、知ることが出来るでしょうか。現在は、怪しいところに目つけて、そこから1ステップずつ実行しているのですが、効率が悪いので、簡単に知る方法があればと思い質問しました。

  • [Excel2003] On Error GoTo について教えてください。

    エラー処理について教えてください。 以下の様なマクロで、インプットボックスに 数字以外を入力した場合のエラー処理ですが、 次のような手順で進めると 「型が一致しません」とエラー表示されてしまいます。 どこがいけないのでしょうか?   【手順】   ・マクロ実行   ・インプットボックスへ数字以外の文字を入力   ・「OK」クリック   ・再びインプットボックス出現   ・もう一度数字以外の文字を入力   ・「OK」クリック←ここでエラー表示! Sub TEST() Dim Tuki As Integer On Error GoTo INPT INPT: Tuki = InputBox("何月分ですか?" & vbCrLf & _ "数字を入力してください。", "集計月入力", 1) If Tuki = 0 Or Tuki > 12 Then MsgBox "1から12の数字を入力してください。" GoTo INPT End If On Error GoTo 0 End Sub

  • 【VBA】On Error をつけても「Match

    【VBA】On Error をつけても「Matchプロパティを取得できません」を回避できません。  今晩は、質問させていただきます。どうぞよろしくお願いいたします。 環境:エクセル2010でございます。  下のようにコーディングしておりますが、「Matchプロパティを取得できません」が出てコード実行が中断されてしまいます。 取得できなかった場合の対処は既に(更にその下に)コーディングしておりますので、Matchのエラーをスルーさせたいのですが。。。 On Error GoTo error1 line1 = (Application.WorksheetFunction.Match(strTime, WS_data.Range("G:G"), 0))          '↑この行でエラーになります。 error1: On Error GoTo 0  On Error GoTo error1をOn Error Resume Nextに変えても同じ症状になってしまいます。 もしお詳しい方がいらっしゃいましたらアドバイスいただけないでしょうか。  どうぞよろしくお願いいたします。

  • Access VBA にて on error goto がたまに機能し

    Access VBA にて on error goto がたまに機能しないPCがあるます。 具体的には、on error gotoのコーディングを無視して、エラーのポップアップが表示される 何か対応する方法は、ありますか? 環境 ネットーワークにあるmdbをドライブに接続して、Accessを起動しています。   Windows2000(sp4)+Access2000(sp3) 他のPCでは、問題ありません。PCは、イメージをクローンして作成していますので、同一です。 ※コーディングイメージ Private Sub 稼働時間_AfterUpdate() on error goto ERR_稼働時間 Dim errcnt as integer errcnt = 0 DoCmd.GotoRecord A_FORM,"時間入力",A_NEXT <----- エラーのポップアップが表示される if errcnt = 1 Then DoCmd.GotoRecord A_FORM,"時間入力",A_PREVIOUS end if exit sub ERR_稼働時間: errcnt = errcnt + 1 resume next end sub

  • on error 処理に関して

    on error goto での処理ルーチン内で、 さらに on error goto を出すことは可能でしょうか。 それとも、一度on errorを設定すると、エラーが発生した後では変更は不可なのでしょうか。 やりたいことは、 1回目と、2回目、3回目以降でやることとを変えたいのです。 例えば、メッセージを変えるとか。 この場合、 エラー処理の中で、何回目かを聞くことで、メッセージを変えることは出来ると思うのですが、 それはやらず、 他にも色々やることが多いので、別処理として飛びたいのです。 以下のようなイメージです。 err1: on error goto err2 resume next err2: on error goto err3 resume next err3: resume next 宜しくお願いします。

  • Onってなんでしょうか?

    私は現在、VB6を使用してプログラム開発を行っています。 「On Error」ステートメントに関して質問させていただきます。 私の管理下のソースに、   (1)「On Error Goto [行ラベル]」   (2)「On Err Goto [行ラベル]」 の2種類のステップがあり、 (2)に関しての動作が不明で困っています。 (要は「On [Object] Goto [行ラベル]」と記述した場合に、  どのように解釈されるのか分らないのですが・・・  (1)、(2)共にコンパイルは通りますが(2)の場合はエラーハンドリングはできません。) <質問> (1)「On Err Goto [行ラベル]」 と記述した場合、  どのような条件でGotoが実行されるのでしょうか?  (Errはエラーオブジェクトです) (2)「On」は   ・「On Error Goto [行ラベル]」   ・「On Error Resume Next」   ・「On Error Goto 0」  以外に使用する方法があるのでしょうか?

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • ExcelのVBA で実行エラー5

    ExcelのVBA で実行時エラー5のプロシージャの呼び出し、または引数が不正です。 と出るのですが、何が悪いのでしょうか? 引っかかる部分は下のコードの「tf.Writeline (Wl)」のところです。 'On Error GoTo ErrorHandler tf.Writeline (Wl) On Error GoTo 0 Wl = "" C = C + 1 End If 回答よろしくお願いします。

  • On ErrorでエラーNoが0

    On ErrorでエラーをトラップしてエラーNOとエラー内容をダイアログに表示させています。 Private Sub pv_sample() Dim errno as Long On Error GoTo ERR_END ' 処理内容略 Exit Sub ERR_END: errno = Err.Number MsgBox "システムエラー エラーNO(" & errno & ") 内容(" & Err.Description & ")" End Sub エラーが発生した場合はErr.Numberには0以外がセットされるはずですが 「システムエラー エラーNO(0) 内容()」 というメッセージが表示されることがあります。 On Eroorで飛んできたときにエラーNoが0になってしまうことはありえるのでしょうか。

専門家に質問してみよう