[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『For〜Nextで処理続行の場合』(純丸)
いつもお世話さまです。 さて、For〜Next文の中で、マクロから抜けるには Exit Sub ループを抜けるには Exit For というステーテメントがありますが、 途中の処理を省略して次のループに行く場合のステートメントは ありますか? 無ければ Next の前にラベルを作って、GoTo文で途中を 跳ばすような処理になると思うのですが。 ひょっとしたら途中でも (例えば IF文の中で)Next が使える? ↑ やってみたけどダメだった。 (純丸)(o^-')b
>やってみたけどダメだった。 どのような記述を試されたのでしょうか?
>途中の処理を省略して次のループに行く場合のステートメントは 「途中の処理を省略する条件」により、 IF文で処理を場合分けするのとは違うのでしょうか?
(INA)
>どのような記述を試されたのでしょうか?
Sub test() Dim i As Integer For i = 1 To 10 If i = 5 Then Next i '5なら次へ End If Cells(i, 1).Value = Cells(i, 1).Row Next i End Sub
iが5の時は処理をしないで次のループに行くという意味で 上記のマクロでテストしてみたら「コンパイルエラー、Nextに 対するForがありません。」となったのでダメだったと書きました。 やりたい事はこんな風に If文で iの値により直接次へ行きたいのです。 もちろん i<>5 Then 処理 にすればするというような簡単なことでは ないので、一語で Next 出来たらなぁと思ったのです。 (純丸)(o^-')b
ループが5で終わりなら、最初から For i = 1 To 5 ではダメですか。 って、よく見たら、6から再開するのね・・・(^_^A; 純丸さんが書いておられるように、
Sub test() Dim i As Long For i = 1 To 10 If i <> 5 Then Cells(i, 1).Value = Cells(i, 1).Row End If Next i End Sub
で、いけるような気がしますけど・・・。
(川野鮎太郎)
鮎さん、ご無沙汰です。上記はあくまで「途中でNextが使えるかどうか?」を 実験するために書いたコードです。実際はそう単純でなく途中で何回も 条件が出てきて、そのたびに跳ばす処理がしたいのです。 一語ですむステートメントがなければ上で書いたように、Nextの 直前にラベルを作ってGoToさせるつもりです。 (純丸)(o^-')b
VBAは得意じゃないですけど、昔私が使った手口は、 If i=5 Then i=i+1 みたいのはどうですか? はずしてたら、ゴメンナサイ。 (sato)
衝突しました。
(*'へ'*) んー、難しいことはわかりませんけど、 Sub test() Dim i As Long For i = 1 To 10 If i = 5 Then i = i + 1 End If Cells(i, 1).Value = Cells(i, 1).Row Next i End Sub
でいけそうですけど、以前にご近所さんがループ変数をいじるのは(;`O´)oダメーー!!って 言っておられたから、不都合があるかもしれませんね。(^_^A;
内容はsatoさんと同じだった。(^_^A;
なぜループ変数をいじるといけないかは、以下に詳しく書いてありました。(長々と(笑)) [[20041025165459]]『マクロで勤怠管理すると...』(キリキ)
(川野鮎太郎)
If文 か Select Case で処理を場合分けして、 必要に応じてGoTo文を加えるのが一般的だと思います。
Sub test() Dim i As Long For i = 1 To 10 If i = 5 Then Goto myNext '5なら次へ Cells(i, 1).Value = Cells(i, 1).Row
myNext: Next i End Sub
>ループ変数をいじる 可読性を犠牲にしてまで、コードの行数を短くする必要はないですから 私は使わないですね。
※On...GoSub、On...GoTo ステートメントなんてのもありますけど、 これも使わない方が良いと思います。 (INA)
To satoさん、鮎さん。 なるほど、 カウンタを1つ増やしちゃう訳ですね。これはこれで使える場合が ありそうです。 と書いたら 衝突☆! 避けた方がいい処理のようですね。 To INAさん やはり Goto文で処理する方法になる訳ですね。わかりました。 皆さん、ありがとうございました。 (純丸)(o^-')b
衝突。私がやるとこうなる。 Dim i As Long, k As Long Dim ans As Boolean Sub test() For i = 1 To 10 For k = 1 To 3 Chk If ans Then Cells(i, k).Value = Cells(i, k).Row Next k Next i End Sub
Function Chk() ans = True If i = 5 Or k = 2 Then ans = False Exit Function End If End Function (みやほりん)(-_∂)b
みやほりんさん、勉強になります。続行する条件を別プロシージャに する訳ですね。今後研究していきます。ありがとうございました。 (純丸)(o^-')b
>別プロシージャにする よほど行数の多い処理か、もしくは、汎用的な処理でないと、 可読性が低下するだけで、冗長になってしまいますので、注意が必要ですね。
Function プロシージャを使うなら値を返して・・・
Sub test() Dim i As Long, k As Long For i = 1 To 10 For k = 1 To 3 If Chk(i, k) Then Cells(i, k).Value = Cells(i, k).Row Next k Next i End Sub
Function Chk(ByVal x As Long, ByVal y As Long) As Boolean Chk = True If x = 5 Or y = 2 Then Chk = False End Function
(INA)
INAさん、遅れてすみません。多分INAさんが心配されているような事には なりません。何故なら私のスキルがそこまで無いので今はまだ無理です。 書いていただいたコード、と言うか考え方についてはいずれ応用させて いただきたいと思います。(いつになるか・・) (純丸)(o^-')b
名前が登場してたのでチョロリと。 For〜Nextで「ある条件の場合は次へ」と言った記述が出来ないのはVBの仕様なのでどうしようもない所です。 他の言語だと、そう言った命令もあるのですが。 VBにおける解決策は既に出ている通り。 その中で自分がやるとしたら、やはりGOTO文使います。 ラベルのつけ方も自分なりに必ずこうする、といった自分ルールを決めた上で使います。 NEXT_I: とか、必ずそれがFor〜Nextの為のラベルなのだと分かるようなもので。
蛇足。一般論。 goto文は極力使わない。 使う場合、goto文でステップが逆行するような方向には書かない。 上から下へ移動するのみと限定。 だがそれにより可読性が良くなるのならばその限りではない。 (ご近所PG)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.