Чередование раскрасок строк в Excel

У меня есть таблица Excel, как это

id | данные для id
   | больше данных для id
id | данные для id
id | данные для id
   | больше данных для id
   | еще больше данных для id
id | данные для id
   | больше данных для id
id | данные для id
id | данные для id
   | больше данных для id

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

var color = white
для каждого ряда
    если первая ячейка не пуста и цвет белый
        установить цвет на зеленый
    если первая ячейка не пуста и цвет зеленый
        установить цвет на белый
    установить цвет фона строки

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

Спасибо

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

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

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

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

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

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

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

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

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

Я переработал ответ Бартдуда для Светло-серого / Белого на основе настраиваемого столбца, используя значения RGB. Булево значение var переворачивается при изменении значения, и оно используется для индексации массива цветов через целочисленные значения 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

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

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

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

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

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

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

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

Вуаля!

Другие вопросы по тегам