Pergunta

Eu tenho uma planilha Excel assim

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

Agora quero agrupar os dados de um id alternando a cor de fundo das linhas

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

Alguém pode me ajudar com uma macro ou algum código VBA

Obrigado

Foi útil?

Solução

Acho que isso faz o que você está procurando.Inverte a cor quando a célula na coluna A muda de valor.Executa até que não haja nenhum valor na coluna 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

Outras dicas

Eu uso esta fórmula para obter a entrada para uma formatação condicional:

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

Onde a coluna B contém o item que precisa ser agrupado e E é uma coluna auxiliar.Cada vez que a célula superior (B1 neste caso) é igual à atual (B2), o conteúdo da linha superior da coluna E é retornado.Caso contrário, retornará 1 menos esse conteúdo (ou seja, a saída será 0 ou 1, dependendo do valor da célula superior).

enter image description here

enter image description here

enter image description here

Com base na resposta de Jason Z, que pelos meus testes parece estar errada (pelo menos no Excel 2010), aqui está um código que funciona para mim:

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

Você tem que usar código?se a tabela for estática, por que não usar o recurso de formatação automática?

enter image description here

Também pode ajudar se você "mesclar células" dos mesmos dados.então, talvez se você mesclar as células de "dados, mais dados, ainda mais dados" em uma célula, poderá lidar mais facilmente com o caso clássico "cada linha é uma linha".

Estou barrando isso e tentei modificá-lo para meu uso.Tenho números de pedidos na coluna a e alguns pedidos ocupam várias linhas.Só quero alternar o branco e o cinza por número de pedido.O que tenho aqui alterna cada linha.

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

Se você selecionar a opção de menu Formatação Condicional no item de menu Formatar, será exibida uma caixa de diálogo que permite construir alguma lógica para aplicar a essa célula.

Sua lógica pode não ser a mesma do seu código acima, pode ser mais parecida com:

O valor da célula é | igual a | | e | Branco ....Depois escolha a cor.

Você pode selecionar o botão Adicionar e tornar a condição tão grande quanto necessário.

Reformulei a resposta de Bartdude, para Light Grey/White com base em uma coluna configurável, usando valores RGB.Uma var booleana é invertida quando o valor muda e é usada para indexar a matriz de cores por meio dos valores inteiros True e False.Funciona para mim em 2010.Ligue para o sub com o número da folha.

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

Bônus opcional:para dados SQL, pinte quaisquer valores NULL com o mesmo amarelo usado no 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

Eu uso esta regra no Excel para formatar linhas alternadas:

  1. Destaque as linhas às quais deseja aplicar um estilo alternado.
  2. Pressione "Formatação Condicional" -> Nova Regra
  3. Selecione "Usar uma fórmula para determinar quais células formatar" (última entrada)
  4. Insira a regra no valor do formato: =MOD(ROW(),2)=0
  5. Pressione "Formatar", faça a formatação necessária para linhas alternadas, por exemplo.Preencher -> Cor.
  6. Pressione OK, pressione OK.

Se você deseja formatar colunas alternadas, use =MOD(COLUMN(),2)=0

Voilá!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top