• ベストアンサー

VBA:For構文のエラー、対策教えてください(初心者)。

For構文で指定した数字以上の数字まで処理されます。例えば、 For i =1 to n (n=50) ・・・(処理) next i nは事前に求まっている値50です。しかし、処理されるのはiが1~51までとなります。デバック中にカーソルをnに当てると「50」となるのにiにあてると「51」となります。どうしてでしょうか?助けていただきたいです。よろしくお願いいたします。 ちなみに、処理の部分はIf構文で、配列を用いた短い行です。

  • e-l
  • お礼率45% (158/349)

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

For i =1 to n (n=50) ・・・(処理) debug.print i & "回実行しました" next i とやると1から50まで、デバッグウィンドウに出力されます。 処理は50回されているということです。 ループは、i=51になったから抜けたということです。 これと同じ意味 i = 1 '←初期値 do until i > 50 '←50超えたら抜ける ・・・(処理)  i = i + 1 loop もっと噛み砕くと i = 1 '←初期値 do  if (i > 50) then  '←50超えたら抜ける   exit do  end if ・・・(処理)  i = i + 1 loop ということです。

e-l
質問者

お礼

ありがとうございました。具体的なご説明大変よく分かりました。

その他の回答 (3)

  • pc6001
  • ベストアンサー率23% (3/13)
回答No.4

どうもです. 下記のようなVB風コードを実行すると (変数の型はこちらで推測しました) -------------------------------- Dim i As Integer For i = 1 To 2  Debug.Print i ・・・1,2を表示 Next Debug.Print i ・・・3を表示 -------------------------------- forループの中は,1,2で終了しますが,上記のようにNextの後でiの値を見るとTo で指定した値よりも多くなります. e-lさんは,上記のようなことをいいたいのではないでしょうか? そうだと仮定して,進めさせていただきますと, 乱暴な言い方をすればFor文の制御仕様によるものです. Nextの部分でiを指定分インクリメントし Toの後の値未満であれば継続で,for文の直後に戻るようなイメージです. 一般的には,nextの外でiの値を利用するケースは少ないですが,制御仕様を知らないとびっくりします. 自問自答すると潜在的にForループ内のiしか使用しないようにコーディングしているようです(!?) C系風の場合も結果は同様です. -------------------------------- int i; for(i=1;i<=2;i++){ printf ("%d\n",i); ・・・1,2を表示 } printf ("%d\n",i); ・・・3を表示 -------------------------------- Cの場合は,for(初期値,継続条件,増減方法)になっているので,個人的にはVBよりは直感的で,わかりやすいです. 少なくとも他にVB.net VBSなどもこのような仕様になっています. よって,あなたのVBは壊れていないように思います. 上記の結果から,どうしてもNextの後でiを使用するならばi-1とすればよいかもしれません. 実際のコードが解らないので,推測してみましたが,的はずれでしたらごめんなさい.

e-l
質問者

お礼

ありがとうございます。分かりやすいご回答大変助かりました。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

iの値は、Forの中で確認していますか? For-Nextを抜けたところでiの値を見れば51になっているのは正常だと思いますが… ループの判断は next i で、iの値が+1される -> i が to の値以下なら、For以下を繰り返す という風に判断されるので、ループを抜けた時点ではiは50より必ず大きくなります。

e-l
質問者

お礼

ありがとうございました。大変よく分かりました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

For文の正常は動作です。 ループ開始前に値が判断されますから、i=nで終了ではなくてi>nで終了になるので、nの値を超えたのを判断して終了します。 51になってからはループは廻らないので、安心してください。

e-l
質問者

お礼

ありがとうございました。大変よく分かりました。

関連するQ&A

  • VBAのFor構文で

    質問させていただきます。 IF textBox1.value = "" then End If のように、VBAのテキストボックスが空白の場合に起動する構文を作ろうと考えているのですが、 このテキストボックスの数が多いので、どうにかして短く出来ないかと考えています。 VBAのテキストボックスを直接For構文で変更する事は可能なのでしょうか? 例えば For i = 1 to 20 IF textBox(i).value = "" then End If Next i 上記のような構文では実際に動かしたときにtextBoxの指定がされていないのでエラーが出てしまいます。 やはり、各テキストボックスごとに構文を作らなければならないのでしょうか? もし可能なら、その方法を教えていただきたいです。

  • 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  これで一応こちらの求めている処理はできたのですが、もっと簡単に(もしくはすっきりと) できる方法はないでしょうか?  以上、よろしくお願いいたします。   

  • For ~ Next の使い方

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

  • VB初心者です For Nextの構文について

    処理したい内容はA列に数字1~10まで数字を A1のセルから順番に入力させるという処理を For Next を使用して実行させたいのですが上手くいきません。ソースは以下になります。 Sub 記入() Dim i As Integer Dim n As Integer n = 0 For i = 1 To 10 n = n + i Next >Range("A" + n) = n End Sub >の部分でエラーになります。ここの部分を A1 A2 A3 ・ ・    列番号 と A + ○ を繰り返しでカウント変数 n で繰り返しをさせたいのですが、どう処理すればよろしいですか? アドバイスお願いします。

  • 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構文を使った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

  • VBAの構文で教えてください

    VBAの繰り返し処理 Do Until ~について教えてください。 シートの行列を全て書いてしまうと長くなるので 少し省略させていただきます。    A  B  C  D 1 2008 1 ○ 2008 2 2008 2 × 2008 このような羅列がデータ検索の際に何行になるかわからない状態のデータがあります。 C 列はBが1の場合○、2の場合は× D 列はAが数字があればそのままコピーするようにくみました。 ここで教えていただきたいのが、現在私はCとDの構文は AまたはBに数字があればC,Dに反映するという構文ではなく C、Dの列の最後まで全て数式を入力する構文にしています。 なので、A,Bに入力があってもなくても数式が飛ぶような構文になっています。 そこで、DO Until ~ を使用し A列が空白になるまで処理を繰り返すとすればいいのかなとおもうのですが、 Dim n as integer n=1 Do Until Sheets("sheet1").Cells(n, 1) = "" 空白までという構文(正しいかはわかりませんが)で行き詰っています。 これ以降のAが空白ならDに貼り付ける、 B列も同様に空白まで検索し○または×に置き換えるとは どのうように組み立てたらいいのでしょうか? また、申し訳ないのですが Cが×ならその列の背景を色づける(今回の場合なら2の列) とことまでしてみたいのですが・・・ このようなことが可能であれば教えていただければと思います。 VBAははじめたばかりで不勉強な点も多々ありますがよろしくお願いします。

  • VBAでのfor文について

    5行のデータがあるとして、先頭の文字がaで始まる行を削除して 上に詰めたいと考えています。 しかし、Range("i:i")のところに可変の数字iをうまく指定できて いないようで、うまく実行されません。 どこがまずいのでしょうか? Sub sample() Dim i As Integer For i = 1 To 5 activeworksheet.Cells(i, 2) = Mid(Cells(i, 1), 1, 1) If Cells(i, 2) = "a" Then ActiveSheet.Range("i:i").Delete shift:=xlshiftUp End If Next End Sub

  • For構文に入りうる変数を指定する方法

    通常、For構文は処理の回数を指定しますよね。 回数ではなく、入りうる変数を全て指定した上で、処理をループさせる方法はあるんでしょうか。もしあったら教えて下さい。 イメージとしては↓な感じです。(イメージなのでかなり適当です。すみません。) For i = 1,4,5,6,12,13 Cells(i+5 ,2).Value = 3 next i

  • C言語!プログラム書いたのですがエラーです!

    課題内容 キーボードから数字を入力してその値までの合計を表示する。 さらに入力した値が偶数なら0から入力した値までのすべての偶数の和を 入力した値が奇数なら1から入力した値までのすべての奇数の和を表示するプログラム。 #include<stdio.h> int main(void) { int i, n, sum; sum=0; scanf("%d",&n); printf("入力値:%d\n", n); if(n%2 = 0) { for(i=0;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } else { for(i=1;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } return(0); } これでコンパイルすると10行目に左辺値が必要とでます。 どうすればよいでしょうか? 教えてください。よろしくお願いします。