プロが教える店舗&オフィスのセキュリティ対策術

他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか?

continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。

なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。

バージョンは
Winエクセル2002 SP3
VBA Retail:6.4.8869, Version:9969
です。基本エンジンはVB6です。

よろしくお願いします。

A 回答 (7件)

>ループ中の後続の処理をやめループの先頭に戻るという命令です。



この仕様では特に無いですね。

「ループを脱出(スキップ)して、次の処理に進む」ならありますが・・・。
continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。

http://www9.plala.or.jp/sgwr-t/c/sec06-7.html
    • good
    • 0
この回答へのお礼

無いのですね。ありがとうございます。

continue文についてご存じないようですが、JavaでもCでもC++でもC#でもJavaScriptでもその他の言語でも共通した機能を持つ文ですので、知っておいた方がいいとおもいますよ。

http://www9.plala.or.jp/sgwr-t/c/sec06-7.htmlの説明でも
continueはループのブロック終了の } の直前に処理をスキップしてから、 その後ループの先頭に戻ります。

とありますよ。

お礼日時:2006/03/14 11:48

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

ありがとうございます。

continueを使わない方法の場合、処理2が長い場合に多くの処理をif文の中に入れなければならないということですよね。実は現状がそんな感じです。

私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。

他言語で用意されているcontinueはそのような理念の下に用意されているのだと思っています。(違うかもしれませんが)

お礼日時:2006/03/14 12:56

VBにはcontinueはありません。


処理したい時のif文で処理を括る事で処理しないようにするか、
continueしたい所でgotoして、nextの手前に持って行かせるしかありません。
    • good
    • 0
この回答へのお礼

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

参考になりました。ありがとうございました。

お礼日時:2006/03/14 13:00

しいて言うならば、GoTo文でしょうかね。


http://www2s.biglobe.ne.jp/~SATSYS/sutatomento.h …
でも、これを多用すると、制御のながれがわかりにくくなります。
if文を駆使して、同様なことができると思いますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。

GOTO文はBASICの時代に書きました。懐かしいですね。いまだにそんなプログラムを書いていると「スパゲティ」とか言われちゃうんですよね。タブン。

VBのGoTo文ってなんか見難く感じます。慣れないからかもしれませんけど。

参考になりました。ありがとうございました。

お礼日時:2006/03/14 14:09

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文でしょう。
が、上も下も、どちらも、結果は同じです。
    • good
    • 0
この回答へのお礼

「I = I + 1」を自分で行なってしまうのですね…。
これはちょっとという感じがします。

でも参考になりました。
ありがとうございました。

お礼日時:2006/03/14 16:57

> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。



ループの最後へジャンプという感じですね。
VBなら、Nextへ飛ばすのと同じです。

For i = 1 To 5
    If i = 3 Then goto Next_i
    Debug.Print i
Next_i:
Next i
    • good
    • 7
この回答へのお礼

なんかこのコードはすごくシンプルですね。
これなら記述してみたいなーなどと思いました。
if文ってend ifを書かなくてもいいんですね。

(いろいろな意味で)参考になりました。
ありがとうございました。

お礼日時:2006/03/14 17:29

おせっかいとは思いながら、書かせてもらいます。



> 私は入れ子はできるだけなくし、入れ子構造の少ないシンプルなプログラムにしたいと思っているのです。

入れ子(ネスティング)が少ない程シンプルと言うのは、誤ったプログラム感です。
ネストは、構造化プログラミングではしょっちゅう出て来ます。
また、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回の繰り返しになります。
    • good
    • 6

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!