[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ループ処理について』(ルーラ)
‘A列にC2セルの値があるかを判定
‘見つからなかったら、C2からG2セルの色を赤に変更
‘A列にC2セルの値があれば、C2セルの色を青に変更
‘A列にC2セルの値があれば、A列で見つかったセルから1行下にD2セルの値があるかを判定
例えばA1000セルに値があったとすれば、A1001セルにD2セルの値があるかを判定
‘見つからなかったら、D2セルの色を赤に変更
‘見つかったら、D2セルの色を青に変更
‘A列で見つかったセルから2行下にE2セルの値があるかを判定
‘見つからなかったら、E2セルの色を赤に変更
‘見つかったら、E2セルの色を青に変更
‘A列で見つかったセルから3行下にF2セルの値があるかを判定
‘見つからなかったら、F2セルの色を赤に変更
‘見つかったら、F2セルの色を青に変更
‘A列で見つかったセルから4行下にG2セルの値があるかを判定
‘見つからなかったら、G2セルの色を赤に変更
‘見つかったら、G2セルの色を青に変更
‘一行目の判定が終わったらC3セルの値がA列にあるかを判定
‘見つからなかったら、C3セルの色を赤に変更
‘A列にC3セルの値があれば、C3セルの色を青に変更
‘A列にC3セルの値があれば、A列で見つかったセルから1行下にD3セルの値があるかを判定
‘見つからなかったら、D3セルの色を赤に変更
‘見つかったら、D3セルの色を青に変更
‘以下上記の判定と同じく、2行下、3行下、4行下にそれぞれE3,F3,G3セルの値があるかをそれぞれ判定
‘それぞれの結果に応じて各セルの色を見つかったら青に、見つからなかったら赤に変更
‘二行目の判定が終わったらC4セルの値がA列にあるかを判定
‘以下繰り返し
繰り返す行数は決まっていません。
このような処理をするVBAの作成をしたいのですが、アドバイス頂けたらと思います。
スマホから書いておりますので、分かる範囲で作成したコードは後ほど更新しますが、ループ処理について、全く理解出来ませんでしたので詳しく教えて頂けると助かります。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
この意味は、C列の最下行までということでしょうか。
(マナ) 2018/03/15(木) 21:03
for j=2 to C列最終行まで まずは、j行のC〜G列まで全部赤にする application.matchで、C列の値がA列にあるか検索 if 見つかったら then C列を青にする for k=1 to 4 If 見つかったセルのk行下が、C列のk列右と同じなら then C列のk列右を青にする end if next end if next
(マナ) 2018/03/15(木) 21:54
ここは、ループの外で、一括で処理がよいかもしれません。
(マナ) 2018/03/15(木) 21:59
質問の日本語をリファクタリングしてみました。 コードも同じですが、構造がわかるように書くことが必要です。
(1)C2セルの値がA列にあるかを判定 見つからなかったら、 C2からG2セルの色を赤に変更 見つかったら、 C2セルの色を青に変更 A列で見つかったセルから1行下にD2セルの値があるかを判定 見つからなかったら、D2セルの色を赤に変更 見つかったら、 D2セルの色を青に変更
A列で見つかったセルから2行下にE2セルの値があるかを判定 見つからなかったら、E2セルの色を赤に変更 見つかったら、 E2セルの色を青に変更
A列で見つかったセルから3行下にF2セルの値があるかを判定 見つからなかったら、F2セルの色を赤に変更 見つかったら、 F2セルの色を青に変更
A列で見つかったセルから4行下にG2セルの値があるかを判定 見つからなかったら、G2セルの色を赤に変更 見つかったら、 G2セルの色を青に変更
(2)C3セルの値がA列にあるかを判定 見つからなかったら、 C3セルの色を赤に変更 見つかったら、 C3セルの色を青に変更 A列で見つかったセルから1行下にD3セルの値があるかを判定 見つからなかったら、D3セルの色を赤に変更 見つかったら、 D3セルの色を青に変更
以下上記の判定と同じく、2行下、3行下、4行下にそれぞれE3,F3,G3セルの値があるかをそれぞれ判定 それぞれの結果に応じて各セルの色を見つかったら青に、見つからなかったら赤に変更
(3)C4セルの値がA列にあるかを判定 以下繰り返し C列のデータ最終行まで繰り返す。
(γ) 2018/03/15(木) 22:01
遅くなりましたあ、私なりに作成したコードです。
所々メンテナンスが必要ですが、
分かる範囲で作成しました。
また、コメント文ですが、γ様にアドバイス頂くより前に作成したコードであるため、
お見苦しくなっておりますがご了承下さい。
Sub ループ処理()
Dim A列 As Long
Dim C列 As Long
Dim D列 As Long
Dim E列 As Long
Dim F列 As Long
Dim G列 As Long
Dim StringA As String
Dim StringC As String
Dim StringD As String
Dim StringE As String
Dim StringF As String
Dim StringG As String
Dim I As Integer
For A列 = 2 To Cells(Rows.Count, 1).End(xlUp).Row
For C列 = 2 To Cells(Rows.Count, 3).End(xlUp).Row
For D列 = 2 To Cells(Rows.Count, 4).End(xlUp).Row
For E列 = 2 To Cells(Rows.Count, 5).End(xlUp).Row
For F列 = 2 To Cells(Rows.Count, 6).End(xlUp).Row
For G列 = 2 To Cells(Rows.Count, 7).End(xlUp).Row
I = I + 1
StringA = Range("A:A")
StringC = Cells(2 + I, "C")
StringD = Cells(2 + I, "D")
StringE = Cells(2 + I, "E")
StringF = Cells(2 + I, "F")
StringG = Cells(2 + I, "G")
StringG = Range("C+I:G+I")
'A列にC2セルの値があるかを判定
For Each String1 In Cells(2, "C")
'見つからなかったら、C2からG2セルの色を赤に変更
If Cells(2, "C") Is Nothing Then
Cells(2, "C").Interior.ColorIndex = 3
'A列にC2セルの値があれば、C2セルの色を青に変更 Cells(2, "C").Interior.ColorIndex = 5
'A列にC2セルの値があれば、A列で見つかったセルから1行下にD2セルの値があるかを判定 '例えばA1000セルに値があったとすれば、A1001セルにD2セルの値があるかを判定 '※ここの処理の仕方がどう調べても分かりませんでした。 'こんな感じでしょうか? Cells(Row + 1, Column).Value
'見つからなかったら、D2セルの色を赤に変更 '以降は同じような処理になると思うので省略させてください。
'見つかったら、D2セルの色を青に変更
'A列で見つかったセルから2行下にE2セルの値があるかを判定
'見つからなかったら、E2セルの色を赤に変更
'見つかったら、E2セルの色を青に変更
'A列で見つかったセルから3行下にF2セルの値があるかを判定
'見つからなかったら、F2セルの色を赤に変更
'見つかったら、F2セルの色を青に変更
'A列で見つかったセルから4行下にG2セルの値があるかを判定
'見つからなかったら、G2セルの色を赤に変更
'見つかったら、G2セルの色を青に変更
'一行目の判定が終わったらC3セルの値がA列にあるかを判定
'見つからなかったら、C3セルの色を赤に変更
'A列にC3セルの値があれば、C3セルの色を青に変更
'A列にC3セルの値があれば、A列で見つかったセルから1行下にD3セルの値があるかを判定
'見つからなかったら、D3セルの色を赤に変更
'見つかったら、D3セルの色を青に変更
'以下上記の判定と同じく、2行下、3行下、4行下にそれぞれE3,F3,G3セルの値があるかをそれぞれ判定
'それぞれの結果に応じて各セルの色を見つかったら青に、見つからなかったら赤に変更
'二行目の判定が終わったらC4セルの値がA列にあるかを判定
'
End If
Next
Next
Next
Next
Next
Next
Next
End Sub
(ルーラ) 2018/03/15(木) 22:33
条件付き書式だけで簡単に出来る事ですが、敢えてマクロでやりたいと言うのは、 これはループの勉強が目的と言う質問ですか?
でしたら、C2に値があって、D2は空白とかの場合はどうするんですか? それとも同じ行のC〜G列は必ず値が存在して、歯抜けなどのパターンは無いんですか?
それとA列は重複する値は存在しないんですか? もし重複する値が存在するなら、C列の値が2か所以上で見つかって、片方はD列の条件に該当して、 もう片方は該当しないなどのデータがあればどうするんですか?
取り合えず今は上記のような事は考慮しないで少し考え方の一例を提示します。 ループはC列の検索用の1つだけで良いですよ。 COUNTIF関数で検索をかければ1つのループで出来ますよね。
D〜G列はC列に値がある場合のみIF文で判定させれば良いだけです。 A列内のC列と同じ値のある行の取得はMATCH関数で取得できます。 後は取得した行番号に1〜4をプラスした行のセルが、D〜G列の値と同じか判定するだけです。
(sy) 2018/03/15(木) 23:14
>歯抜けなどのパターンは無いんですか
歯抜けのパターンはありません。
A列は重複する値は存在しないんですか
>存在します。
重複チェックもしたいところですが、私の技術では実現できそうにないので、
あきらめております。
>A列内のC列と同じ値のある行の取得はMATCH関数で取得できます
アドバイスありがとうございます。
(ルーラ) 2018/03/15(木) 23:26
Sub test()
Dim rngTable As Range Dim rngList As Range Dim c As Range Dim ix As Variant Dim rngMatch As Range Dim rngTarget As Range Dim n As Long
'表のセル範囲取得(C列以降。B列は空白と推察) With Range("C2").CurrentRegion Set rngTable = Intersect(.Cells, .Offset(1)) End With
'一覧のセル範囲取得(A列) Set rngList = Range("A1").CurrentRegion
'表の1列目を順次検索 For Each c In rngTable.Columns(1).Cells Set rngTarget = c.Resize(, 5) ix = Application.Match(c, rngList, 0) If IsNumeric(ix) Then Set rngMatch = rngList(ix).Resize(5) rngTarget.Interior.Color = vbRed For n = 2 To 5 If rngTarget(n).Value <> rngMatch(n).Value Then Exit For Next
rngTarget.Resize(, n - 1).Interior.Color = vbBlue End If Next End Sub
1行に5つデータが合って
一覧でから先頭行を検索し、
その後は縦に5つ分が比較する5つと同じかどうか、左から見て行くんですよね?
(まっつわん) 2018/03/16(金) 18:06
で、基準となるセルを見つけて、
それからは「相対位置」でセルの位置を表現してみるとわかりやすいと思います。
(まっつわん) 2018/03/16(金) 18:09
rngTarget.Interior.Color = vbRed
のタイミングがまずいですね。
ってか、一番最初に全部赤にして置けばいいですね^^;
(まっつわん) 2018/03/16(金) 18:30
???
あきらめて、別途、何らかの対応するということでしょうか。
で、マクロは重複なしを前提としたものでよいということですか。
(マナ) 2018/03/16(金) 21:44
>実際にはもっと多くの行列数があるため、関数ではなく、VBAでの処理を考えております。 問答する気は無いけど、根本的に勘違いされているようなので少しだけ。
逆です。 マクロより条件付き書式の方が数倍〜数百倍(処理内容によります)早いので、 処理対象範囲の行列が少なければマクロでも条件付き書式とあまり変わらない速さで処理できますが、 行列が増えれば増えるほど、マクロの遅さを感じるようになります。 関数も同じで、一部例外もありますが基本マクロで同じ事をするよりも圧倒的に早いです。 関数やマクロにしても、どれだけ効率よくコーディング出来るかで処理速度は数倍〜数百倍変わるので、 今回のような用件で数式+条件付き書式の方が遅いと言うなら、数式の組み立て方に問題があると思います。
>>存在します。 >重複チェックもしたいところですが、私の技術では実現できそうにないので、 >あきらめております。 いえ私が聞きたかったのは、A列に重複データが、D〜G列の色付け条件の両方に該当する時どちらの色にしたいのか? と言う事をお聞きしています。 今出てる回答で、実際のデータを使って全てのパターンで意図した結果になってるなら良いですけど、 そうでない場合は、どうしたいのかを明確にして質問すれば、皆さん方法も含めて答えてくれますよ。
取り合えずD列だけを対象にして以下のような時はD2セルは赤青どちらになれば良いんですか? A B C D 1 あ 2 か あ い 3 さ 4 あ 5 い 6 う 7 あ 8 か 9 さ 10 あ 11 い 12 う
以下のような事が考えられると思いますが、以下のどれでしょうか? パターン1:初めに見つかった1・2行目のデータが条件を満たさないので赤にする。 パターン2:最後に見つかった10・11行目のデータが条件を満たすので青にする。 パターン3:見つかった重複データの内、最低1つは条件を満たすので青にする。 パターン4:見つかった重複データの内、1つでも条件を満たさないデータがあるので赤にする。
ただすいませんが逆質問に答えて頂いても、明日資格試験なので終わるまで音信普通になります。
(sy) 2018/03/17(土) 08:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.