[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『2重forの作り方』(vo)
こんばんは! お願いします!
例えばC1,C5,C11のセルにアメリカと入っています。 そして、アメリカとアメリカの間のB列の行の範囲(B2〜B4)(B6〜B10)に日本と入っているセルがあるか調べます。 もし(B2〜B4)に入っていたらC1のアメリカを日本という文字に変えたい。 同様に(B6〜B10)に入っていたらC5のアメリカを日本に変えたい。 ※もし入っていなかったらそのまま
自分が組んだコードですと、 【forで 指定された変数は既に使用されています】となってしまいます。
Sub てすと()
Dim LastRow As Long LastRow = Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 To LastRow
If Cells(i, 3).Value = "アメリカ" Then Dim 変更箇所 As Range Set 変更箇所 = Cells(i, 3)
For i = i To LastRow
If Cells(i, 2).Value = "日本" Then
変更箇所.Value = "日本"
Exit For
End If Next i
End If Next i
End Sub
< 使用 Excel:unknown、使用 OS:unknown >
こんな感じで単純に考えてはどうでしょうか。
Sub てすと2() Dim LastRow As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row For i = 1 To LastRow If Cells(i, 2).Value = "日本" Then Cells(i, 3).End(xlUp).Value = "日本" End If Next i
End Sub
(マナ) 2017/02/24(金) 23:18
コードの構成はもう少し工夫できそうですが、それは後回しにして。
i は 外側のループで使われていますので、内側のループでは 別の変数を使う必要があります。 (全く独立した別のループであれば、同じ変数を再利用可能ですが)
ですから、内側の ループは
For x = i To LastRow
If Cells(x, 2).Value = "日本" Then
変更箇所.Value = "日本"
Exit For
End If Next x
こんな感じですかね。(コードそのものは精読していませんのでこれで正しく動くかどうかは保証できませんが)
なお、変数はすべて、必ず宣言しましょう。
Dim i As Long Dim x As Long
モジュールの先頭に Option Explicit を記述するようにしてください。 VBE画面の ツール -> オプション の編集タブで 変数の宣言を強制する(R) にチェックを入れておくと 新しくモジュールを挿入した時点で自動的に Option Explicit が記述されます。
ところで、日本 の範囲ですけど B2〜B4 なら B5〜B10 ではないのですか? あるいは B6〜B10 が正しければ、 B3〜B4 ではないのですか? どちらでしょうね。
( β) 2017/02/24(金) 23:18
Dim i As Long
(マナ) 2017/02/24(金) 23:29
C列がアメリカのものだけを対象にする。B列が日本のものだけを対象にするということであれば
Sub Sample() Dim i As Long Dim LastRow As Long Dim x As Long
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To LastRow If Cells(i, "C").Value <> "" Then x = 0 If Cells(i, "C").Value = "アメリカ" Then x = i End If If Cells(i, "B").Value = "日本" Then If x > 0 Then Cells(x, "C").Value = Cells(i, "B").Value End If End If Next
End Sub
( β) 2017/02/24(金) 23:31
なんか仕様が変遷しているような気がします。
当初「アメリカとアメリカの間のB列の行」となっていたので、 C列の上下に「アメリカ」が必要と思っていたのですけど。
また、C列上のアメリカとアメリカの途中にイギリスも出て来ることがあるのかどうか、 あったら、直前にアメリカがあったことはご破算になるのかどうか。
「2重forの作り方」より前に詰めておく事項があるかも知れない。
(半平太) 2017/02/25(土) 08:47
「アメリカ」「日本」というような例ではなく、
それぞれの列の意味を「きちんと」説明したら良いと思います。
二重ループという質問ですが、
コードというものは仕様と離れて抽象的なものとしてあるのではなく、
何かの課題を達成するためにあるわけですよね。
情報の意味にマスクがかかっているから、
されたいことのイメージが湧きません。
(γ) 2017/02/25(土) 09:55
回答例を見ると、2重ループしているものはないですね。 上から下にざっと一回見れば済んじゃうからでしょうね。
1.「アメリカ」が出て来るかチェックして行く。 2.「アメリカ」が出たら、その位置を覚えておく 3.「アメリカ」が出た後は「日本」が出てくるかチェックして行く。 4.「日本」がでたら、出た事実を覚えておく 5.次にまた「アメリカ」か出て来るかチェックしていく。 6.「アメリカ」が出たら、最初の「アメリカ」を「日本」に変える 7.一回目の「アメリカ」が出た位置を 2回目の「アメリカ」の位置に変更し、 「日本」が出た事実をクリアする。
8.上記3から繰り返す
(半平太) 2017/02/25(土) 11:58
少し誤解を与えるような、説明が分かりにくかったようで失礼しました!
つまり、、
こういう場合↓
A B C 1 アメリカ 2 3 4 5 アメリカ 6 日本 7 8 9 日本 10 11 アメリカ
こうなってほしい↓
A B C 1 アメリカ 2 3 4 5 日本 6 日本 7 8 9 日本 10 11 アメリカ
こういう場合↓
A B C 1 アメリカ 2 3 日本 4 5 アメリカ 6 7 8 9 10 11 アメリカ
こうなってほしいんです↓
A B C 1 日本 2 3 日本 4 5 アメリカ 6 7 8 9 10 11 アメリカ
マナさんと、βさんの23:31の投稿のものが同じ欲しかった結果になりました!
助かりました。
(vo) 2017/02/25(土) 23:27
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.