
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) Excelのマクロについて 2 2022/06/14 03:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
UserForm1.Showでエラーになり...
-
「実行時エラー '3167' レコー...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
SQLでエラーです。
-
String""から型'Double'への変...
-
エクセル関数式=ABSで#VALUE!...
-
インポート時のエラー「データ...
-
実行時エラー'-2147467259(8000...
-
ACCESSで値を代入できないとは?
-
IISの仮想ディレクトリ作成がわ...
-
マクロOn Error GoTo ErrLabel...
-
VBAで、Excelの選択範囲をWeb形...
-
ADO 「認証に失敗しました」
-
文字列内で括弧を使うには
-
ACCESS97 実行時エラー '2455'...
-
VBA エクセル で FIND でのエラ...
-
存在しないアドレスへ送信した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロOn Error GoTo ErrLabel...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
String""から型'Double'への変...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
【VBAエラー】Nextに対するFor...
-
ACCESSで値を代入できないとは?
-
【Access】Excelインポート時に...
-
VBでSQL文のUPDATE構文を使った...
-
【VB.NET】 パワポ操作を非表示で
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
おすすめ情報