• ベストアンサー

他言語で言うcontinue文

他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか? continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。 なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。 バージョンは Winエクセル2002 SP3 VBA Retail:6.4.8869, Version:9969 です。基本エンジンはVB6です。 よろしくお願いします。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.6

> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。 ループの最後へジャンプという感じですね。 VBなら、Nextへ飛ばすのと同じです。 For i = 1 To 5     If i = 3 Then goto Next_i     Debug.Print i Next_i: Next i

arakororin
質問者

お礼

なんかこのコードはすごくシンプルですね。 これなら記述してみたいなーなどと思いました。 if文ってend ifを書かなくてもいいんですね。 (いろいろな意味で)参考になりました。 ありがとうございました。

その他の回答 (6)

回答No.7

おせっかいとは思いながら、書かせてもらいます。 > 私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。 入れ子(ネスティング)が少ない程シンプルと言うのは、誤ったプログラム感です。 ネストは、構造化プログラミングではしょっちゅう出て来ます。 また、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回の繰り返しになります。

noname#22222
noname#22222
回答No.5

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文でしょう。 が、上も下も、どちらも、結果は同じです。

arakororin
質問者

お礼

「I = I + 1」を自分で行なってしまうのですね…。 これはちょっとという感じがします。 でも参考になりました。 ありがとうございました。

  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.4

しいて言うならば、GoTo文でしょうかね。 http://www2s.biglobe.ne.jp/~SATSYS/sutatomento.html でも、これを多用すると、制御のながれがわかりにくくなります。 if文を駆使して、同様なことができると思いますよ。

arakororin
質問者

お礼

ありがとうございます。 GOTO文はBASICの時代に書きました。懐かしいですね。いまだにそんなプログラムを書いていると「スパゲティ」とか言われちゃうんですよね。タブン。 VBのGoTo文ってなんか見難く感じます。慣れないからかもしれませんけど。 参考になりました。ありがとうございました。

回答No.3

VBにはcontinueはありません。 処理したい時のif文で処理を括る事で処理しないようにするか、 continueしたい所でgotoして、nextの手前に持って行かせるしかありません。

arakororin
質問者

お礼

あ、なるほど。 無理やりっぽくて美しくない気がするのでちょっと抵抗がありますが、論理的には完全に機能を実装できていますね。 参考になりました。ありがとうございました。

回答No.2

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文は、処理の流れを悪くするので、出来るだけ使わない方が良いと思います。

arakororin
質問者

お礼

ありがとうございます。 continueを使わない方法の場合、処理2が長い場合に多くの処理をif文の中に入れなければならないということですよね。実は現状がそんな感じです。 私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。 他言語で用意されているcontinueはそのような理念の下に用意されているのだと思っています。(違うかもしれませんが)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>ループ中の後続の処理をやめループの先頭に戻るという命令です。 この仕様では特に無いですね。 「ループを脱出(スキップ)して、次の処理に進む」ならありますが・・・。 continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。 http://www9.plala.or.jp/sgwr-t/c/sec06-7.html

arakororin
質問者

お礼

無いのですね。ありがとうございます。 continue文についてご存じないようですが、JavaでもCでもC++でもC#でもJavaScriptでもその他の言語でも共通した機能を持つ文ですので、知っておいた方がいいとおもいますよ。 http://www9.plala.or.jp/sgwr-t/c/sec06-7.htmlの説明でも continueはループのブロック終了の } の直前に処理をスキップしてから、 その後ループの先頭に戻ります。 とありますよ。

関連するQ&A