![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.2ベストアンサー
- 回答日時:
私の場合、On Error Goto の書く基準は以下です。
・リソース関連の操作を行う場合に記述します。
(ハード的な条件は、ソフトでは予測できない為です)
・On Error Goto 発生時に処理すべき事がある場合
(ファイルのClose、recordesetのCloseなどがある場合)
・エラーメッセージを独自に表示したい場合
・Accessの特定のエラーを無視したい場合
(たとえば、フォーカスのあるコントロールをEnabled=false する場合など、Errの値を識別しResume Nextするなどしています。)
上記、一例ですが On Error Gotoを記述すべきか否かを判断しています。
どうもありがとうございます。
エラーを書くべき基準のご意見、参考にさせていただきます。
何となく上記を実現するには、予めどういうエラーが発生する可能性があるのかという事を把握しておく必要がありそうですね。
今の所、「エラーメッセージを独自に表示したい」や「Accessの特定のエラーを無視したい」という用途は思いつかないのですが、「リソース関連の操作を行う場合」や「On Error Goto 発生時に処理すべき事がある場合」は何となくですが、イメージできそうなので、そういう事が発生する可能性があると予想できる箇所にエラートラップを書いてみるようにいたします。
No.6
- 回答日時:
こんばんは。
#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でも、使いこなすには上級レベルになるようです。
ありがとうございます。
すべてのプロシージャに、こういうコードを入れるのは定番ですか。
分かりました。
確かにすべてのエラーを想定できているわけでは無い為、仕方ないですね。
それと、エラーハンドラーの書き方参考にさせていただこうと思います。
No.5
- 回答日時:
的外れかもしれないのですが
エクセル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
はエラーが起こらないという意味の例で入れたのでしょうか。
でも予想外のエラー(予測不可能)を捉える意味もあって、入れておくのが良いのでは。場所は最初がよいでしょう。
ありがとうございます。
1つのプロシージャ内でエラートラップを複数書いた事がなかったので参考になりました。
後、私の言葉不足で皆様に誤解を招いたようですが、質問の意図としては質問内容のようなプロシージャが多数あった場合、そのすべてにエラートラップを書くべきか否かという事でした。
なお、上記のソースではエラーはまず発生しないと判断しております。
そのような場合でもエラートラップを入れておくべきか否かという事をご質問させていただきました。
今まではプロシージャの数が少なかった為、すべてに入れても手間ではなかったのですが、1つのクラスモジュールに100個とかのプロシージャが存在するようになってきたので、省いて問題ないのであれば省きたいなと思いました。
No.4
- 回答日時:
こんにちは。
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 します。
ありがとうございます。
どうも上記のような記述であればエラートラップは必要ないみたいですね。
それと、「実行時に環境的にエラーが返る可能性がある場合で、どうしても、その方法しか回避できない場合に使います。」との事ですが、例えばSQLを実行する際は、テーブルの状態が意図していない状態になっている可能性があるので、そういう所にはエラートラップを書いておく必要があると解釈しました。
その為、特に外部にアクセスせずプログラムだけで完結する部分では不要で、外的要因などでエラーが起こりうる可能性がある所に書くようにしようと思いました。
後、私の言葉不足で誤解を招いたようですが、私が意図した質問に対する回答はWendy02さんのご回答の前半部分となります。
No.3のx0000xさんのお礼欄に質問内容の補足をさせていただきました。
No.3
- 回答日時:
No2です。
すみません。記述の場所の質問でしたね。
どこでも良いですが
On Error Goto が1つで済ませるなら、
処理コードを記述する前に書いています。
複数記述する場合も、その処理の前に記述します。
特に場所を決める必要はないと考えます。
ありがとうございます。
私の言葉不足で誤解を招いたようですが、私の質問の回答としてはNo2が適切となります。
No.1のbin-chanさんの回答に補足させていただきましたが、No.1の回答内容のようなプロシージャが5つあった場合、エラートラップは何個書くべきか、そして5個すべてに書かなくても良いのであれば、書くべき箇所と書く必要の無い箇所の基準はどこにあるかというのが質問の意図でした。
どうもx0000xさんのNo.2のご回答からは、No.1の回答のようなソースであれば、エラートラップは1つもいらないのではと感じました。
No.1
- 回答日時:
記述した行から有効になるので、ひとつのモジュール内で複数回のOnErrorを書くこともあります。
頻度は低いですけどね。なので、記述するからには「目立つところ」に書いています。
モジュールのヘッダーに仕様を、ついで変数宣言、その次あたりが多いです。
ありがとうございます。
私は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個のエラー処理を書くべきか否か分からなかったので、質問させていただきました。
ご意見参考にさせていただきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
VB6とVB.NETでNullの扱いが違う?
-
ACCESSで値を代入できないとは?
-
【VBAエラー】Nextに対するFor...
-
ActiveCell.FormulaR1C1の変数
-
お助けください!VBAのファイル...
-
実行時エラー´5854´ 文字列型パ...
-
マクロの「SaveAs」でエラーが...
-
実行時エラー'-2147467259(8000...
-
実行時エラー 438 の解決策をお...
-
On ErrorでエラーNoが0
-
VBA エクセル で FIND でのエラ...
-
フランスの生年月日(jj/mm/aaaa)
-
Pythonでの文字列からfloatへの...
-
「実行時エラー '3167' レコー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
VBAでfunctionを利用しようとし...
-
マクロで"#N/A"のエラー行を削...
-
お助けください!VBAのファイル...
-
On ErrorでエラーNoが0
-
実行時エラー'-2147467259(8000...
-
文字列内で括弧を使うには
-
【VBA】ワークブックを開く時に...
-
実行時エラー 438 の解決策をお...
-
Excel vbaについての質問
-
【VBAエラー】Nextに対するFor...
-
ApplicationとWorksheetFunctio...
-
フランスの生年月日(jj/mm/aaaa)
-
VBでSQL文のUPDATE構文を使った...
-
VBA データ(特定値)のある最...
-
インポート時のエラー「データ...
-
ACCESSで値を代入できないとは?
-
ActiveCell.FormulaR1C1の変数
-
「実行時エラー '3167' レコー...
おすすめ情報