@matzoneはすでに正確な答えを出していましたが、これで自分のスキルを少しテストしたかったのです。Range
オブジェクトと.Find()
メソッドを使用して、まったく同じことを行うこの Sub を作成しました。コメントで...
Private Sub Test()
FindAndColorMatchesOfTwoColumns "A", "B"
End Sub
Private Sub FindAndColorMatchesOfTwoColumns(colTarget As String, colList As String)
Dim rLookUp As Range ' Column range for list compared against
Dim rSearchList As Range ' Column range for compare items
Dim rMatch As Range
Dim sAddress As String
' Set compared against list from colTarget column
Set rLookUp = Range(colTarget & "1:" & _
colTarget & Range(colTarget & "1").End(xlDown).Row)
' Loop trough list from colList column
For Each rSearchList In Range(colList & "1:" & colList & Range(colList & "1").End(xlDown).Row)
' Find for a match
Set rMatch = rLookUp.Find(rSearchList.Value, LookAt:=xlWhole)
If Not rMatch Is Nothing Then
' Store first address found
sAddress = rMatch.Address
' Loop trough all matches using .FindNext,
' exit if found nothing or address is first found
Do
' Set the color
rMatch.Font.Color = vbRed
Set rMatch = rLookUp.FindNext(rMatch)
Loop While Not rMatch Is Nothing And rMatch.Address <> sAddress
End If
Next
Set rMatch = Nothing
Set rSearchList = Nothing
Set rLookUp = Nothing
End Sub
アイデアは、より動的になり、引数として 2 つの列を受け入れ、検索範囲Range.End(xlDown).Row
を固定数までではなく設定することです。また、一致するトラフのみをループします。
元の質問では、単純な.Cells()
ネストされたループの方がはるかに単純ですが.Find()
、列数が数千になると、使用がはるかに高速になります。
このテストサブで「ロングリスト」仮説をテストしました:
Private Sub RunTest()
Dim tStart As Date
Dim tEnd As Date
tStart = Timer
FindAndColorMatchesOfTwoColumns "A", "B"
tEnd = Timer
Debug.Print Format(tEnd - tStart, "0.000")
tStart = Timer
Test
tEnd = Timer
Debug.Print Format(tEnd - tStart, "0.000")
End Sub
列 A に 1500 行、列 B に 184 行を追加し、即時ビューの結果を次のように取得しました。
0,266
12,719
したがって、実際にはパフォーマンスに大きな違いがあります... OPが質問の単純な例を提供するだけで、これをより大きなデータセットで利用するつもりである場合。