人生最悪の忘れ物

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

A 回答 (5件)

#3の回答者ですが、コードのどこが原因か特定し、実行時エラーとして、そのエラーが不可避な場合において、On Error Resume Next を付けますから、On Error Goto ErrHandler よりも、扱い方が難しいです。

当然、その部分だけの範囲を囲うので、On Error Goto 0 を入れると思いますし、今では、使う場面が限定されているはずです。

後はテキストを参考にしてください。当面、このようなコードが必要になることはないと思いますが。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/02/11 01:26

ごめんなさい。

いくつもスペル間違えていました。

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」を入れなくても
>プロシージャの終了時に自動的に無効になります。
>でも、私は付けています。
これは、上記に例の名残であると同時に
エラー処理ルーチンの有効区間をはっきりさせるためにも
付けています。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/02/10 08:04

こんばんは。



>ご提示いただいたコードでは
>「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では、上級コースに入ります。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/02/10 07:56

こんばんは。



>具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。

代表的な使い方としては、ワークシート関数でエラーを返すものがあります。
以下の場合では、 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は使いません。

この回答への補足

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

補足日時:2008/02/10 00:33
    • good
    • 0

あるプロシジャーの先頭で


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がないとエラーにならないので見つけにくい)

こんな使い道がありますが、いかがですか?

この回答への補足

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

補足日時:2008/02/09 16:59
    • good
    • 0

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

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


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