• ベストアンサー

エクセルVBAで Do While (1)って?

下記のような例文がありますが、 Do While (1)の括弧1の意味がわかりません。 Stri = "" iCount = 3 '入力データ開始行 Do While (1) If Trim(Sheets("テスト").Range("A" & iCount)) = "" Then Exit Do End If Stri = Stri & Sheets("テスト").Range("G" & iCount) & "," iCount = iCount + 1 Loop 以下のような使い方ならわかるのですが・・・・。 Do While Counter < 20 Counter = Counter + 1 MsgBox Counter Loop

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

  • ベストアンサー
回答No.1

つまり「ずっとループ」ってことです。 ループの入り口や出口で継続判断をせず、ループ内で判断をする場合の方法です。 単純に Do ' ループ内の処理 Loop とも書けますが、ループ処理のコードが長い場合、一度に Do と Loop を見渡すことが出来ませんので、Do の行を見ただけで「終了判断は中でやってるんだろうな」と理解できるように Do の行で意味のない (1) を書いています。

merlionXX
質問者

お礼

なあるほどぉ! こういう書き方もあるんですね、勉強になりました。 有難うございます。

その他の回答 (3)

noname#22222
noname#22222
回答No.4

s_husky です。 回答にミスが!For-Next文です。

merlionXX
質問者

お礼

For-Next文ですから、Exit DoじゃなくExit Forですね。はい、わかりました。ご親切に有難うございます。

noname#22222
noname#22222
回答No.3

Do While (条件) - Loop文 は、()内の条件をテストした結果が真であれば処理を繰り返します。 通常は、条件=条件式です。 よって、処理後に行われるテストで、いずれ真から偽へと変化しループを終了します。 (1)と書けば、1=真という約束事ですから、永遠に偽にはなりません。 無限ループする理由です。 さて、Do While (条件) - Loop文は、For Next-End文に置き換えることが可能です。 For I = 3 To 9999   If Trim(Sheets("テスト").Range("A" & iCount)) = "" Then     Exit Do   End If   ・・・・・ Next I この場合、For のループ回数は便宜上 9999 としていますが、実際は未定です。 よって、カウントすべき行が無くなった時点で For ループを抜けています。 このように、どうせループを抜け出す判定を組み込むならば For文は無限ループしても良い訳です。 ところが、For文には無限ループを指定することができません。 ならば、Do While (条件) - Loop文を使おうということでしょう。

merlionXX
質問者

お礼

> For文には無限ループを指定することができません。 > ならば、Do While (条件) - Loop文を使おうということでしょう。 ははぁ~ん!よ~くわかりました。 有難うございます。

回答No.2

>括弧1の意味がわかりません。 「常に真(TRUE)」です。 このプログラムでは Exit Do でループから抜けることを前提にしていて Exit Do が実行されない場合には無限にループが続きます。 ちなみに、もし無限ループ状態になってプログラムが止まらなくなっても Ctrl + Break のキー操作で強制終了できます。

merlionXX
質問者

お礼

なあるほど、常に真(TRUE)ですか。 ためにしにDo While (0)でやってみました。案の定回りません。 こういう書き方もあるんですね、勉強になりました。 有難うございます。

関連するQ&A

  • VBA DO~LOOPのネスト方法について

    エクセルマクロの構文でDO~LOOPのネストを行った際に、EXIT DOで飛び出した後のLOOP条件が無効になるようです。どなたかご教授願います。 Sub TEST() y = 1 Do Do If y = 2 Then Exit Do End If y = y + 1 Loop Loop While y = 3 End Sub

  • Do whileとFor文の脱出処理について

    はじめまして。 VBについて素朴な質問なのですが For…Nextから抜けるにはExit for を使いDo…Loopから抜けるにはExit Doを使用しますが以下の場合はFor文の中でExit doを使用するのは可能なのでしょうか? Do while(条件) for i=1 to 12 if 条件 then exit do end if 処理1 next i 処理2 loop 本来ならfor文の中ではExit forを使用しますがfor文はDo while文 の中に含まれていますのでExit doでも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。

  • VBAで教えてください。

    データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub

  • Do whileでExitせず、ループの最初に戻る方法

    よろしくお願いします。 環境 Excel 2003 Do whileのループ内で、Exitのような記述方法で、ループの最初に戻る方法はありますでしょうか? イメージは以下のような形です。 Sub hoge() r = 0 rr = 5 Do While r < 6 'ここに戻る If r = 3 Then 'ここでDo while の最初に戻る End If Loop End Sub よろしくお願いいたします。

  • Exit Doで二つのloopを抜けるには?

    Do Do For Each If 値 = "" Then Exit Do End If Next Loop Until 条件1 Loop Until 条件2 のようなネストをした場合、Exit Doでloopを抜ける時、条件1と条件2のどちらに移動するのですか? もし条件1に移動する場合、条件2を抜けたいのならどうすればいいのでしょうか? Exit Do Do みたいな事がしたいです。

  • 【Excel VBA】ワークシートの表示(続き)

    すみません。 追記が出来なかったため、コードの続きをこちらに記載します。 For i = 1 To 12 If actsht = tmp(i) Then Flag = 1 Anser = MsgBox("翌月分シートを作成しますか?", vbYesNo + vbDefaultButton1, "確認") If Anser = vbYes Then ActiveSheet.Copy After:=ActiveSheet ActiveSheet.Name = tmp(i + 1) Sheets(actsht).Tab.ColorIndex = 2 Sheets(actsht).Range("B3").Value = Sheets("Sheet2").Range("A1").Value Sheets(actsht).Range("B4").Value = Sheets("Sheet2").Range("A2").Value ActiveSheet.Range("A2").Select Exit For ElseIf Anser = vbNo Then Exit For End If End If Next If Flag = O Then MsgBox ("新しいワークシートを作成出来ません。") End If If actsht = tmp(i) Then If Sheets(元データ).Visible = False Then Sheets(元データ).Visible = True End If End If End Sub

  • Do While中のVBAアプリケーション定義エラー

    Win2000、Excel2000で作業をしています。 無限ループで、Sheet1を監視し、特定のセルに「1」が入ったら別のセルの内容を変更すると言うものです。 ここで、何度目かに「1004)アプリケーション定義またはオブジェクト定義のエラーです」とでます。 (テストのため、(1,5)のセルに何か書き込み、(1,3)に1を入れるというのを繰り返していると、(1,5)に書き込んだ時に出る。) Do While True If Sheet1.Cells(1, 3) = "1" Then Sheet1.Cells(1, 5) = "" Sheet1.Cells(1, 6) = "0" End If DoEvents Loop ハイライトもしなくて、どこで落ちているのかわからず困っています。 ちなみに、1をvalで見ても同じで、1秒ごとに見ても同じでした。 どなたか原因の心当たりのあるから、ご助力お願いいたします。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • vba While ~ Wendは抜ける方法はないのですか?

    While ~ Wendを使っているのですが 途中で抜けたいです。 Sub test1() Dim i As Long, j As Long  While i < 5        If j = 1 Then Exit Do    i = i + 1    Wend ’続きの処理 End Sub だとエラーになるのでExit subにしていますが、 やはりWhile ~ Wendでは途中で抜けられないのでしょうか? それと 検索したところ http://questionbox.jp.msn.com/qa2600400.html がヒットしたのですが もうWhile ~ Wendは使わない方がいいのでしょうか? もしそうなら結構な数の書き換えが必要なので 出来れば途中で抜ける方方が知りたいです。 アドバイス宜しくお願い致します。

  • エクセルVBAで指定したセルへジャンプするコード(追加の追加質問です)

    http://oshiete1.goo.ne.jp/qa2903797.html たびたびすみません。最後にひとつだけお願いします。 お教えいただいた下のコードは順調に動作するのですが、 対象セルが結合セルの場合、エラーが出てしまいます。 とまってしまうコードの部分は With Selection.AddComment です。 エラーメッセージにはプロシージャの呼び出し、 または引数が不正です。(Error 5)と書いてあります。 結合セルは動作しないものでしょうか? Sub test01() Dim x As String Dim ThisSheet_Name As String Dim Sheet_Name As String Dim Range_Name As String Dim I As Integer, n As Integer Dim Ans As Integer Dim myComment As String '新規追加 Dim Colors As Integer '新規追加 ThisSheet_Name = ActiveSheet.Name '設定シート Select Case Workbooks.Count Case 1 MsgBox "チェックするファイルがありません。" Exit Sub Case 2 For n = 1 To 2 If Workbooks(n).Name <> ThisWorkbook.Name Then x = Workbooks(n).Name '開いている“もうひとつのブック”の名前 End If Next Case Else MsgBox "他に開いているファイルが複数のため対象を特定できません。" Exit Sub End Select I = 0 Do While (1) With ThisWorkbook.Sheets(ThisSheet_Name) If .Range("A3").Offset(I, 0).Value = "" Then MsgBox "検査項目は以上です。" ThisWorkbook.Activate Exit Do 'A列の3行目以下が、空白なら終わる End If Sheet_Name = .Range("A3").Offset(I, 0).Value Range_Name = .Range("B3").Offset(I, 0).Value myComment = .Range("C3").Offset(I, 0).Value End With Windows(x).Activate Sheets(Sheet_Name).Select Range(Range_Name).Select Colors = Selection.Interior.ColorIndex '新規追加 Selection.Interior.ColorIndex = 6 With Selection.AddComment .Visible = True .Text myComment End With Range(Range_Name).Select Ans = MsgBox("「次をチェックしますか?」", vbYesNo) Selection.Interior.ColorIndex = Colors '修正 Selection.ClearComments '新規追加 If Ans = vbYes Then I = I + 1 Else Exit Do End If Loop End Sub

専門家に質問してみよう