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ステートメントってありますか?
あと使わない方が良いステートメント、私の勘違いでなければ教えてください。
No.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
No.6
- 回答日時:
すみません。
補足です。質問にある「使わない方がよい」というのは、恐らく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の間にある計算を行ってしまうので、注意が必要です。
No.5
- 回答日時:
少し書き方が違うかもしれませんが、私の場合、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はある回数まで繰り返し計算をするので、どちらも一長一短あります。
No.4
- 回答日時:
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は使わない方が良い」と
言えないことも無い・・とも考えることが出来るのかもしれません。
ただし、コレは本当に曲解です。
参考にはならないかもしれませんので、悪しからずご了承くださいませ。
No.3
- 回答日時:
>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で済みますので、こちらの使い方を一般的に使う方が
ほかの人にもわかりやすいと思うのは私だけでしょうか。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelVBAの転記について 1 2022/03/23 20:13
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ノットイコールを教えて下さい
-
win10で、正確な待ち時間の作り方
-
Excelでのセル内容の高速消去方法
-
VC++2010 GDIオブジェクトの解...
-
SQLの速度をあげるには・・・
-
基本情報技術者試験詳しい方へ...
-
DoEvents関数って何?
-
エクセルVBAで教えて頂きたいの...
-
C言語で、文字とか入力されなく...
-
VBでの簡易電卓の作成(減算方...
-
If Not c Is Nothing Then ~延...
-
ナップザック問題?をエクセル...
-
C言語プログラミングで、多項式...
-
LINUX QT上でパソコンのシャッ...
-
小数点を含む数値かどうか判断...
-
絶対パスの取得について
-
pgmファイルをC言語で読込、処...
-
実行時のCPU使用率を増やしたい
-
減色処理について
-
符号付きにすべきか、符号なし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
win10で、正確な待ち時間の作り方
-
小数点を含む数値かどうか判断...
-
SQLの速度をあげるには・・・
-
絶対パスの取得について
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
C言語:関数を使うメリットとデ...
-
テキストファイルの空行をスキ...
-
プログラム上のCPU稼働率低減に...
-
Excel(VBA)でSetTimer関数を使...
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム 擬似コードとはどん...
-
基本情報技術者試験詳しい方へ...
-
ノットイコールを教えて下さい
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
実行時のCPU使用率を増やしたい
おすすめ情報