[[20170224225202]] 『2重forの作り方』(vo) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


For i = i To LastRow
の内側にも
For i = i To LastRow
ではだめでしょう。

こんな感じで単純に考えてはどうでしょうか。

 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.