[[20180315205359]] 『ループ処理について』(ルーラ) ページの最後に飛ぶ

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

 

『ループ処理について』(ルーラ)

‘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


>この意味は、C列の最下行までということでしょうか。
はい。そうです。
C列の値が何行あるかは決まっておりません。
C列の値が無くなった時点でループを抜けて処理を終了させたいです。
(ルーラ) 2018/03/15(木) 21:21

こんな感じでしょうか

 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


>まずは、j行のC〜G列まで全部赤にする

ここは、ループの外で、一括で処理がよいかもしれません。

(マナ) 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


sy様
実際にはもっと多くの行列数があるため、関数ではなく、VBAでの処理を考えております。

>歯抜けなどのパターンは無いんですか
歯抜けのパターンはありません。

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


ポイントは、まずは繰返しは置いておいて
1行分だけ考える。

で、基準となるセルを見つけて、
それからは「相対位置」でセルの位置を表現してみるとわかりやすいと思います。

(まっつわん) 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.