- ベストアンサー
他言語で言うcontinue文
他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか? continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。 なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。 バージョンは Winエクセル2002 SP3 VBA Retail:6.4.8869, Version:9969 です。基本エンジンはVB6です。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。 ループの最後へジャンプという感じですね。 VBなら、Nextへ飛ばすのと同じです。 For i = 1 To 5 If i = 3 Then goto Next_i Debug.Print i Next_i: Next i
その他の回答 (6)
- ekuko_ecch
- ベストアンサー率17% (16/91)
おせっかいとは思いながら、書かせてもらいます。 > 私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。 入れ子(ネスティング)が少ない程シンプルと言うのは、誤ったプログラム感です。 ネストは、構造化プログラミングではしょっちゅう出て来ます。 また、gotoやcontinueは、構造化プログラミング(先代的と捉えられるプログラミング技法)ですら使いません。多重ループからの脱出で使うbreak文(C言語)ですら、敬遠されています。 それに、if文のネストってうまく作れば1重で済みます。 VBにはelse if文はありませんでしたっけ? でもVBは、select case文が強力ですよね。 > 他言語で用意されているcontinueはそのような理念の下に用意されているのだと思っています。(違うかもしれませんが) 全然違います。アセンブリ言語の残骸みたいなものです。 私は、gotoやcontiueを多用しなければならないプログラムは、アルゴリズムから見直した方が好いと感じています。 for文が例になっていますが、0~19, 23~55, 58~77, 85~99を繰り返すとき、 for 0~99 if 20~22 then continue; // forに飛ぶ。 end if if 56~57 then continue; // forに飛ぶ。 end if if 78~84 then continue; // forに飛ぶ。 end if 0~19, 23~55, 58~77, 85~99のときしたい処理。 next よりも、 for 0~19 0~19のときしたい処理。 next for 23~55 23~55のときしたい処理。 next for 58~77 58~77のときしたい処理。 next for 85~99 85~99のときしたい処理。 next とする方が、速度的にも速くなります。 はじめのプログラムでは、100回の繰り返し×3回のif文がありますが、 あとのプログラムでは、4回の初期化と20+32+19+14=85回の繰り返しになります。
Private Sub CommandButton2_Click() Dim I As Integer For I = 1 To 5 Top: If I <> 3 Then Debug.Print I Else I = I + 1 GoTo Top End If Next I End Sub Private Sub CommandButton2_Click() Dim I As Integer For I = 1 To 5 I = I - (I=3) Debug.Print I Next I End Sub 1 2 4 5 強いて言うならば、やっぱ、Goto文でしょう。 が、上も下も、どちらも、結果は同じです。
お礼
「I = I + 1」を自分で行なってしまうのですね…。 これはちょっとという感じがします。 でも参考になりました。 ありがとうございました。
- kokorone
- ベストアンサー率38% (417/1093)
しいて言うならば、GoTo文でしょうかね。 http://www2s.biglobe.ne.jp/~SATSYS/sutatomento.html でも、これを多用すると、制御のながれがわかりにくくなります。 if文を駆使して、同様なことができると思いますよ。
お礼
ありがとうございます。 GOTO文はBASICの時代に書きました。懐かしいですね。いまだにそんなプログラムを書いていると「スパゲティ」とか言われちゃうんですよね。タブン。 VBのGoTo文ってなんか見難く感じます。慣れないからかもしれませんけど。 参考になりました。ありがとうございました。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
VBにはcontinueはありません。 処理したい時のif文で処理を括る事で処理しないようにするか、 continueしたい所でgotoして、nextの手前に持って行かせるしかありません。
お礼
あ、なるほど。 無理やりっぽくて美しくない気がするのでちょっと抵抗がありますが、論理的には完全に機能を実装できていますね。 参考になりました。ありがとうございました。
- ekuko_ecch
- ベストアンサー率17% (16/91)
VB 6.0の回答ではなくなってしまいますが、アルゴリズム的にマッチすると思いますのでお許し下さい。 continue文を使うと言うことは、ある条件によってその先を実行しないと言うことですね。 例 for文 処理1; if 条件1 then continue; end if 処理2 next文 for文で指定回数繰り返すけど、条件1によっては処理2を飛ばすと言うことを考えると、次のように書き変えられます。 「条件1が成立したら飛ばす」のではなく「条件1が不成立だったら実行する」に発想を切り替えます。 for文 処理1; if !条件1 then // !は、条件1の逆を示す。 処理2 end if next文 continue文は、処理の流れを悪くするので、出来るだけ使わない方が良いと思います。
お礼
ありがとうございます。 continueを使わない方法の場合、処理2が長い場合に多くの処理をif文の中に入れなければならないということですよね。実は現状がそんな感じです。 私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。 他言語で用意されているcontinueはそのような理念の下に用意されているのだと思っています。(違うかもしれませんが)
- hana-hana3
- ベストアンサー率31% (4940/15541)
>ループ中の後続の処理をやめループの先頭に戻るという命令です。 この仕様では特に無いですね。 「ループを脱出(スキップ)して、次の処理に進む」ならありますが・・・。 continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。 http://www9.plala.or.jp/sgwr-t/c/sec06-7.html
お礼
無いのですね。ありがとうございます。 continue文についてご存じないようですが、JavaでもCでもC++でもC#でもJavaScriptでもその他の言語でも共通した機能を持つ文ですので、知っておいた方がいいとおもいますよ。 http://www9.plala.or.jp/sgwr-t/c/sec06-7.htmlの説明でも continueはループのブロック終了の } の直前に処理をスキップしてから、 その後ループの先頭に戻ります。 とありますよ。
お礼
なんかこのコードはすごくシンプルですね。 これなら記述してみたいなーなどと思いました。 if文ってend ifを書かなくてもいいんですね。 (いろいろな意味で)参考になりました。 ありがとうございました。