Do~Loopステートメントの使い方と注意点

このQ&Aのポイント
  • Do~Loopステートメントを使用する際の注意点とは?
  • Do~Loopステートメントで使われる代表的な方法とは?
  • Do While, Do Until以外のループステートメントについて教えてください。
回答を見る
  • ベストアンサー

Do~Loopステートメント

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ステートメントってありますか? あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.7

> 使わない方が良いステートメント もしかしたらなのですが、そう言われたのは、「Do Loop」ではなく 「While Wend」ステートメントではないでしょうか。 http://msdn.microsoft.com/ja-jp/library/cc392467.aspx これであれば、上記サイトの『解説』の中の『メモ』にもある通り、 「Do...Loop ステートメントを使用すると、より構造化された柔軟な ループを記述することができます」ということで、敢えて使う必要は ない、ということになるかと思います。 (要は、「Do Loop」の終了条件の「While」と、「While Wend」の  「While」が混同されて記憶に残ってしまったのではないか・・・と) なお、「Do Loop」と「For Next」の処理速度については、こちらの サイトが参考になるかと思います: http://www.tsware.jp/labo/labo_17.htm

nfrxwwbeca
質問者

お礼

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

nfrxwwbeca
質問者

補足

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

その他の回答 (6)

  • ryo_ky
  • ベストアンサー率47% (112/237)
回答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の間にある計算を行ってしまうので、注意が必要です。

nfrxwwbeca
質問者

お礼

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

  • ryo_ky
  • ベストアンサー率47% (112/237)
回答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はある回数まで繰り返し計算をするので、どちらも一長一短あります。

nfrxwwbeca
質問者

お礼

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

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答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は使わない方が良い」と 言えないことも無い・・とも考えることが出来るのかもしれません。 ただし、コレは本当に曲解です。 参考にはならないかもしれませんので、悪しからずご了承くださいませ。

nfrxwwbeca
質問者

お礼

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

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答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で済みますので、こちらの使い方を一般的に使う方が ほかの人にもわかりやすいと思うのは私だけでしょうか。

nfrxwwbeca
質問者

お礼

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

回答No.2

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

nfrxwwbeca
質問者

お礼

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

回答No.1

私は使わないが、Loopの方に条件を書く人はいる。 4.Do~Loopステートメント http://excelvba.pc-users.net/fol6/6_4.html

nfrxwwbeca
質問者

お礼

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

関連するQ&A

  • VBA 九九 Do While

    VBAのDo Whileステートメントを使って九九の表をつくりたいのですが、何度やっても途中で詰まり、実行に至りません。 For NextとDo untilではできたと思うのですがDo Whileがどうしてもわからなくて… どなたか助けてください。お願いします。 Sub 九九計算_for() Dim i, j As Integer For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i * j Next Next End Sub Sub 九九計算_do_until() j = 1 Do i = 1 Do Cells(j, i).Value = i * j i = i + 1 Loop Until i = 10 j = j + 1 Loop Until j = 10 End Sub

  • Do..Loopステートメントの使い方について

    現在、入門書を画面で確認しながら ExcelVBAの勉強をしています。 Do...Loopで躓いてしまいました。 Do...Loopステートメントの種類は 条件を満たすまでループするもの Do Until...Loop(ループの前で条件判断) Do...Loop Until(ループの後で条件判断) 条件を満たす間はループするもの Do While...Loop(ループの前で条件判断) Do...Loop While(ループの後で条件判断) とあって、 例えば、A1からA7まで文字が入力されていて 空白のセルになるまで太文字にするとしたら、 ループの前に条件判断していると A1が空白だと処理はされず ループの後で条件判断すると A1が空白でも処理はされる とありました。 とすると、 条件判断はループ後にした方が良いと言う事なのでしょうか。 (空白でも処理してくれるので) 自分が処理したいものが ループ「後」にするのか又は ループ「前」にするのか どのように判断すれば良いのかと言うことと、 また、 条件を満たすUntil(まで)とWhile(間) どちらを使用すれば良いのかの判断方法もわかりません。 超初心者の質問内容で申し訳ありません。 VBAって面白いなぁと思い始めたところで なんとか理解したいので 教えていただけると大変助かります。 よろしくお願いします。

  • VBA Do Until ~ Loop 内にif

    Excel VBAマクロにて、C列のセルのうちOKと書かれたセルのみ塗りつぶすコードを作成したつもりなのですが、動いてくれません。エラー表示も出ません。間違いを指摘して下さる方、あるいは別の書き方があるという方、教えていただけないでしょうか。 下記私が作成したものです。C列にAと書かれたセルが現れるまで処理をするようにしています。 Sub sample() Dim i As Long i = 1 Do Until Cells(i, "C").Value = ”A" If Cells(i, "C").Value = "OK" Then Cells(i, "C").Interior.ColorIndex = 5 End If i = i + 1 Loop End Sub

  • VBA Do~Loopについて

    VBA勉強中です。 マクロの作成は完了しているのですが、処理効率について指摘を受け、 その際に助言もいただいたのですが、自身の勉強不足、理解不足で どのように変更すれば良いのか分からず、教えていただきたいです。 Do While Ax2 <= 30 で30回繰り返すのではなく (Cells(Ax2,"B").Value <> "" ) の間繰り返すように変更したいです。 ---------------- Sub test()  Dim File1(30) As string  Dim Sheet1(30) As string  Dim Sheet2(30) As string  Dim Cnt As Integer  Ax1=1  Ax2=7  Do While Ax2 <= 30    If Cells(Ax2, "B").Value <> "" Then     File1(Ax1) = Cells(Ax2, "B").Value     Sheet1(Ax1) = Cells(Ax2, "C").Value     Sheet2(Ax1) = Cells(Ax2, "D").Value     Cnt =Ax1    End If    Ax1 = Ax1 + 1    Ax2 = Ax2 + 1  Loop End Sub ---------------- お手数ですが、よろしくお願いいたします。

  • Do untilで判定されない

    office2010 WORKシートのI4802セルに2019/08/28という日付データが登録されています J2セルに2019/1/1の日付を設定し、その右セルに+1日ずつ設定するマクロ(カレンダ日付イメージ)で、上記WORKシートのI4802セルまでの日付を設定したい。 下記がそのマクロ Sub test() Rows("1:2").Select Selection.ClearContents Range("J2") = "2019/1/1" Dim i As Long Dim day As String day = Worksheets("WORK").Range("I4802").Value i = 11 Do Until Worksheets("Sheet2").Cells(2, i + 1) = day Worksheets("Sheet2").Cells(2, i) = Worksheets("Sheet2").Cells(2, i - 1) + 1 i = i + 1 Loop End Sub 上記を実行すると、ずっと計算して、2063/10/30までいって実行時エラーで停止します。 2019/08/28で終了しないのは何故でしょう? 日付判定になってると思うのですが、原因分からず。 また、その修正方法も教えて頂きたく

  • Do loopのマクロ

    以下のマクロの問題点を教えていただきたいのです。 A列を上から順番に調べて、値が10のときだけBに分岐して処理を行い(処理の内容は省略してあります)、またAに戻って、空白のセルが見つかったら処理をやめる、というマクロです。 ところが、これを実行すると空白のセルが見つかってもマクロが止まりません。何が問題でしょうか。 Sub A() Cells(1, 1).Select A: Do Until ActiveCell.Value = "" If ActiveCell.Value = 10 Then GoTo B End If ActiveCell.Offset(1, 0).Select Loop B: ActiveCell.Offset(1, 0).Select GoTo A End Sub

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • loop終了後のセルの一個右から同様のloopを行う方法

    ・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。 ・データはA列にランダムに数字が入っているものとします。 ・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。 ・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。 --------------------------- Sub 比較() Dim i As Integer Dim j As Integer Cells(1, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" i = 1 Do While Cells(i, 2).Value <> "" If Cells(i, 2).Value = "↓" Then Cells(1 + i, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" End If i = i + 1 Loop Cells(i - 1, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" j = 1 Do While Cells(i - 2 + j, 3).Value <> "" If Cells(i - 2 + j, 3).Value = "↓" Then Cells(i - 1 + j, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" End If j = j + 1 Loop End Sub

  • 2重のDo~Loopは?

    Excel VBAですが、A列にデータが入っています。 A列のデータが変わるまで 処理1 を実行し、変われば 処理2 を実行する。データがなくなれば終了する方法が分りません。宜しくお願いします。 i = 2 Do Until Cells(i, 1) = "" Do Until Cells(i, 1) <> Cells(i - 1, 1) 処理1 Loop 処理2 Loop

  • セルにデータが入っていないのを見つけるには?

    ユーザフォームにあるコマンドボタンを押すと、Sheet1のセル"D4"から横方向→にセルの中にデータが入っていない所までループし、データが入っていないセルがあったら"END"が入力され終了したいのですが。。 Private Sub CommandButton5_Click() Dim u As Integer u = 4 Do Until Worksheets("Sheet1").Cells(7, u).Value = "" If Worksheets("Sheet1").Cells(7, u).Value = "" Then Worksheets("Sheet1").Cells(7, u).Value = "END" End If u = u + 1 Loop End Sub このコードでは無反応でした。なにがいけないのかご指摘お願いいたします。 ExcelVBAです。

専門家に質問してみよう