• ベストアンサー

VBAのループ処理について

VBA(Excel2000)にて、参考書等を見て下記のコードを作成しました。 「セルA1かA10において、同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」 Sub ループ() Dim a As Long With Range("a1:a10") For a = 1 To .Count - 1 If .Cells(a).value <> .Cells(a + 1).value Then .Cells(a, 2).value = .Cells(a).value End If Next .Cells(.Count, 2).value = .Cells(.Count).value End With End Sub 上記の「For idx = 1 To .Count - 1」の意味が分かりません。 よろしくお願いします。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.1です。 > なぜ、「1から9まで」なのですか? > 「1から10まで」のような気がするのですが・・・ For~Nextの中のロジックをよく見てください。 「同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」ということですが、「連続した同じ数字の最後のセル」であることをどう判定しているかというと、「次のセルと値が異なるセル」ということになります。それが以下のIf文です。 If .Cells(a).value <> .Cells(a + 1).value Then (a行目のセルとa+1行目のセルが違ったら) .Cells(a, 2).value = .Cells(a).value (B列のa行目に値を代入) しかし、ここでa+1という「一つ先」のセルの値を使用しています。aの値を10までまわすとA11というセルの値がIf文中に出てきてしまいます。これがまずいのです。 たとえばA1からA10に 1 1 2 2 3 3 4 4 5 5 と入っていると、4まではそれぞれ2つある下の方がB列にコピーされます。しかし、もし万が一A11に5という数値が入力されている場合、a=10までループをまわすと、 .Cells(a).value = .Cells(a + 1).value となってしまい、上のIf文が成り立たなくなります。その結果、B10にA10の値がコピーされなくなります。 それを避けるため、最大値より一つ減らしてループをまわしています。 そして最後のセル(この場合A10)ですが、 ・A9とA10の値が違う場合→A10から新たに連続する数字が始まるが、指定範囲がA10までなので、A10が一番下ということになる→B列にコピー ・A9とA10の値が同じ場合→A10が指定範囲内の一番下のセルなので、後のセルに何が続こうがここで打ち止め→B列にコピー とどうころんでもA10はB10にコピーされることになります。 したがって、For~Nextの後に、 .Cells(.Count, 2).value = .Cells(.Count).value という、最後の行は無条件にB10にコピーする式が入っているのです。 そういうロジックなので、For文では .Count-1 までループするようになっています。

taka1012
質問者

お礼

ご丁寧な解説ありがとうございました。 とても参考になりました。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

>For idx = 1 To .Count - 1」の意味が分かりません 質問のコードのどこにループ変数 idx  が出てますか。質問はしっかり書いてください。 それに質問のコードはメチャです。 Countはどこに定義さてますか For a = 1 To .Count - 1 If .Cells(a).valu は普通こういう使いか足しません。 Cells(i、j)はiは行番号、jは列番号で実行までに値が決まっている必要があります。 >セルA1かA10において 「セルA1からA10において」のミスか >セルA1かA10において、同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」 の意味も良くわからない。 >一番下のセルはA10のこと? 2箇所同じセルがあればどうするの。? 意味不明で自信ないが Sub ループ() j = 11 Dim a As Range With Range("a1:a10") For Each a In Range("A1:A10") If a.Value = a.Offset(1, 0).Value Then Cells(j, "b").Value = a.Value j = j + 1 End If Next End With End Sub のようなもの?

taka1012
質問者

お礼

説明不足、誤字がありごめんなさい。 >For idx = 1 To .Count - 1」の意味が分かりません >質問のコードのどこにループ変数 idx  が出てますか。質問はしっかり書いてください。 「For a = 1 To .Count - 1」の誤りです。 >セルA1かA10において >「セルA1からA10において」のミスか そうです。 >一番下のセルはA10のこと? >2箇所同じセルがあればどうするの。? 具体例を書きます。 マクロ実行前 ....... A .......B 1... 777 2... 777 3... 4... 3 5... 3 6... 3 7... 777 8... 99 9... 99 10... 4 マクロ実行後 .... ... A...... B 1... 777 2... 777... 777 3... 4... 3 5... 3 6... 3... 3 7... 777... 777 8... 99 9... 99... 99 10... 4... 4 よろしくお願いします。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

With Range("a1:a10") の中にあるので、 .Count は、Range("a1:a10").Count の意味で、このセル範囲の中のセル数を意味します。この場合A1:A10には10個のセルがあるので、 For a = 1 To .Count - 1 は変数aに1から9まで代入しながらループするということです。

taka1012
質問者

お礼

早速のご回答ありがとうございました。 >変数aに1から9まで代入しながらループするということです。 なぜ、「1から9まで」なのですか? 「1から10まで」のような気がするのですが・・・ よろしくお願いします。

関連するQ&A