Быстрое условное форматирование для строк с одинаковыми данными в столбце?

1

У меня много данных, в основном так:

Name    Data    Date        ...
Groucho 123     06/23/2018
Harpo   321     05/02/2018
Chico   1239    04/17/2018
Zeppo   2938    12/03/2018
Groucho 123098  11/27/2018
Zeppo   29381   07/03/2018
...

Я бы хотел, чтобы каждый ряд был одинаковым Name быть выделенным цветом. (Меня не волнует, какого цвета, если это облегчает).

Таким образом, результаты будут выглядеть так:
enter image description here
(Примечание: вся строка может быть выделена, или только строка в «таблице». Все, что будет работать, хорошо для меня)

Есть ли быстрый (э) способ, которым я могу сделать это? Я бы предпочел не вводить кучу правил, таких как =$A2="Groucho" затем установите формат, затем новое правило =$A2="Chico"и установить цвет и т. д., так как в столбце А я мог бы иметь десятки имен, и создание правила для каждого из них довольно трудоемко.

Я открыт для выбора VBA, но предпочитаю встроенное решение, если оно доступно!

BruceWayne
источник
1
Первоначальное исследование не затрагивает много опций, но я работаю через опцию VBA. Вам нужно выбрать цвета, или вы в порядке с Excel, автоматически назначая цвета?
jrichall
@jrichall - у меня все в порядке с автоматическими цветами - с оговоркой, что я не хочу, чтобы одно имя говорилось RGB(0,0,0) тогда другое имя существа RGB(10,0,0) где вы не можете различить. Я также собирался прыгать в VBA, и я собирался поработать над этой частью, сохраняя выбранные цвета, и до установки следующий цвет, убедитесь, что каждый R, G, а также B значение как минимум на X% отличается от того, которое я использовал. Или, если проще, я совершенно нормально с выбором себя.
BruceWayne
@jrichall может хранить кучу в списке, используя RGB () и просто перебрать.
BruceWayne

Ответы:

1

Вот решение VBA:

Sub conditional_format_by_name()
Dim rng As Range

On Error Resume Next
Set rng = Application.InputBox("Please select the range to Format", Type:=8)
On Error GoTo 0
If rng Is Nothing Then Exit Sub

rng.Select 'So the user can see the range selected, to know which column they want in the next step

Dim primaryCol As Long
primaryCol = InputBox("Now, **within that range**, which column number do you want to use as the basis for matches?")
rng.Columns(1).Select

Dim primaryList() As Variant
primaryList = rng.Columns(1).Value

Dim unique(), i As Long
unique = removeDuplicates(primaryList)
For i = LBound(unique) To UBound(unique)
    Debug.Print "Adding condition for: " & unique(i)
    rng.FormatConditions.Add Type:=xlExpression, Formula1:="=" & rng.Cells(1).Address(0) & "=""" & unique(i) & """"
    With rng.FormatConditions(1 + i).Interior
        .PatternColorIndex = xlAutomatic
        .Color = ColorRandomizer()
        .TintAndShade = 0.5
    End With
    rng.FormatConditions(1 + i).StopIfTrue = False
Next i
End Sub

Function removeDuplicates(ByVal myArray As Variant) As Variant
'https://stackoverflow.com/a/43102816/4650297
Dim d As Object
Dim v As Variant 'Value for function
Dim outputArray() As Variant
Dim i As Integer

Set d = CreateObject("Scripting.Dictionary")
For i = LBound(myArray) To UBound(myArray)
    d(myArray(i, 1)) = 1
Next i
i = 0
For Each v In d.Keys()
    ReDim Preserve outputArray(0 To i)
    outputArray(i) = v
    i = i + 1
Next v
removeDuplicates = outputArray
End Function
Function ColorRandomizer() As Long
'https://www.ozgrid.com/forum/forum/tip-tricks-code/102242-rgb-color-random
Dim i As Long, j As Long, k As Long, m As Long
Randomize
i = Int((255 * Rnd) + 1)
m = Int((255 * Rnd) + 1)
k = Int((255 * Rnd) + 1)
ColorRandomizer = RGB(i, m, k)
End Function

enter image description here

Проблемы: цвета для каждой группы могут быть близки друг к другу и / или быть слишком темными, чтобы быть эффективными. Буду думать о том, как обойти это. Возможно, придется вернуться R, G, а также B значения и проверьте те, которые я использовал ранее, и если новые значения находятся в пределах, скажем, 25% от уже использованного значения, сгенерировать новое число?

BruceWayne
источник
Это направление, которое я тоже начинал развивать, @BruceWayne, но ваш vba намного более устойчив. Я использовал Interior.ColorIndex особенность, которая определенно использует много разных цветов, но они испечены в Excel и довольно уродливы.
jrichall