• ベストアンサー

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

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

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

  • ベストアンサー
  • 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
質問者

お礼

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