• ベストアンサー

エラーが発生した場合は 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 = "あ" '←ココで構文エラーとなる。 に戻る事は出来ないのでしょうか?

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

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

こんにちは。 設問を抽象化し過ぎて、目的から逸れてしまい、 Sampleコードでは現実味が失われてしまったのではないでしょうか。 整数型の変数に文字列リテラルを代入しようとすれば、 エラーになるのは避けようがないですから、 整数リテラルを代入してから Resume Next する サンプルコードの構文自体は間違っていないです。 でも、この例で「'エラーの発生した...行」に戻る というのは、エラーを無限に繰り返すだけになってしまいますから。 察するに、一般的なお話として 「'エラーの発生した...行」に戻る構文の例 をお訊ねなのかと、 ということで、例として以下。 ' ' /// Sub RepSample() Dim v As Variant Dim i As Integer v = "あ" ' ' とか ' ' v = Cells(2, 3) ' ' とか ' ' v = Chr(55 + Int(4 * Rnd())) ' ' のように本来の題意は、未知の変動値を変数に格納する場合、なのだとして、、、。 On Error GoTo Err1 i = v '←ココで [実行時エラー'13'型が一致しません] となる。 On Error GoTo 0 MsgBox i Debug.Print "無事終了します" Exit Sub Err1: Debug.Print "エラーになりました" v = 1 Resume  'エラーの発生した行から処理を続行します。 ' ' または ' ' Resume 0 End Sub ' ' /// ただし、 On Error GoTo ErrHandle → [Resume / Resume Next] → On Error GoTo 0 のように エラーをクリアして、トラップを解除する、ことを確実に実行すること、 と、 エラーの原因を確実に解消して、 無限ループにならないように書くこと、 には特に注意してください。 また、 文字列型と整数型による 実行時エラー['13'型が一致しません] を回避する為にエラートラップを掛けるというのは、 多くの場合で、一般的、実践的な手法とは思えませんし、 私自身はVBAでは、かなり特殊なケースを除いて書くことのない構文です。 VarType関数やTypeName関数等で エラーを発生させることもなく条件分岐する方が 寧ろ多く扱われる正攻法である場合が多いように思います。 上に挙げた例は、あくまでも、実践を離れて、 概念としての理解をし易くする為に、敢えて書いたもの、 です。 各種オブジェクト型を扱う場合の、、、場合によっては、、、 積極的にエラートラップを使うことのメリットを 享受できる場面も少なからず実感できると思いますけれども、、、、。 余談ですが、 「構文エラー」(と「コンパイルエラー」)と「実行時エラー」とは、 概念としてはっきり区別して扱うように心掛けておいた方が、 実際のエラー処理の扱いに戸惑う機会を減らす事にも繋がるかと思いますです。 以上です。

agaempxxl
質問者

お礼

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

その他の回答 (3)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

そもそも、 Dim i As Integer としているのですから、変数「i」は整数を扱う数値変数です。 その「i」に「i = "あ"」とは何がしたいのですか? エラーになるのに決まっているではありませんか。

agaempxxl
質問者

お礼

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

  • SI299792
  • ベストアンサー率48% (708/1464)
回答No.2

可能です、 RESUMEの後に何も書かなければ、エラーが出た所に戻ります。 またResumeの後に、ラベルを指定すれば、好きな所に戻せます。 ’ 私は、VBでExplorerを制御しています。エラーになっても、しばらくたってから、リトライするプログラムにしています。 ’ また、次のような使い方も考えられます。シートの追加ですが、エラー処理で名前を変更しているので同じ所に戻っても繰り返しにはなりません。 ’ Sub SheetAdd(SheetName As String) ' シートを追加する。   Dim AddName As String 200 '   Sheets.Add After:=Sheets(Sheets.Count) '   On Error GoTo 100   ActiveSheet.Name = SheetName & AddName   On Error GoTo 0 '   Exit Sub 100 '   If Err <> 1004 Then     Error Err     End   End If   Count = Count + 1   AddName = "(" & Count & ")"   Resume 'Resume 200 にすれば強制的に200 へ飛ぶ ' End Sub '

agaempxxl
質問者

お礼

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

  • hiodraiu
  • ベストアンサー率15% (447/2818)
回答No.1

出来無いと思いますよ。 だって、また同じエラーが発生して、エラー処理に入って、また同じ所に戻ってって繰り返すだけですよね。そんな無意味な動作はさせないと思いますよ。

agaempxxl
質問者

お礼

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

関連するQ&A

  • 二つのエラーを発生させたい

    ひとつのプロシージャー内で、 二つのエラートラップを仕掛ける事は出来ないのでしょうか? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description On Error GoTo Err2 i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub を行うと、 i = "b" で2回目のエラーが発生した時は、 実行時エラーになってしまいます。 i = "b" で2回目のエラーが発生した時に、 「Err2のエラー: 型が一致しません。」 と表示させるにはどうすればいいでしょう? Sub エラーが発生した時にエラーが発生したら() Dim i As Long On Error GoTo Err1 On Error GoTo Err2 i = "a" Exit Sub Err1: MsgBox "Err1のエラー: " & Err.Description i = "b" Exit Sub Err2: MsgBox "Err2のエラー: " & Err.Description End Sub にすると、 i = "a" のエラーで、 「Err2のエラー: 型が一致しません。」 へ移動してしまいます。

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

    サンプルコードを掲載します。 実際はセルの文字を取得するのでこのコードとは違いますが、形は同じです。 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以外の方法で教えてください。

  • アクセスの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 一連の流れについて,ご解説ください。よろしくお願いいたします。

  • 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 宜しくお願いします。

  • EXCEL VBA のエラー処理

    EXCEL VBA でセルの文字列を読み(基本的に2007/05/08のような日付データが入っている)、 もしそれ以外のデータ("あいう"のような文字列)が入っていた場合はエラールーチンに飛ばして処理をしようと思ったのですが、 エラーが発生して、発生箇所が黄色く反転表示され、止まったままになってしまいます。 エラールーチンに飛ばすためにはどうしたらいいのでしょうか? Sub test() Dim LineNo As Integer Dim WrkDate As Date On Error GoTo Err LineNo = 1 WrkDate = Range("S" & LineNo).Value ←ここが黄色く反転表示される。 WrkDate = WrkDate + 7 Range("X" & LineNo).Value = WrkDate GoTo Owari Err: (処理ルーチン) Owari: End Sub

  • VBでのエラー処理(On Error)

    VBで以下のようなプログラムを書いています。 sub On Error goto Err 処理1 Err: 処理2 End sub 処理1でエラーが発生した場合、Err:の処理に入ってくるのですが、もしErr:の中の処理2でもエラーが発生した場合、どうすればよいのでしょうか? Err:の中でもエラー処理ができるのでしょうか、それともロジックで回避しなければならないのでしょうか? ご存知の方がいらっしゃいましたら宜しくお願いします。

  • access vba 構文の解読

    access vba 構文の解読 はじめまして先ほどaccess2003について質問させていただいたものです。以下の構文が先ほどの続きです。こちらも皆様のお力で構文を解読していただけないでしょうか。 すみません解読とは、構文の一行一行が何を示しているのか教えていただけると助かります。 よろしくお願いいたします。 ' Exit the application. Case conCmdExitApplication CloseCurrentDatabase ' Run a macro. Case conCmdRunMacro DoCmd.RunMacro rs![Argument] ' Run code. Case conCmdRunCode Application.Run rs![Argument] ' Open a Data Access Page Case conCmdOpenPage DoCmd.OpenDataAccessPage rs![Argument] ' Any other command is unrecognized. Case Else MsgBox "不明なオプションです。" End Select ' Close the recordset and the database. rs.Close HandleButtonClick_Exit: On Error Resume Next Set rs = Nothing Set con = Nothing Exit Function HandleButtonClick_Err: ' If the action was cancelled by the user for ' some reason, don't display an error message. ' Instead, resume on the next line. If (Err = conErrDoCmdCancelled) Then Resume Next Else MsgBox "コマンド実行中のエラーです。", vbCritical Resume HandleButtonClick_Exit End If End Function Private Sub メニュー終了_Click() On Error GoTo Err_メニュー終了_Click DoCmd.Close Exit_メニュー終了_Click: Exit Sub Err_メニュー終了_Click: MsgBox Err.Description Resume Exit_メニュー終了_Click End Sub Private Sub 終了_Click() On Error GoTo Err_終了_Click DoCmd.Quit Exit_終了_Click: Exit Sub Err_終了_Click: MsgBox Err.Description Resume Exit_終了_Click End Sub

  • アクセスVBAのエラーについて

    フォームを閉じるためにフォームにボタンを置いて、イベントプロシージャに下記のように書き込みました。すると添付画像のエラーが返ってきてマクロが動きません。 Private Sub コマンド103_Click() On Error GoTo Err_コマンド103_Click DoCmd.Close Exit_コマンド103_Click: Exit Sub Err_コマンド103_Click: MsgBox Err.Description Resume Exit_コマンド103_Click End Sub で、「ファイル-オプション-現在のデータベース」の”フォームの表示”を問題のフォームに切り替えたら問題なく動作します。 つまり”フォームの表示”で選んだフォームでしかコマンドボタンのマクロが動きません。全てのフォームでマクロが動くにはどうしたらよいのでしょうか?

  • GoToRecordで実行時エラー '2105'

    教えてください。Access2000です。 Private Sub 次へ_Click() On Error GoTo Err_次へ_Click On Error Resume Next DoCmd.GoToRecord , , acNext Exit_次へ_Click: Exit Sub Err_次へ_Click: MsgBox ERR.Description Resume Exit_次へ_Click End Sub って書いたのですが、最後のレコードまで行った後 「次へ」をクリックすると実行時エラーになってしまいます。 移動できませんとかメッセージで逃げたいのですがどうすればいいのでしょうか? お願いします。

  • vba 365日の日付を順番に取得したい

    イミディエイトウインドウに 2015/01/01 2015/01/02 2015/01/03 ・ ・ ・ 2015/12/31 まで表示させたいので Dim i As Integer For i = 1 To 365 Debug.Print (#1/1/2015#) Next のような雛形を作りました。 この状態で実行すれば 365個の2015/01/01 が表示されてしまうので Debug.Print (#1/"& i &"/2015#) にしたのですが 構文エラーになってしまいます。 2015/01/01 2015/01/02 2015/01/03 ・ ・ ・ 2015/12/31 を取得するにはどのようなコードを書けばいいのでしょうか?

専門家に質問してみよう