|
▼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) '先頭行に色塗り,完了
|
|