Чередование раскрасок строк в Excel - PullRequest
11 голосов
/ 26 августа 2008

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

Спасибо

Ответы [ 8 ]

38 голосов
/ 21 июля 2011

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

=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

4 голосов
/ 26 августа 2008

Я думаю, что это делает то, что вы ищете. Меняет цвет, когда ячейка в столбце 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 голосов
/ 06 июня 2013

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

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

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</p> <p>End Sub

1 голос
/ 26 августа 2008

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

enter image description here

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

0 голосов
/ 07 декабря 2015

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

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

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

Voila!

0 голосов
/ 17 июня 2015

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...