• ベストアンサー

エラーが発生した場合は 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
  • ベストアンサー率47% (772/1616)
回答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% (451/2846)
回答No.1

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

agaempxxl
質問者

お礼

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