[[20050411143809]] 『For〜Nextで処理続行の場合』(純丸) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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.