• ベストアンサー

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」  以外に使用する方法があるのでしょうか?

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

  • ベストアンサー
回答No.2

(1) On Err Goto [行ラベル]はただのOn Goto文となると思います。   On Goto文ではOnの次には0から255までの値をとる式が来ます。 その式の値により、行き先の行が変わります。 もし、On A GOTO Label1, Label2とあった場合、Aの値が1のときはLabel1、2のときはLabel2へ、0や行ラベルより多い数の場合は何もせず次の行へ処理を移します。 ご質問ではエラーオブジェクトの内容を評価して分岐することになりますのでエラー番号が1~255のときのみ何らかの動作をさせることが出来ます。 (2)ですがOn Error文はエラー処理ルーチンに分岐させる命令です。 エラーが起きたときGoto以下の行へ実行を移します。 On Error文はOn Goto文と違い、Goto以下には一つの行しか指定できません。 On Error文ではOn Error Goto 行、 On Error Resume Next、 On Error Goto 0しか書くことが出来ません。 ただ、On Error Goto 0だけは特殊で、設定されたOn Error文を解除するためだけに使われます。 On Goto文と On Error Goto文は見た目似ていますがまったく別の命令です。

mas_sama
質問者

お礼

丁寧な解説ありがとうございました。 「On Goto 文」というのがあるんですね(^^; 非常に参考になりました。 問題は何とか解決できそうです。

その他の回答 (1)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 「On」には、 ・On ... GoTo ... ・On ... Sub ... というステートメントがあります。 使い方は、 On num GoTo Line1, Line2, (以降カンマで繋げる) の場合、 numが1ならLine1へ、2ならLine2へ・・・ という風に各行へジャンプします。(Line1、Line2・・・は行ラベル) この場合numは数値として認識出来ないといけません。 従って、(2)の例ではErrオブジェクトの既定値はNumberプロパティなので、エラー番号で分岐するということではないのでしょうか。 ただし、例えばエラー番号12とかの場合、行ラベルを12個以上書かなくてはならないです。 ちなみに、Err(Err.Number)が0~255の範囲ならば、行ラベルの数が足りなくてもエラーにはなりません。 なお、GoToの後ろの行ラベルがカンマ区切りで複数書いていない場合は、ErrorをErrとタイプミスしているのかもしれません。

mas_sama
質問者

お礼

ご回答ありがとうございます。 ご指摘の通りタイプミスと判断しています。 問題も解決できそうです(^^)

関連するQ&A

  • 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 Error Goto ラベル ラベル内でエラー処理をしています。 エラー処理内でエラーが起こってしまう場合は無視して続けたいのですが、 ラベルの中に、 On Error Resume Next と書いてもダメでした。 On Error Goto 0にしてもダメでした。 どのようにすれば可能ですか?

  • EnableEventsとOn Errorの違い

    エクセル2010を使っている者ですが、VBAのことでお教えください。 Application.EnableEvents = False Application.EnableEvents = True といった、EnableEventsステートメントと、On Errorのステートメント (On Error Resume Next 等)は、役割としてどう違うのでしょうか。 いずれも、エラーに対処するためのものであることはわかるのですが、 役割の違いがわかりません。(特に、EnableEventsについては、以下の URLの回答を見ても理解できません) http://okwave.jp/qa/q3037406.html よろしくお願いいたします。

  • エクセルVBAでOn Error Resume Next

    エラーを回避するためにOn Error Resume Nextを使用することがありますが、その有効範囲について教えてください。 記述の在るプロシージャ内だけかと思っていたのですが、 どうも記述した以降、End Subのまでの間を超えて、そのプロシージャから呼び出す次のプロシージャ以降まで効いているみたいです。 ひょっとしてOn Error Goto 0で止めないと、連続しているプロシージャの最後まで有効なのでしょうか?

  • エラーが発生した場合は VBA

    Sub Sample() On Error GoTo Err1 Dim i As Integer i = "あ" '←ココで構文エラーとなる。 MsgBox "あ" Debug.Print "無事終了します" Exit Sub Err1: Debug.Print "エラーになりました" i = 1 Resume Next 'エラーの発生した次の行から処理を続行します。 End Sub このようなエラー処理で エラーが発生した場合は MsgBox "あ" ではなく i = "あ" '←ココで構文エラーとなる。 に戻る事は出来ないのでしょうか?

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

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

  • 【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に変えても同じ症状になってしまいます。 もしお詳しい方がいらっしゃいましたらアドバイスいただけないでしょうか。  どうぞよろしくお願いいたします。

  • ループの中で何度もエラー処理をしたい場合

    サンプルコードを掲載します。 実際はセルの文字を取得するのでこのコードとは違いますが、形は同じです。 Sub test() Dim i As Long On Error GoTo Err1 For i = 0 To 5 i = "a" Err1: Debug.Print i "は、エラーになりました" Next End Sub このようなコードの場合、 i=0の時に、1回目のエラーになって 「0は、エラーになりました」が返りますが、 その後、i=1になった時に i = "a"を実行すると On Error GoTo Err1が無視され、エラーになってしまいます。 ループの中でエラーが何度発生してもエラー処理をする方法はありますか? On Error Resume Next以外の方法で教えてください。

  • 超初心者です コマンドボタンのプロシージャの解説をお願いします

    超初心者です。どうかご教授願います。 フォームで、コントロールウィザードを使い、コマンドボタンを使うと、 プロシージャには、下記の記述となりますよね。 それぞれの項目の意味をご解説いただければと思います。 --------------------------------------------------- Private Sub コマンド1_Click()  -----------(1) On Error GoTo Err_コマンド1_Click  -----------(2) DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70  -----------(3) Exit_コマンド1_Click:  -----------(4) Exit Sub  -----------(5) Err_コマンド1_Click:  -----------(6) MsgBox Err.Description  -----------(7) Resume Exit_コマンド1_Click  -----------(8) End Sub  -----------(9) --------------------------------------------------- (1)・・・()は何の為にあるのですか?また、話は外れるのですが、「Click(Cancel As Integer)」とはどういう意味ですか? (2)・・・「エラー処理ルーチンを有効にする」というステートメントと本に書いてあるのですが、何のエラーですか? (3)・・・手持ちの本では全く分かりませんでした。各文字の意味からお教え願います。 (4)(6)・・・「Exit_コマンド1_Click」「Err_コマンド1_Click」という言葉は何ゆえ必要なのでしょうか?また最後の「:」は何を示しているのでしょうか? (5)・・・「ループやプロシージャから抜ける」と本に書いてあるのですが、この場合だと、何から抜けるのですか?抜けるとどこへ行くのですか? (7)・・・この場合だと、メッセージボックスには何が表示されるのですか? (8)・・・「Resume」はGoToとは何が違うのですか? (9)・・・「プロシージャやブロックを終了する」と本に書いてあるのですが、「Exit」とは何が違うのですか?

  • アクセスのVBAについて、フォームの On Error Goto についておしえてください。

    Private Sub cmd次_Click() On Error GoTo Err DoCmd.GoToRecord , , acNext Exit_Click: Exit Sub Err: MsgBox "この先にレコードがなくなると、ここをつうかするのだろうか。" Resume Exit_Click End Sub 一連の流れについて,ご解説ください。よろしくお願いいたします。

専門家に質問してみよう