プロが教えるわが家の防犯対策術!

Do~Loopステートメントで使わな方が良いステートメントとは?

Do~Loopステートメントで「古いから使わない方がよい」、と言われたことがあるのですが
どれの事だか忘れてしまいました。

Sub test()
セルのA1~A10に1~10を入力する
i = 1
Do While i < 11
Worksheets("Sheet1").Cells(i, 1).Value = i
i = i + 1
Loop
End Sub

これは一般的だから使ってもよいと思います。

Sub test()
セルのA1~A10に1~10を入力する
i = 1
Do Until i = 11
Worksheets("Sheet1").Cells(i, 1).Value = i
i = i + 1
Loop
End Sub

これもよく見かけます。

Do While,Do Until以外にもloopステートメントってありますか?
あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

A 回答 (7件)

> 使わない方が良いステートメント



もしかしたらなのですが、そう言われたのは、「Do Loop」ではなく
「While Wend」ステートメントではないでしょうか。
http://msdn.microsoft.com/ja-jp/library/cc392467 …

これであれば、上記サイトの『解説』の中の『メモ』にもある通り、
「Do...Loop ステートメントを使用すると、より構造化された柔軟な
ループを記述することができます」ということで、敢えて使う必要は
ない、ということになるかと思います。
(要は、「Do Loop」の終了条件の「While」と、「While Wend」の
 「While」が混同されて記憶に残ってしまったのではないか・・・と)


なお、「Do Loop」と「For Next」の処理速度については、こちらの
サイトが参考になるかと思います:
http://www.tsware.jp/labo/labo_17.htm

この回答への補足

「While Wend」の事だと思います!

補足日時:2012/12/27 20:25
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

すみません。

補足です。

質問にある「使わない方がよい」というのは、恐らくuntilやwhileの書き方の問題では?と思います。

例えば以下のような単純なマクロで考えてみましょう。

Sub 例題()
Dim i As Integer
i = 0
Do Until i = 11
i = i + 1
Loop
Range("A1").Value = i
End Sub

この時は i=11となります

ところがDo Whileではi=0です。

この様にuntilやwhileの位置を変えてマクロを走らせると以下のような結果になります。

Do Until i=11
Do While i=0
Loop Until i=11
Loop While i=1

Do側に条件がある場合はその条件が満たされているかを判断し、満たされてなければDo~Loopの間を計算をします。

Loop側に条件がある場合はDo~Loop側の計算を1回行ったあと、条件が満たされているかを判断しています。

つまりLoop側だと必ず1回はDo~Loopの間にある計算を行ってしまうので、注意が必要です。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

少し書き方が違うかもしれませんが、私の場合、Do側にもLoop側にもuntilやwhileは付けないですね。


もちろん、この状態でもマクロは動きます。

ただし、このままマクロを走らせると計算が終了しないので、exit doを利用しています。

結局はuntilやwhileとあまり変わらないのですが、複数の条件(select caseやifとelseifの組み合わせ)でDo Loopを止める事が出来るのでこの方法を利用しています。

後は下記の回答者様にもあるようにFor (i=a to b Step c) Next
が繰り返し計算のステートメントでしょうか。

Do Loopはある条件を満たした場合、For Nextはある回数まで繰り返し計算をするので、どちらも一長一短あります。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

  Do


    処理
  Loop Until(While) 条件
と言う使い方も(おそらく)一般的です。

が、感覚の違いかもしれませんが、
  For 条件(回数)
    処理
  Next
の方が、体感的に処理が早いような気がします。
私はどうしても「正確に、もっと早く処理を行えないか?」にこだわる悪い癖があるので、
繰り返しの条件(回数)が明確に出来る場合は、私はFor~Nextを好んで使います。
参考)http://officetanaka.net/excel/vba/speed/index.htm


例えば「(空白が無いとして)最終行まで」の処理であれば、
・条件となる列が空白になるまで
  Loop Until Cells(i , 1) = ""
・.End(xlUp).Row などを使って見つけた最終行まで
  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
は(ほぼ)同じ処理をしますが、私は後者を好みます。
「早いような気がするから」です。

ただ、もう一つ理由を挙げるとしたら、
この場合、A列の途中に空白がある
「1~100行までデータがあって、50行目が空白」
と言った場合、Do~Loopで繰り返しを定義すると50行目で止まってしまいます。
対し、For~Nextで定義をすると、100行目まで全て処理を行いますね。
(ちなみに「途中で空白があったら止める」なら、Exit For で抜けることもできます。)

こう言ったケースを考えると、Do~LoopよりもFor~Nextの方が使いやすい、
と言うのが私の考え方です。
コレを考えると、極論ではありますが「Do~Loopは使わない方が良い」と
言えないことも無い・・とも考えることが出来るのかもしれません。

ただし、コレは本当に曲解です。
参考にはならないかもしれませんので、悪しからずご了承くださいませ。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

>Do~Loopステートメントで「古いから使わない方がよい」、


>と言われたことがあるのですが
どちらが古いとかはないと思いますが、繰り返しの処理には
Do~Loop と For~Nextがあります。

ちなみみに Do~Loopの使い道は
Do While 条件 ~ Loop
Do Util 条件 ~ Loop
Do ~ Loop While 条件
Do ~ Loop Until 条件と使い分けができます。

For 変数=初期 最終値 ~ Next
で最初に繰り返す回数を指定する必要があります。
上記の質問のコードでは For~Nextで十分ですよね。
For i=1 To 11
Worksheets("Sheet1").Cells(i, 1).Value = i
Next

Do~Loopの場合では
i=i+1 の変数を加算する必要がありますし
繰り返しのたびに、条件の合否をパソコンに確認させますので
パソコンの負担でもFor~Nextの方が無難でしょうし
コードもわかりやすくなります。
データベース関連では
Do Until EOF() などの使い道で、Do~Loopを使用する人も多いですが
ほとんどの場合は、For~Nextで済みますので、こちらの使い方を一般的に使う方が
ほかの人にもわかりやすいと思うのは私だけでしょうか。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

回答では無いかもですが



こういった単純ループ(ループ回数が固定なもの)については、
For ~ Next の方がわかりやすいんでは?
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:25

私は使わないが、Loopの方に条件を書く人はいる。



4.Do~Loopステートメント
http://excelvba.pc-users.net/fol6/6_4.html
    • good
    • 0
この回答へのお礼

どうもありがとうございました。

お礼日時:2012/12/27 20:24

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