-2

У меня есть матрица, которая включает разные / одинаковые значения в первом столбце и разные значения в первом ряду.

Я хотел бы сравнить все строки и выделить дублирующиеся строки. Для каждой строки следует проверять комбинацию значений «+», «-» и «/» и выделять дублирующиеся пары строк (тройки и т.д.) Разными цветами (разные цвета для каждой дублирующейся пары).

Следует также предположить, что три строки, как показано ниже, являются дубликатами.  Он будет принимать значения «/» как «+» и «-» и выделять эти строки также как дубликаты.

Вот пример результата макроса, который я хотел бы получить (строки одного цвета являются дубликатами);

РЕДАКТИРОВАТЬ: x4 и x7 также дубликаты с x1 и x2.И есть другие дубликаты, которые я не раскрашивал. Я просто раскрасил некоторые дубликаты, чтобы объяснить мою проблему.

2 ответа2

2

Я бы изложил ваши правила соответствия следующим образом (надеюсь, я прав):

  • + соответствует чему-либо в классе [+/]
  • - соответствует чему-либо в классе [-/]
  • / соответствует чему-либо в классе [-+/]

Учитывая это, речь идет о создании шаблона из конкатенации строк, который будет действовать как соответствующий шаблон. Это можно сделать с помощью регулярных выражений, но в VBA есть метод Like, который будет работать так же хорошо, возможно, быстрее.

Мы все настраиваем, сначала вставляя модуль Class и переименовывая его в cRowString

Модуль класса

Option Explicit
Private pRow As Long
Private pColA As String
Private pConcatString As String
Private pPattern As String

Public Property Get Row() As Long
    Row = pRow
End Property
Public Property Let Row(Value As Long)
    pRow = Value
End Property

Public Property Get ColA() As String
    ColA = pColA
End Property
Public Property Let ColA(Value As String)
    pColA = Value
End Property

Public Property Get ConcatString() As String
    ConcatString = pConcatString
End Property
Public Property Let ConcatString(Value As String)
    pConcatString = Value
End Property

Public Property Get Pattern() As String
    Pattern = pPattern
End Property
Public Property Let Pattern(Value As String)
    pPattern = Value
End Property

Далее введите этот обычный модуль

Option Explicit
Sub HilightDuplicateRows()
    Dim vData As Variant, lColors() As Long, V As Variant
    Dim colDups As Collection
    Dim R As Range
    Dim cR As cRowString, colRows As Collection
    Dim arrColors
    Dim S1 As String, S2 As String
    Dim I As Long, J As Long, K1 As Long, K2 As Long, L As Long

arrColors = VBA.Array(vbRed, vbCyan, vbYellow, vbGreen)

'get original range and load data into array
Set R = Range("a1", Cells(Rows.Count, "A").End(xlUp))
I = Cells(1, Columns.Count).End(xlToLeft).Column
Set R = R.Resize(columnsize:=I)

vData = R

'Iterate through and create patterns, collect them
Set colRows = New Collection
For I = 2 To UBound(vData, 1)
    S1 = ""
    S2 = ""
    For J = 2 To UBound(vData, 2)
        S1 = S1 & vData(I, J)
        Select Case vData(I, J)
            Case "+"
                S2 = S2 & "[+/]"
            Case "-"
                S2 = S2 & "[-/]"
            Case "/"
                S2 = S2 & "[-+/]"
        End Select
    Next J
    Set cR = New cRowString
    With cR
        .Row = I
        .ColA = vData(I, 1)
        .ConcatString = S1
        .Pattern = S2
    End With
    colRows.Add cR
Next I

'Check for duplicate pairs
Set colDups = New Collection
For I = 1 To colRows.Count - 1
    For J = I + 1 To colRows.Count
        If colRows(I).ConcatString Like colRows(J).Pattern Then
            colDups.Add CStr(colRows(I).Row & "," & colRows(J).Row)
        End If
    Next J
Next I

'Color the rows
ReDim lColors(1 To UBound(vData, 1))
J = 0
For I = 1 To colDups.Count
    V = Split(colDups(I), ",")
    If IsArray(V) Then
        Select Case lColors(V(0))
            Case 0
                J = J + 1
                K1 = J Mod (UBound(arrColors) + 1)
                lColors(V(0)) = arrColors(K1)
                lColors(V(1)) = arrColors(K1)
            Case Else
                lColors(V(1)) = lColors(V(0))
        End Select
    Else
        lColors(V) = xlAutomatic
    End If
Next I

R.Interior.Color = xlAutomatic
For I = 1 To R.Rows.Count
If lColors(I) = 0 Then
    R.Rows(I).Interior.Color = xlAutomatic
Else
    R.Rows(I).Interior.Color = lColors(I)
End If
Next I

End Sub

Выберите активный лист и запустите макрос

1

Возможно объединить содержимое (col-F), посчитать совпадения (col-G), а затем применить условный формат, основанный на количестве отсчетов.

Этот подход означает, что два набора строк с одинаковым количеством кол-во будут иметь одинаковый цвет.

XL счет конкатенации

Условное форматирование XL

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .