- ベストアンサー
ExcelのVBAのFor文について。
For i = ~ Aの処理 For k = ~ Bの処理 Next k Cの処理 Next i という形があります。 ここでA処理でエラーが出るパターンがあるとします。そこで、Aの処理でエラーが出ても止まらずにC処理の下に飛んでFor iのNextが続行されるようにしたいのですが、どうすればいいでしょうか。エラーが出ない場合は、そのまま処理が実行されます
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。お邪魔します。 自分なら、こんな風にします。 (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 の部分をサブルーチンにしちゃう方がいいケースもありそうですけれど。 以上、ご参考まで。
その他の回答 (5)
- cj_mover
- ベストアンサー率76% (292/381)
#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 型の変数にエラー値を格納して、その値を判別、なんて、 よくあるやり方です。 今回は、あくまでも一般論、ってことです。 追加レス、以上です。
お礼
なるほど。本当に勉強になります。 ありがごとうございましたm(_ _)m
- FEX2053
- ベストアンサー率37% (7995/21381)
こっち見ました? 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に飛んでしまうので、ほかのエラーを完全に潰して からやらないと。 他のエラーの時に違う動作をさせたい場合は、もうひとひねり が必要です。
補足
申し訳ありません。見逃していましたm(_ _)m ただ、何度か試行した結果、1回目のエラー回避は出来るのですが、2回目のエラーで止まってしまいます...何度のエラーも回避できる方法は無理なのでしょうか。
こんにちは。 Exit Subをどこに入れました? 通常はエラー処理を最後に記述し、その前にExit Subを入れるようにするのではないでしょうか。 今回の場合、処理がNext iまでだとすれば、その次にExit Subを入れ、その次からエラー処理を記述します。
補足
こんにちは。回答ありがとうございます。 Exit Subを使わずに、Aの処理でエラーが出た場合にC処理の下に移動するだけで良いのですが中々良い案が見つからないで苦戦しています(^^;)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
前の方が「On Error GoTo ラベル名」について紹介されいます
補足
ありがとうございます。見逃していましたm(_ _)m
- FEX2053
- ベストアンサー率37% (7995/21381)
そういう時は「On Error」を使います。 http://officetanaka.net/excel/vba/statement/OnError.htm http://excelvba.pc-users.net/fol6/6_8.html ただ、単純にラベルに飛ばすだけじゃなく、できればメッセージを出すとか どこかのセルにエラー発生を書き込むとかした方が、後で検証するときに 分かりやすいですよ。
補足
回答ありがとうございます。 「On Error」のやり方は見つけたのですが、エラーじゃない場合に「Exit Sub」で止まってしまうのです・・・ かといって、「On Error Resume Next」を使うと、エラー時の時にFor k = ~はスルーされないで、途方にくれています。 何か良い方法はないでしょうか・・・
お礼
おお、できました!ありがとうございます。 エラーが発生してないときは時は“0”値が返ってきてるんですね。勉強になりましたm(_ _)m