• ベストアンサー

ExcelのVBAのFor文について。

For i = ~  Aの処理   For k = ~    Bの処理   Next k  Cの処理 Next i という形があります。 ここでA処理でエラーが出るパターンがあるとします。そこで、Aの処理でエラーが出ても止まらずにC処理の下に飛んでFor iのNextが続行されるようにしたいのですが、どうすればいいでしょうか。エラーが出ない場合は、そのまま処理が実行されます

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは。お邪魔します。 自分なら、こんな風にします。 (Exit Sub は使いません。) ★マークの行は、テストの為にわざとエラーを出しています。 Sub Re8297159a()   Dim i As Long   Dim k As Long   For i = 1 To 4     On Error Resume Next     ' 処理a     If i And 1 Then Err.Raise 1004  '  ★iが奇数の時エラーを起こします。     If Err.Number = 0 Then       On Error GoTo 0       For k = 4 To 5         ' 処理b       Next k     End If     On Error GoTo 0     ' 処理c   Next i End Sub 【処理aの段階でのエラーが1回しかあり得ない】 という、特異な前提条件があればGoToの方が簡単ですが、 却ってGoTo文の方が、事を難しくする場合もあるような、、、。 処理b、処理cにもエラートラップを掛けるにしても、   On Error Resume Next ↓   処理 ↓   If Err.Number = 0 Then     On Error GoTo 0     エラーじゃない場合の処理   End If ↓     On Error GoTo 0 という流れは崩さずにいれば簡単にできるのではないでしょうか。 場合によっては     For k = 4 To 5       ' 処理b     Next k の部分をサブルーチンにしちゃう方がいいケースもありそうですけれど。 以上、ご参考まで。

mzakom
質問者

お礼

おお、できました!ありがとうございます。 エラーが発生してないときは時は“0”値が返ってきてるんですね。勉強になりましたm(_ _)m

その他の回答 (5)

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

#5、cjです。追加レスです。 ちょっと現実味がない書き方だったので、 エラーの場合にメッセージを表示するように追加します。 Sub Re8297159c()   Dim sErr As String   Dim i As Long   Dim k As Long   For i = 1 To 4     On Error Resume Next     ' 処理a     If i And 1 Then Err.Raise 1004  '  ★iが奇数の時エラーを起こします。     If Err.Number = 0 Then       On Error GoTo 0       For k = 4 To 5         ' 処理b       Next k     Else       sErr = sErr & vbLf _           & "i = " & i & vbTab & "ErrNum : " & Err & vbLf _           & vbTab & Err.Description     End If     On Error GoTo 0     ' 処理c   Next i   If sErr <> "" Then MsgBox "エラーだよ!" & vbLf & sErr End Sub それから、 処理aの内容、エラーソースなどによっては、 必ずしもErr オブジェクトを相手にする必要がないケースもあります。 例えば、エラーソースがExcel.Application の場合などでは、 Variant 型の変数にエラー値を格納して、その値を判別、なんて、 よくあるやり方です。 今回は、あくまでも一般論、ってことです。 追加レス、以上です。

mzakom
質問者

お礼

なるほど。本当に勉強になります。 ありがごとうございましたm(_ _)m

  • FEX2053
  • ベストアンサー率37% (7995/21381)
回答No.4

こっち見ました? http://excelvba.pc-users.net/fol6/6_8.html On Error GoTo ErrTrp For i = ~  Aの処理   For k = ~    Bの処理   Next k  Cの処理 :ErrTrp Next i ってことです。ただこれやっちゃうと、どんなエラーでも :ErrTrpに飛んでしまうので、ほかのエラーを完全に潰して からやらないと。 他のエラーの時に違う動作をさせたい場合は、もうひとひねり が必要です。

mzakom
質問者

補足

申し訳ありません。見逃していましたm(_ _)m ただ、何度か試行した結果、1回目のエラー回避は出来るのですが、2回目のエラーで止まってしまいます...何度のエラーも回避できる方法は無理なのでしょうか。

noname#187541
noname#187541
回答No.3

こんにちは。 Exit Subをどこに入れました? 通常はエラー処理を最後に記述し、その前にExit Subを入れるようにするのではないでしょうか。 今回の場合、処理がNext iまでだとすれば、その次にExit Subを入れ、その次からエラー処理を記述します。

mzakom
質問者

補足

こんにちは。回答ありがとうございます。 Exit Subを使わずに、Aの処理でエラーが出た場合にC処理の下に移動するだけで良いのですが中々良い案が見つからないで苦戦しています(^^;)

回答No.2

前の方が「On Error GoTo ラベル名」について紹介されいます

mzakom
質問者

補足

ありがとうございます。見逃していましたm(_ _)m

  • FEX2053
  • ベストアンサー率37% (7995/21381)
回答No.1

そういう時は「On Error」を使います。 http://officetanaka.net/excel/vba/statement/OnError.htm http://excelvba.pc-users.net/fol6/6_8.html ただ、単純にラベルに飛ばすだけじゃなく、できればメッセージを出すとか どこかのセルにエラー発生を書き込むとかした方が、後で検証するときに 分かりやすいですよ。

mzakom
質問者

補足

回答ありがとうございます。 「On Error」のやり方は見つけたのですが、エラーじゃない場合に「Exit Sub」で止まってしまうのです・・・ かといって、「On Error Resume Next」を使うと、エラー時の時にFor k = ~はスルーされないで、途方にくれています。 何か良い方法はないでしょうか・・・

関連するQ&A