Чередующиеся группы раскрашивания строк в Excel

StackOverflow https://stackoverflow.com/questions/27020

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть таблица 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

Спасибо

Это было полезно?

Решение

Я думаю, это делает то, что вы ищете.Меняет цвет, когда ячейка в столбце А меняет значение.Выполняется до тех пор, пока в столбце 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

Другие советы

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

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

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

enter image description here

enter image description here

enter image description here

Основываясь на ответе Джейсона Z, который из моих тестов кажется неправильным (по крайней мере, в 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

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

enter image description here

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

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

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

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

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

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

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

Я переработал ответ Bartdude для светло-серого / белого цвета на основе настраиваемого столбца, используя значения RGB.Логический параметр var переворачивается при изменении значения, и это используется для индексации массива colors с помощью целых значений 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 раскрасьте любые НУЛЕВЫЕ значения тем же желтым цветом, который используется в 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

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

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

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

Вуаля!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top