Переменные группы раскраски строк в Excel

У меня есть таблица Excel вроде этого

id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id
   | even more data for id
id | data for id
   | more data for id
id | data for id
id | data for id
   | more data for id

Теперь я хочу сгруппировать данные одного идентификатора, чередуя цвет фона строк

var color = white
for each row
    if the first cell is not empty and color is white
        set color to green
    if the first cell is not empty and color is green
        set color to white
    set background of row to color

Может ли кто-нибудь помочь мне с макросом или кодом VBA

Спасибо

Ответ 1

Я думаю, что это делает то, что вы ищете. Отбрасывает цвет, когда ячейка в столбце A изменяет значение. Выполняется до тех пор, пока в столбце B не будет значения.

Public Sub HighLightRows()
    Dim i As Integer
    i = 1
    Dim c As Integer
    c = 3       'red

    Do While (Cells(i, 2) <> "")
        If (Cells(i, 1) <> "") Then    'check for new ID
            If c = 3 Then
                c = 4   'green
            Else
                c = 3   'red
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Ответ 2

Я использую эту формулу, чтобы получить вход для условного форматирования:

=IF(B2=B1,E1,1-E1))    [content of cell E2]

Если столбец B содержит элемент, который необходимо сгруппировать, а E - вспомогательный столбец. Каждый раз, когда верхняя ячейка (B1 в этом случае) совпадает с текущей (B2), возвращается верхнее содержимое строки из столбца E. В противном случае он вернет 1 минус это содержимое (то есть, outupt будет 0 или 1, в зависимости от значения верхней ячейки).

enter image description here

enter image description here

enter image description here

Ответ 3

Вам нужно использовать код? если таблица статична, то почему бы не использовать функцию автоматического форматирования?

enter image description here

Это может также помочь, если вы "объедините ячейки" из тех же данных. так что, возможно, если вы объедините ячейки "данных, больше данных и еще больше данных" в одну ячейку, вы можете более легко справиться с классическим случаем "каждая строка является строкой".

Ответ 4

На основании ответа Jason Z, который из моих тестов кажется неправильным (по крайней мере, в Excel 2010), здесь немного кода, который работает для меня:

Public Sub HighLightRows()
    Dim i As Integer
    i = 2 'start at 2, cause there nothing to compare the first row with
    Dim c As Integer
    c = 2       'Color 1. Check http://dmcritchie.mvps.org/excel/colors.htm for color indexes

    Do While (Cells(i, 1) <> "")
        If (Cells(i, 1) <> Cells(i - 1, 1)) Then 'check for different value in cell A (index=1)
            If c = 2 Then
                c = 34   'color 2
            Else
                c = 2   'color 1
            End If
        End If

        Rows(Trim(Str(i)) + ":" + Trim(Str(i))).Interior.ColorIndex = c
        i = i + 1
    Loop
End Sub

Ответ 5

Я делаю это и пытаюсь изменить его для моего использования. У меня есть порядковые номера в столбце a, а некоторые заказы занимают несколько строк. Просто хочу чередовать белый и серый номер заказа. То, что у меня здесь, чередует каждую строку.

ChangeBackgroundColor() ' ChangeBackgroundColor Macro ' ' Keyboard Shortcut: Ctrl+Shift+B Dim a As Integer a = 1 Dim c As Integer c = 15 'gray Do While (Cells(a, 2) <> "") If (Cells(a, 1) <> "") Then 'check for new ID If c = 15 Then c = 2 'white Else c = 15 'gray End If End If Rows(Trim(Str(a)) + ":" + Trim(Str(a))).Interior.ColorIndex = c a = a + 1 Loop

End Sub

Ответ 6

Если вы выберете опцию "Условное форматирование" в пункте "Формат", вам будет предоставлено диалоговое окно, позволяющее создать некоторую логику для применения к этой ячейке.

Ваша логика может быть не такой, как ваш код выше, это может выглядеть по-другому:

Значение ячейки | равный | | и | Белый.... Затем выберите цвет.

Вы можете выбрать кнопку добавления и сделать условие настолько большим, насколько вам нужно.

Ответ 7

Я переработал ответ Бартдуда для Light Grey/White на основе настраиваемого столбца, используя значения RGB. Булева переменная перевернута, когда значение изменяется, и это используется для индексации массива цветов с помощью целых значений True и False. Работает для меня в 2010 году. Назовите sub с номером листа.

Public Sub HighLightRows(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2, cause there nothing to compare the first row with
    Dim intCol As Integer: intCol = 1 ' define the column with changing values
    Dim Colr1 As Boolean: Colr1 = True ' Will flip True/False; adding 2 gives 1 or 2
    Dim lngColors(2 + True To 2 + False) As Long   ' Indexes : 1 and 2
          ' True = -1, array index 1.    False = 0, array index 2.
    lngColors(2 + False) = RGB(235, 235, 235) ' lngColors(2) = light grey
    lngColors(2 + True) = RGB(255, 255, 255) '  lngColors(1) = white

    Do While (Sheets(intSheet).Cells(intRow, 1) <> "")
        'check for different value in intCol, flip the boolean if it different
        If (Sheets(intSheet).Cells(intRow, intCol) <> Sheets(intSheet).Cells(intRow - 1, intCol)) Then Colr1 = Not Colr1
        Sheets(intSheet).Rows(intRow).Interior.Color = lngColors(2 + Colr1) ' one colour or the other
        ' Optional : retain borders (these no longer show through when interior colour is changed) by specifically setting them
        With Sheets(intSheet).Rows(intRow).Borders
            .LineStyle = xlContinuous
            .Weight = xlThin
            .Color = RGB(220, 220, 220)
        End With
        intRow = intRow + 1
    Loop
End Sub

Дополнительный бонус: для данных SQL, цвет любого значения NULL с тем же желтым, что и в SSMS

Public Sub HighLightNULLs(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2 to avoid the headings
    Dim intCol As Integer
    Dim lngColor As Long: lngColor = RGB(255, 255, 225) ' pale yellow

    For intRow = intRow To Sheets(intSheet).UsedRange.Rows.Count
        For intCol = 1 To Sheets(intSheet).UsedRange.Columns.Count
            If Sheets(intSheet).Cells(intRow, intCol) = "NULL" Then Sheets(intSheet).Cells(intRow, intCol).Interior.Color = lngColor
        Next intCol
    Next intRow
End Sub

Ответ 8

Я использую это правило в Excel для форматирования чередующихся строк:

  • Выделите строки, в которые вы хотите применить альтернативный стиль.
  • Нажмите "Условное форматирование" → Новое правило
  • Выберите "Использовать формулу для определения, какие ячейки нужно форматировать" (последняя запись)
  • Введите правило в формате: =MOD(ROW(),2)=0
  • Нажмите "Формат", сделайте необходимое форматирование для чередующихся строк, например. Заполнить → Цвет.
  • Нажмите OK, нажмите OK.

Если вы хотите форматировать альтернативные столбцы, используйте =MOD(COLUMN(),2)=0

Voila!