|    | 
     ▼doka さん: 
Dictionary(辞書)オブジェクトを使うと、こんな風に処理が 
できます。 
 
Sub Try1() 
  Dim r As Range 
  Dim dic As Object 
  Dim ss As String '1行データパターン 
  Dim n As Long 
   
  Set dic = CreateObject("Scripting.Dictionary") 
  With Range("B1:Z51") 
    .Interior.ColorIndex = xlNone 
    For Each r In .Rows 
      n = n + 1 '処理行 
      '一行をTab区切り文字列に変換 
      ss = Join(Application.Index(r.Value, 0#), vbTab) 
      If dic.Exists(ss) Then 
        If dic(ss) > 0 Then 
          .Rows(dic(ss)).Interior.ColorIndex = 6 
          dic(ss) = -dic(ss) '先頭行に色塗り,完了 
        End If 
      Else 
        dic(ss) = n '初出パターン 
      End If 
    Next 
  End With 
   
  Set dic = Nothing 
           
End Sub 
 
>    For Each r In .Rows 
から処理開始です。これは [B1:Z51]の範囲を Row単位で処理を 
くり返す、という命令です。 
 
>      '一行をTab区切り文字列に変換 
>      ss = Join(Application.Index(r.Value, 0#), vbTab) 
ここはコメントにある通り、範囲のうち1行を1つの文字列に連結して 
いるところです。 
範囲1行目が 7 8 6  6 ....  9 
としますと、上の処理により 
  ss = "7・8・6・・6・....・・9"  (・はTabコード) 
というある文字列となります。 
2行目データですと 
  ss = "2・5・・・・....・6・7"  (・はTabコード) 
です。 
この1行パターンss を辞書に登録していけば(登録するとき、初出行番号 
と組で登録します)、 
たとえば 51行目のパターン 
  ss = "2・5・・・・....・6・7"  (・はTabコード) 
が、すでに辞書の中にあるか? は 
↓のようにして調べることが可能ですから、 
>      If dic.Exists(ss) Then 'ss が存在すればTrueが返る 
51行目のパターンのとき True が返りますので、 
すぐ次の行でこのパターンの初出行番号を調べ、 
その行を黄色に塗りつぶし、 
塗りつぶしが終わったしるしに 格納した行番号をマイナスにしておきます。 
>        If dic(ss) > 0 Then 
>          .Rows(dic(ss)).Interior.ColorIndex = 6 
>          dic(ss) = -dic(ss) '先頭行に色塗り,完了 
 
 | 
     
    
   |