Alternando grupos de cores de linhas no Excel
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
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).
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?
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:
- Destaque as linhas às quais deseja aplicar um estilo alternado.
- Pressione "Formatação Condicional" -> Nova Regra
- Selecione "Usar uma fórmula para determinar quais células formatar" (última entrada)
- Insira a regra no valor do formato:
=MOD(ROW(),2)=0
- Pressione "Formatar", faça a formatação necessária para linhas alternadas, por exemplo.Preencher -> Cor.
- Pressione OK, pressione OK.
Se você deseja formatar colunas alternadas, use =MOD(COLUMN(),2)=0
Voilá!