0

エクセルマクロを作成しています。その一環として、 Excel で一意の複合キーを検証する必要があります。つまり、Column1 + Column2 + Column3 を繰り返してはいけません。

その場合、行は赤色で強調表示されます。

それを行う最良の方法は何ですか?

前もって感謝します

4

2 に答える 2

3

これを行う方法はいくつかあります。2 つはデータの並べ替えに依存しますが、3 つ目はそうではありません。読者がどちらを好むかを示すことができるように、さまざまな回答でそれらを提供します。

条件付き書式の並べ替えと適用

長所:動的 (データの変更に適応)、コードは不要
短所:並べ替えが必要、面倒になる可能性あり

  1. キー列で手動で並べ替える
  2. 条件付き書式ルールを作成し、データのすべての行に適用します。

    1. すべてのデータを強調表示しますが、データの最初の行から始めます
    2. 条件付き書式を選択 -> 新しいルール
    3. フォーマットを赤い塗りつぶしに設定する
    4. 「数式を使用して書式設定するセルを決定する」を選択します
    5. 選択が行 2 から始まり(行 1 にヘッダーがある)、キー列が A、B、および C であると仮定すると、必要な式は次のとおりです。$標識が表示される場所と表示されない場所に注意してください。

      =OR((CONCATENATE($A2,$B2,$C2)=CONCATENATE($A1,$B1,$C1)),
          (CONCATENATE($A2,$B2,$C2)=CONCATENATE($A3,$B3,$C3)))
      

      これにより、重複キーを持つ両方の行、または 2 つ以上ある場合はすべての行が強調表示されます。

于 2013-02-21T14:53:46.207 に答える
3

これを行う方法はいくつかあります。2 つはデータの並べ替えに依存しますが、3 つ目はそうではありません。読者がどちらを好むかを示すことができるように、さまざまな回答でそれらを提供します。

VBA で辞書を使用して重複を特定する

長所:高速、並べ替えが不要
短所:コードが必要、自動更新なし

この場合、重複行を実際に識別する問題と、重複行を強調表示する簡単な手順を分けて扱います。この関数は、キーが複数の行を持つ複合キーであり、値がキーに一致したすべての行の行番号を含むコレクションであるディクショナリを返します。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します。dctValuesdctDuplicatesTextCompare

: 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
于 2013-02-21T18:19:00.233 に答える