Чередование раскрашивания групп строк в 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

Спасибо


person Marijn Deé    schedule 25.08.2008    source источник


Ответы (8)


Я думаю, что это делает то, что вы ищете. Меняет цвет, когда ячейка в столбце 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
person Jason Z    schedule 26.08.2008
comment
Возможно, я неправильно понял, но откуда я это вижу и из моих тестов, это переключает цвет от строки к строке, если столбцы A и B не пусты... поэтому не отвечаю на вопрос. Но может я что-то упустил... - person Laurent S.; 06.06.2013

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

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

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

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person Adriano P    schedule 20.07.2011
comment
Отличный ответ. В качестве альтернативы функции MOD вы можете использовать 1 - E1. Итак, полная формула =IF(B2=B1,E1,1-E1) - person Kasaku; 20.03.2012
comment
В моем случае я не могу использовать точку с запятой (;) в формуле, только запятая (,) приемлема для Excel. Я использую MS Excel v 14.0.7106.5003 32-бит. - person rockXrock; 10.01.2014
comment
Можно ли избежать использования дополнительного столбца? - person Salman A; 03.09.2014
comment
@salman-a, я не мог найти решение без этого дополнительного столбца, но вы можете его скрыть. - person Adriano P; 01.12.2014
comment
Отличный ответ. В зависимости от вашей версии Excel вам может повезти, если вы воспользуетесь следующей формулой описания правила: =$P2=1 - person Ben Griswold; 06.01.2016

Основываясь на ответе Джейсона З., который из моих тестов кажется неверным (по крайней мере, в Excel 2010), вот небольшой код, который у меня работает:

Public Sub HighLightRows()
    Dim i As Integer
    i = 2 'start at 2, cause there's 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
person Laurent S.    schedule 06.06.2013
comment
Первоначально я ответил на вопрос еще в 2008 году, поэтому меня совсем не удивит, если Office 2010 сломает что-то из Office 2007. - person Jason Z; 10.06.2013
comment
Этот работал на меня. Спасибо .. У меня есть один вопрос. Когда я запускаю этот код VBA, он отлично окрашивается, но также удаляет строки/границы столбцов. Можно ли не удалять эти строки? и просто покрасить ряды? - person Aman Devrath; 20.06.2018
comment
@AmanDevrath Я бы посоветовал вам написать свой собственный вопрос с этим запросом. Я думаю, что это очень возможно и довольно просто... - person Laurent S.; 20.06.2018
comment
Хорошо. Спасибо. - person Aman Devrath; 21.06.2018

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

введите здесь описание изображения

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

person csmba    schedule 25.08.2008
comment
Это то, что мне нужно, но я не знаю, как это сделать :) на основе предоставленного объяснения - person Pawel Cioch; 28.10.2014

Я курил это и пытался изменить его для своего использования. У меня есть номера заказов в столбце 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

person KyleF    schedule 23.02.2015

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

Ваша логика может отличаться от кода выше, она может выглядеть примерно так:

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

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

person Daniel Pollard    schedule 25.08.2008

Я переработал ответ Bartdude для светло-серого/белого на основе настраиваемого столбца с использованием значений RGB. Логическая переменная переворачивается при изменении значения, и это используется для индексации массива цветов через целочисленные значения True и False. У меня работает на 2010. Звоните в саб с номером листа.

Public Sub HighLightRows(intSheet As Integer)
    Dim intRow As Integer: intRow = 2 ' start at 2, cause there's 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's 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
person AjV Jsy    schedule 17.06.2015

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

  1. Выделите строки, к которым вы хотите применить чередующийся стиль.
  2. Нажмите «Условное форматирование» -> «Новое правило».
  3. Выберите «Использовать формулу, чтобы определить, какие ячейки форматировать» (последняя запись)
  4. Введите правило в формате: =MOD(ROW(),2)=0
  5. Нажмите «Формат», сделайте необходимое форматирование для чередующихся строк, например. Заливка -> Цвет.
  6. Нажмите ОК, нажмите ОК.

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

Вуаля!

person GONeale    schedule 07.12.2015
comment
Привет, вы отвечаете на альтернативный цвет строки, вопросы хотят раскрасить группу данных, а не сейчас. - person ozmike; 29.02.2016