• ベストアンサー

Excel VBA For Nextっていらないんじゃないでしょうか?

For i = 1 to 9 Next i と Do i = i + 1 Loop Until i = 9 はほとんど一緒じゃないのでしょうか? For Nextは使わなくてもDo Untilで代用できるんじゃないでしょうか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 初歩の質問だとは思います。Do ~ Loop の Until や While で条件として判定するのは、True, False ということです。それを毎回、判定しています。数値化して、初期値と最終値を得られるものなら、For i=初期値 To 最終値 の方が楽です。また、インデックスを持ったものは、途中で抜き出すのも楽です。しかし、初期値・最終値が計数化しにくいものがあります。例えば、テキストファイルやバイナリファイルは、その終わりは、特別な信号(EOF,LOF) を持っていて、その最終値を数値化するのに複雑になるものがあります。 Excelのワークシートのように、Cells は、元々、行や列で数値を持ったものです。それを、わざわざ、Range オブジェクトの中のプロパティでループのたびに判定する必要はありません。だから、Excelでは、Excel VBAを知っている人なら、圧倒的に、For 初期値~ To 最終値 のほうを選びます。しかし、他の条件、他のオブジェクトでは、そう行かないものもまたあります。条件判定するオブジェクトや条件によって、使い分けが必要です。 いろいろなコードを書いてみることをお勧めします。

ibichin
質問者

お礼

もっと上達すれば使い分け方もわかってくるのでしょうね。 ありがとうございました。

その他の回答 (4)

  • s-uzen
  • ベストアンサー率65% (2051/3118)
回答No.4

ループ処理に限らず、他の処理でも用意されたステートメントを使って、実現するための方法はいくつも出てきます。 言語で用意されたステートメントを適切に使って、プログラムを分かり易く書くほうが良いのではないでしょうか。 例えば For~NextとDo~Loopの単純な違いは、 直接数値を指定の場合は、For文の1行でループ条件がわかる。 Doはカウンタを持たないので、他のループ条件を指定でき、前判断や後判断ができるが、カウンタ、その他の判定条件の記述が必要。 ということになるので、その場面場面で適切なものを使うのが一番かと。 いろいろな繰り返し処理 http://home.att.ne.jp/zeta/gen/excel/c04p21.htm  

ibichin
質問者

お礼

なるほど。 もっとFor Nextや Do Loopについて知らないとダメですね。 ありがとうございました。

  • Nouble
  • ベストアンサー率18% (330/1783)
回答No.3

こういう感じなのでしょうかね Sub test()  Dim i As Integer  i = 1   for i = 1 to 0 step 1    If Cells(i, 1) <> Cells(i, 2) Then     i = 0     MsgBox "不一致"    Elseif i>= 65535 then     i = 0     MsgBox "一致"    End If   next i End Sub

ibichin
質問者

お礼

すみません。 プロシージャが読めませんでした。 ありがとうございました。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.2

ご提示のような作業だとDo~Loopで十分かもしれませんが、 Dim MyFile As File Dim FSO AS Object Set FSO = CreateObject("Scripting.FileSystemObject") For Each MyFile In FSO.Getfolder(Fol).Files MsgBox MyFile.Name Next Myfile のような作業はDo~LoopとDir関数使っても出来るけど、 For~Nextの方が扱いやすいしコードも簡潔になりますね。

ibichin
質問者

お礼

コードの簡潔さという利点があるのですね。 よくわかりました。 ありがとうございました。

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

代用はできますけど、カウンタとして使っているiを自分でカウントアップする必要がなくなります。こういう余計な処理を自分で書くと忘れることがあって、バグの元になります。使える言語機能は使った方が楽です。

ibichin
質問者

お礼

便利なものは使ったほうがよいのですね。 ありがとうございました。

関連する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

  • For next使う場合、next iはできない?

    vbsでFor next使う場合、next iはできないのですか? for i = 1 to 2 msgbox "" next i をすると "ステートメントの末尾が不正です"800A401 になります。 しかし for i = 1 to 2 msgbox "" next にすると、問題ないです。 VBAではnext iでも実行できるけどVBSではだめなのでしょうか? 理由を教えてください。

  • For ~ Next の使い方

    for ~ next 構文の途中でカウンターを進めることはできますか。 For I=1 to 10 処理 if ~ then next 処理 next このようにすると、エラーになります。 仕方なく次のようにしていますが、もっと良い方法はありますか。 For I=1 to 10 処理 if ~ then goto 次の行へ 処理 次の行へ: next

  • excel VBA For ~Next構文について

    excel VBA For ~Next構文についての質問です。 以下のようなマクロがあります(実際はもう少し複雑なことをやっていますが)     For i = 4 To 178      Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"     Next i これに「もし、『Cells(i, 1)』が空白なら、この処理は行わずに、次の行にすすめ」という指示を加えたいのですが、こんな簡単なこと(?)で行き詰ってしまっています。 とりあえず以下のように修正をしてみたのですが・・・    For i = 4 To 178    If Cells(i, 1) = "" Then GoTo ワープ:    Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"    ワープ:   Next i  これで一応こちらの求めている処理はできたのですが、もっと簡単に(もしくはすっきりと) できる方法はないでしょうか?  以上、よろしくお願いいたします。   

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • For Next がうまくいきません。

    VBを勉強中の初心者です。 For i = 2 To 8 For n = 3 To m Cells(4, i) = Sheets("1").Cells(3, n) Next n Next i 上記のようにつくってはみましたが、うまくいきません。 Forのうえにはmを求める式が入っています。 自分がやりたいのは、 4,2 3,3  |  | 4,8 3,9 --------- 4,3 3,3  |  | 4,8 3,8 --------- 4,4 3,3  |  | 4,8 3,7 --------- 4,5 3,3  |  | 4,8 3,6 --------- 4,6 3,3  |  | 4,8 3,5 --------- 4,7 3,3 4,8 3,4 --------- 4,8 3,3 --------- 上記のようにしたかったのですが、 どうしてもうまくいきません。 どなたか宜しくお願します。

  • エクセルマクロの【For・・・Next】で、

    エクセルマクロの【For・・・Next】で、以下のような文を作ってます。 Sub 空欄を消す() For i =1 To 50 If Cells(i + 3,8) = "" Then Rows(i + 3).Hidden = True End If Next End Sub この繰り返す回数【50回】を、シート上の任意のセルの値の回数に変えることはできますか。 例えば「A1」のセルの値が30なら30回繰り返す。 「A1」のセルの値が20なら20回繰り返す。 といったような具合に。

  • VBA ループ文

    お手数ですが、回答お願いします。 VBAでループ文を勉強しております。 最初のfor 文で1000行、1000列に文字を入力、 次のdo 文でその文字を全部消したいのですが、うまくいきません。 またfor 文で1000行、1000列で文字を入力しているのですが、 時間がかかるのは仕方がないことなのでしょうか? お手数ですが、ご教授お願いします。 Sub 文字入力() Dim i As long Dim t As long For i = 1 To 1000 For t = 1 To 1000 Cells(i, t) = "wooo" Next t Next i End Sub ================================================================= Sub 文字入力消し() Dim i As long Dim t As long i = 1 Do t = 1 Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 Loop Until Cells(i, t) = "" End Sub

  • For Next構文を使ったVBA

    こんにちは、VBAについて質問をさせてください!(>_<) 同じブックにシート「テスト」と「Sheet1」があり、「テスト」にはデータの入力欄、「Sheet1」には「テスト」に入力するためのデータが入っています。「テスト」の入力欄は「Sheet1」のデータの並び順と同じですが、入力したデータ同士に4行3列ずつデータを入力しないセルを作らなくてはなりません。 また、データを入力するセルは「テスト」の5列目8行目=「Sheet1」3列目2行目~「テスト」の20列目8行目=「Sheet1」8列目2行目のように、まず列番号を増やし、列番号が最大になったら行番号が増え、列番号はまた初期値から増えます。したがって、次は「テスト」の5列目9行目=「Sheet1」の3列目3行目~「テスト」の20列目9行目=「Sheet1」の8列目3行目になります。 上記を踏まえてVBAを作成してみたのですが、このままではi,j,k,l全ての値がNextで増えてしまいます。Ifを使ったりするのかと色々ネットで調べて考えてみましたが、行き詰まってしまいました。どなたかご教授いただけるととても嬉しいです。説明が長く申し訳ないです、わかりづらければ補足させていただくので、おっしゃってください! Dim i, j, k, l As Integer For i = 5 To 20 Step 3 'シート「テスト」の列 For j = 8 To 116 Step 4 'シート「テスト」の行 For k = 3 To 8 'シート「Sheet1」の列 For l = 2 To 39 'シート「Sheet1」の行 Cells(j, i).Value = Sheets("Sheet1").Cells(l, k).Value Next l Next k Next j Next i

  • EXCEL VBA のFor~Next文で質問です。

    お世話になります。VBA初心者です。 環境はWIN2000,EXCEL2000です。 下記のようなマクロを組んだらNextに対するForがありませんと、エラーが出てしまいました。 申し訳ありませんが、手直しお願いします。 やりたいことは、D97へコピーが終わったら、次はM7からコピーをし、M97へのコピーが終わったらV7からコピーを始めたいのです。 With sheetGR For ii = 7 To 97 Step 10(行の指定) For iii = 4 To 31 Step 9(列の指定) If .Cells(ii, iii) = "" Then .Range(.Cells(ii, iii), .Cells(ii + 4, iii + 2)).Value _ = Sheets("Result").Range("G20:I24").Value End If Exit For If Cells(97, iii) <> "" Then Next iii End If Next ii End With

専門家に質問してみよう