dポイントプレゼントキャンペーン実施中!

エラートラップを記載しようと思ったのですが、エラートラップはどういう場所に書くべきでしょうか?
例えば、下記のような場合にもエラートラップは書くべきでしょうか?

Private Sub txt_Enter()
test = 1
End Sub

エラートラップを書くべき箇所の基準みたいな物があればご教示いただければと思います。
よろしくお願いします。

A 回答 (6件)

私の場合、On Error Goto の書く基準は以下です。


・リソース関連の操作を行う場合に記述します。
(ハード的な条件は、ソフトでは予測できない為です)
・On Error Goto 発生時に処理すべき事がある場合
(ファイルのClose、recordesetのCloseなどがある場合)
・エラーメッセージを独自に表示したい場合
・Accessの特定のエラーを無視したい場合
(たとえば、フォーカスのあるコントロールをEnabled=false する場合など、Errの値を識別しResume Nextするなどしています。)


上記、一例ですが On Error Gotoを記述すべきか否かを判断しています。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
エラーを書くべき基準のご意見、参考にさせていただきます。

何となく上記を実現するには、予めどういうエラーが発生する可能性があるのかという事を把握しておく必要がありそうですね。
今の所、「エラーメッセージを独自に表示したい」や「Accessの特定のエラーを無視したい」という用途は思いつかないのですが、「リソース関連の操作を行う場合」や「On Error Goto 発生時に処理すべき事がある場合」は何となくですが、イメージできそうなので、そういう事が発生する可能性があると予想できる箇所にエラートラップを書いてみるようにいたします。

お礼日時:2008/10/12 17:10

こんばんは。



#4の回答者です。

>MsgBox "エラー番号:" & Err.Number & vbNewLine & _
>"エラー内容:" & Err.Description

すべてのプロシージャに、こういうコードを入れるのは定番です。
エラーの内容が分かれば、確かに、プロジェクトがロックしてあっても、ユーザーにエラーの状況を知らせることが出来、マクロは、停止せずに済みます。#2の方が書いた中にありますが、

例えば、

On Error GoTo RsClose
Set rsADO = CreateObject("ADODB.Recordset")

rsADO.Open strQuery, cnADO, adOpenKeyset, adLockOptimistic

RsClose:
 rsADO.Close: Set rsADO = Nothing
 cnADO.Close: Set cnADO = Nothing

開いた後に、値が取れないか取れるかは、分からない場合があります。その場合、このようにしています。

なれないうちは、エラーが想定できるわけではありませんから、すべてのプロシージャにエラートラップを入れても仕方がありません。

私の場合は、コードの実行にはエラーが、不可避なものを予想してエラートラップをつけるのです。そういう書き方は、難しいというか面倒です。最初から入れるよりも、テストをしながら、後で、処理方法を入れることもあります。最初から、On Error トラップを入れると、正しいエラー処理が分からなくなることがあるからです。

それから、

On Error GoTo ErrHandler '(ジャンプ先は、Error とは、常識的には書きません。ErrHandler -エラーハンドラーという名称が基本です。VBAは、それを使っても予約語のエラーとはなりませんが、避けたほうが無難です)は、ひとつのプロシージャでひとつです。エラーがいくつか発生するなら、ジャンプ先の中で分けます。

一例:
Sub xxxx()
On Error GoTo ErrHandler

'処理

xxxx_Exit:
 Exit Sub
ErrHandler:
If Err.Number = 3 Then
 '対処法1
 Resume Next
Elseif Err.Number =4 Then
 '対処法2
 Resume Next
Else
 Goto xxxx_Exit '離脱
End If

End Sub
 

などとします。 Access は、このように、ErrHandler(エラーハンドラー) の構文として分離する書き方が多いようです。ちなみに、このエラートラップは、VBAでも、使いこなすには上級レベルになるようです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

すべてのプロシージャに、こういうコードを入れるのは定番ですか。
分かりました。
確かにすべてのエラーを想定できているわけでは無い為、仕方ないですね。
それと、エラーハンドラーの書き方参考にさせていただこうと思います。

お礼日時:2008/10/13 11:33

的外れかもしれないのですが


エクセルVBAでやってみました。アクセスでも同じと思いますので。
Sub test01()
On Error GoTo err1
x = Cells(1, 1) / Cells(2, 1)
On Error GoTo err2
x = Cells(3, 1) / Cells(4, 1)
Exit Sub
err1:
MsgBox "A"
Exit Sub
err2:
MsgBox "B"
End Sub
セルの値を
A1=1
A2=0
A3=3
A4=4
として実行するとAと表示されます。
セルの値を
A1=1
A2=2
A3=3
A4=0
として実行するとBと表示されます。
一番近い手前のOn Error行で捉えられます。
ですからエラーが起こりそうな手前に書くほうが、切り分けられて便利ではないかと思う。
行の実行以外の全体的なエラーを捉える場合は最初に書けばどうでしょう。
test = 1
はエラーが起こらないという意味の例で入れたのでしょうか。
でも予想外のエラー(予測不可能)を捉える意味もあって、入れておくのが良いのでは。場所は最初がよいでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

1つのプロシージャ内でエラートラップを複数書いた事がなかったので参考になりました。

後、私の言葉不足で皆様に誤解を招いたようですが、質問の意図としては質問内容のようなプロシージャが多数あった場合、そのすべてにエラートラップを書くべきか否かという事でした。

なお、上記のソースではエラーはまず発生しないと判断しております。
そのような場合でもエラートラップを入れておくべきか否かという事をご質問させていただきました。
今まではプロシージャの数が少なかった為、すべてに入れても手間ではなかったのですが、1つのクラスモジュールに100個とかのプロシージャが存在するようになってきたので、省いて問題ないのであれば省きたいなと思いました。

お礼日時:2008/10/12 17:39

こんにちは。



Access は、On Error Goto ErrHandler を比較的に多く使うような気がしますが、

>Private Sub txt_Enter()
>test = 1
>End Sub

上記では書くべきかどうかは、それでは分からないが、たぶん、必要ないでしょうね。

実行時に環境的にエラーが返る可能性がある場合で、どうしても、その方法しか回避できない場合に使います。

On Error Goto ErrHandler

は、他の方のご意見と同様、私も、見易い場所だと思います。本来は、エラーの発生する可能性がある場所の手前に書けばよいのですが、(ジャンプ先が必要だから)構文になりますから、基本的には、最初の方で書いたほうがコード的に見やすいです。また、On Error Goto ErrHandler は、通常は、On/Off するものではないということも言えます。

エラーの発生する直前で書くのは、On Error Resume Next ですが、こちらのほうの使い方が難しいです。こちらは、トラップをOn/Off します。
    • good
    • 0
この回答へのお礼

ありがとうございます。

どうも上記のような記述であればエラートラップは必要ないみたいですね。
それと、「実行時に環境的にエラーが返る可能性がある場合で、どうしても、その方法しか回避できない場合に使います。」との事ですが、例えばSQLを実行する際は、テーブルの状態が意図していない状態になっている可能性があるので、そういう所にはエラートラップを書いておく必要があると解釈しました。
その為、特に外部にアクセスせずプログラムだけで完結する部分では不要で、外的要因などでエラーが起こりうる可能性がある所に書くようにしようと思いました。

後、私の言葉不足で誤解を招いたようですが、私が意図した質問に対する回答はWendy02さんのご回答の前半部分となります。
No.3のx0000xさんのお礼欄に質問内容の補足をさせていただきました。

お礼日時:2008/10/12 17:30

No2です。


すみません。記述の場所の質問でしたね。
どこでも良いですが
On Error Goto が1つで済ませるなら、
処理コードを記述する前に書いています。

複数記述する場合も、その処理の前に記述します。
特に場所を決める必要はないと考えます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私の言葉不足で誤解を招いたようですが、私の質問の回答としてはNo2が適切となります。

No.1のbin-chanさんの回答に補足させていただきましたが、No.1の回答内容のようなプロシージャが5つあった場合、エラートラップは何個書くべきか、そして5個すべてに書かなくても良いのであれば、書くべき箇所と書く必要の無い箇所の基準はどこにあるかというのが質問の意図でした。

どうもx0000xさんのNo.2のご回答からは、No.1の回答のようなソースであれば、エラートラップは1つもいらないのではと感じました。

お礼日時:2008/10/12 17:17

記述した行から有効になるので、ひとつのモジュール内で複数回のOnErrorを書くこともあります。

頻度は低いですけどね。

なので、記述するからには「目立つところ」に書いています。

モジュールのヘッダーに仕様を、ついで変数宣言、その次あたりが多いです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
私はhttp://www.accessclub.jp/supbeg/067.htmlを真似させて頂いて、下記のような感じで書いております。

Private Sub txt_BeforeUpdate(Cancel As Integer)
On Error GoTo Error
test = 1
Exit Sub
Error:
MsgBox "エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Resume Next
End Sub

Private Sub txt_Change()
On Error GoTo Error
test = 2
Exit Sub
Error:
MsgBox "エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Resume Next
End Sub

Private Sub txt_Enter()
On Error GoTo Error
test = 3
Exit Sub
Error:
MsgBox "エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Resume Next
End Sub

Private Sub txt_KeyDown(KeyCode As Integer, Shift As Integer)
On Error GoTo Error
Call Key(KeyCode, Shift)
Exit Sub
Error:
MsgBox "エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Resume Next
End Sub

Function Key(KeyCode As Integer, Shift As Integer)
On Error GoTo Error
If KeyCode = 8 Then
KeyCode = 0
End If
Exit Function
Error:
MsgBox "エラー番号:" & Err.Number & vbNewLine & _
"エラー内容:" & Err.Description
Resume Next
End Function

どうも私の書き方とは違うような気がします。

私はイベントプロシージャ毎に1つずつ書いておりました。
ただ、プログラムの規模が大きくなり、1つのクラスモジュール内に100個のプロシージャがある場合、100個のエラー処理を書くべきか否か分からなかったので、質問させていただきました。

ご意見参考にさせていただきたいと思います。

お礼日時:2008/10/12 17:02

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