Сведения о вопросе

GANGST1ER

23:26, 22nd August, 2020

Теги

excel   excel-vba   vba    

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

Просмотров: 445   Ответов: 8

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

Спасибо



  Сведения об ответе

prince

10:20, 27th August, 2020

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

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

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

enter image description here

enter image description here

enter image description here


  Сведения об ответе

qwerty101

00:42, 22nd August, 2020

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


  Сведения об ответе

LIZA

06:02, 25th August, 2020

Основываясь на ответе Джейсона 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


  Сведения об ответе

park

15:11, 9th August, 2020

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

enter image description here

Это также может помочь, если вы "merge cells" из тех же данных. поэтому, возможно, если вы объедините ячейки "data, more data, even more data" в одну ячейку, вам будет легче иметь дело с классическим случаем "each row is a row".


  Сведения об ответе

appple

10:56, 26th August, 2020

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

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


  Сведения об ответе

fo_I_K

00:46, 27th August, 2020

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

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

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

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


  Сведения об ответе

dump

06:30, 14th August, 2020

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


  Сведения об ответе

fo_I_K

03:57, 10th August, 2020

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

  1. Выделите строки, к которым вы хотите применить переменный стиль.
  2. Нажмите "Conditional Formatting" -> Новое Правило
  3. Выберите "Use a formula to determine which cells to format" (последняя запись)
  4. Введите правило в значение формата: =MOD(ROW(),2)=0
  5. Нажмите "Format", сделайте необходимое форматирование для чередующихся строк, например. цвет заливки.
  6. Нажмите OK, Нажмите OK.

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

Вуаля!


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться