あなたはrng.Cells
を配置する必要はありません - .Cells
が暗示される - ちょうどrng
を使用します(^これは意味論である - あなたがやりたい)の代わりにrngCell.Text
をチェックする
を - rngCell.Value
を試してみてください。本当に
.Text
is incredibly slow.
^、これに基づいて、おそらく最大speeeeeeedため.Value2
の代わり.Value
を使用する必要があります!
当然のことながら、私たちはuse a variant arrayですが、それを簡単にしましょう。また
、あなたはこれが働くかもしれないが、それは私のために動作しませんxlThemeColorAccentz
とColorIndex
を使用する理由IDKの - 私はちょうどあなたがある範囲にCountIf
をやっているRGB
を使用しますmehの一種。
重複をチェックする場合、 この目的ではdictionaryを使用することをおすすめします。
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
あなたのコードは次のようになります。
Sub MarkDuplicates()
Dim iWarnColor As Long
Dim rng As Range
Dim rngCell As Variant
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Set rng = Sheets("AllAccounts (12-05-2017)").Range("D1:D1613")
rng.Interior.ColorIndex = xlNone 'Optionally clear all coloring
iWarnColor = RGB(230, 180, 180) 'Red
For Each rngCell In rng
If rngCell.Value <> "" Then 'Ignore blank cells
If Not dict.Exists(rngCell.Value) Then
dict.Add rngCell.Value, rngCell.Row 'Store the row if we want
Else
rngCell.Interior.Color = iWarnColor
'Optionally color the original cell:
'Sheets("AllAccounts (12-05-2017)").Cells(dict(rngCell.Value), "D").Interior.Color = RGB(180, 230, 180)
End If
End If
Next rngCell
End Sub
オプションのカラーリングと結果:
編集(辞書を使用しない):
だから、あなたがしていますマックオーリーを使ってlz。
これまで言及していませんでしたが、これを解決するために条件付き書式設定を使用できます。
とにかく、コレクションを使用しましょう。
コレクションは辞書とよく似ていますが、通常、特定のキー/値のペアが存在するかどうかを判断するためにループを繰り返す必要があります。
存在しないキーの値を取得してエラーをキャッチしようとすると、この処理を簡略化するための関数を追加しました。
Sub MarkDuplicates()
Dim iWarnColor As Long
Dim rng As Range
Dim rngCell As Variant
Dim Col As New Collection
Set rng = Sheets("AllAccounts (12-05-2017)").Range("D1:D1613")
rng.Interior.ColorIndex = xlNone
iWarnColor = RGB(230, 180, 180)
For Each rngCell In rng
If rngCell.Value <> "" Then 'Ignore blank cells
If Not IsInCollection(Col, rngCell.Value2) Then
Col.Add rngCell.Row, Key:=rngCell.Value2
Else
rngCell.Interior.Color = iWarnColor
'Optionally color the original cell
Sheets("AllAccounts (12-05-2017)").Cells(Col(rngCell.Value2), "D").Interior.Color = RGB(180, 230, 180)
End If
End If
Next rngCell
End Sub
Function IsInCollection(Col As Collection, Val As Variant) As Boolean
On Error Resume Next
Debug.Print (Col(Val))
IsInCollection = (Err.Number = 0)
On Error GoTo 0
End Function
新しい結果(同じ):
「抽出する」とはどういう意味ですか? – braX