エクセルマクロを作成しています。その一環として、 Excel で一意の複合キーを検証する必要があります。つまり、Column1 + Column2 + Column3 を繰り返してはいけません。
その場合、行は赤色で強調表示されます。
それを行う最良の方法は何ですか?
前もって感謝します
これを行う方法はいくつかあります。2 つはデータの並べ替えに依存しますが、3 つ目はそうではありません。読者がどちらを好むかを示すことができるように、さまざまな回答でそれらを提供します。
長所:動的 (データの変更に適応)、コードは不要
短所:並べ替えが必要、面倒になる可能性あり
条件付き書式ルールを作成し、データのすべての行に適用します。
選択が行 2 から始まり(行 1 にヘッダーがある)、キー列が A、B、および C であると仮定すると、必要な式は次のとおりです。$
標識が表示される場所と表示されない場所に注意してください。
=OR((CONCATENATE($A2,$B2,$C2)=CONCATENATE($A1,$B1,$C1)),
(CONCATENATE($A2,$B2,$C2)=CONCATENATE($A3,$B3,$C3)))
これにより、重複キーを持つ両方の行、または 2 つ以上ある場合はすべての行が強調表示されます。
これを行う方法はいくつかあります。2 つはデータの並べ替えに依存しますが、3 つ目はそうではありません。読者がどちらを好むかを示すことができるように、さまざまな回答でそれらを提供します。
長所:高速、並べ替えが不要
短所:コードが必要、自動更新なし
この場合、重複行を実際に識別する問題と、重複行を強調表示する簡単な手順を分けて扱います。この関数は、キーが複数の行を持つ複合キーであり、値がキーに一致したすべての行の行番号を含むコレクションであるディクショナリを返します。Dictionary<string,List<int>>
これは、.NETの a に相当します。概念的には次のようになります。
"some..key..1" : [1, 42, 401]
"some..key..2" : [134, 135]
キーは、ヌル文字で区切られた各キー列の内容を連結したものです。キーセット ("A", "Dog", "2") が ("AD", "o", "g2") と等しくならないように、印刷できない null 文字を使用します。
書かれているように、キーの比較では大文字と小文字が区別されます。大文字と小文字を区別しない一致が必要な場合は、 と のプロパティを に設定CompareMode
します。dctValues
dctDuplicates
TextCompare
注: Microsoft Scripting Runtime への参照を追加する必要があります。
Public Function FindDuplicates(ByVal DataRange As Range, ParamArray KeyColumns()) As Dictionary
Dim ws As Worksheet
Dim vKeyRange, rngCol As Range
Dim dctKeys As New Dictionary
Dim colKeys
Dim keyParts() As String
Dim strKey As String
Dim dctValues As New Dictionary
Dim dctDuplicates As New Dictionary
Dim i As Long, ub As Long
Dim lngFirstRow As Long, lngLastRow As Long, lngRow As Long
Set ws = DataRange.Worksheet
' Identify unique key column numbers
For Each vKeyRange In KeyColumns
For Each rngCol In vKeyRange.Columns
dctKeys(rngCol.Column) = True
Next
Next
colKeys = dctKeys.Keys
ub = UBound(colKeys)
ReDim keyParts(ub)
' Find first and last row of data range
lngFirstRow = DataRange.Cells(1, 1).Row
lngLastRow = DataRange.Cells(DataRange.Rows.Count, 1).Row
' Loop through rows
For lngRow = lngFirstRow To lngLastRow
' Get the parts for the key
For i = 0 To ub
keyParts(i) = ws.Cells(lngRow, colKeys(i)).Value
Next
' Concatenate the parts with an unprintable character as
' the delimiter, so that "A" + "Dog" != "AD" + "og"
strKey = Join(keyParts, Chr(0))
' If the key hasn't been found yet, create a new collection
If Not dctValues.Exists(strKey) Then
dctValues.Add strKey, New Collection
End If
' Push the row number to the list of rows with this key
dctValues(strKey).Add lngRow
' If this is the second row with this key, add the
' list to the dictionary of keys with multiple rows
If dctValues(strKey).Count = 2 Then
dctDuplicates.Add strKey, dctValues(strKey)
End If
Next
Set FindDuplicates = dctDuplicates
End Function
使用法: 列 A、B、および E をキー列として使用して、A2:I5000 内のすべての重複行を検索します。
Dim ws As Worksheet, dctDups As Dictionary, vKey, vRow
Set ws = ThisWorkbook.Worksheets(1)
Set dctDups = FindDuplicates(ws.Range("A2:I5000"), ws.Range("A:B"), ws.Range("E:E"))
For Each vKey In dctDups
For Each vRow In dctDups(vKey)
ws.Range("A" & vRow & ":I" & vRow).Interior.Color = vbRed
Next
Next