Чередование раскрасок строк в 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 для форматирования чередующихся строк:
- Выделите строки, к которым вы хотите применить чередующийся стиль.
- Нажмите "Условное форматирование" -> Новое правило
- Выберите "Использовать формулу, чтобы определить, какие ячейки форматировать" (последняя запись)
- Введите правило в формате значения:
=MOD(ROW(),2)=0
- Нажмите "Формат", сделайте необходимое форматирование для чередующихся строк, например. Заполнить -> Цвет.
- Нажмите ОК, нажмите ОК.
Если вы хотите отформатировать чередующиеся столбцы, используйте =MOD(COLUMN(),2)=0
Вуаля!