Fragmentação de formatação condicional do Excel

22

Geralmente, crio uma planilha com formatação condicional e defino os intervalos de células para que as regras de formatação condicional sejam aplicadas apenas uma vez a um intervalo de células, por exemplo,

Make $A$1:$A$30 red and
Make $B$1:$B$30 blue.

Após inserir / excluir um número de linhas e / ou colunas, o conjunto de regras de formatação condicional se torna muito fragmentado, com as mesmas regras repetidas para intervalos diferentes. por exemplo

Make $A$1:$A$2 red 
Make $A$3:$A$4 red 
Make $A$5:$A$9 red
Make $A$10:$A$20 red 
Make $A$21:$A$30 red
...
Make $B$1:$B$2 blue 
Make $B$3:$B$4 blue
Make $B$5:$B$9 blue
Make $B$10:$B$20 blue 
Make $B$21:$B$30 blue
....

Existe uma maneira de evitar isso ou estou condenado a limpar os conjuntos de regras manualmente quando eles ficarem muito bagunçados?

Rhys Gibson
fonte

Respostas:

13

Inserir e excluir linhas não faz com que a formatação condicional seja fragmentada.

A causa é copiar / colar entre células ou linhas usando o padrão copiar / colar. A correção é sempre usar o valor da pasta ou a fórmula da pasta. No destino, clique com o botão direito do mouse e a seção Opções de colagem oferecerá 123 (valores) ef (fórmulas). Não copie / cole a formatação, pois isso faz com que as condições sejam copiadas / coladas e, às vezes, elas serão fragmentadas.

Quando você faz uma cópia / colagem padrão, ela também copia as fórmulas condicionais da célula. Digamos que você tenha duas regras:
1) Faça $ A $ 1: $ A $ 30 vermelho
2) Faça $ B $ 1: $ B $ 30 azul
Agora selecione A10: B10 e copie / cole-o em A20: B20. O que o Excel fará é excluir a formatação condicional para A20: B20 das regras aplicadas a essas células e adicionar novas regras que tenham a formatação para A20: B20. Você acaba com quatro regras.
1) Marca = $ A $ 20 vermelho
2) Marca = $ B $ 20 azul
3) Marca = $ A $ 1: $ A $ 19, $ A $ 21: $ A $ 30 vermelho
4) Marca = $ B $ 1: $ B $ 19, $ B $ 21: $ B $ 30 azul
Se você copiasse / colasse apenas o A10 ao A20, o Excel teria notado a mesma regra aplicada à origem e ao destino e não fragmentará as regras. O Excel não é inteligente o suficiente para descobrir como evitar a fragmentação quando sua cópia / colar afeta dois ou mais formatos condicionais.

Inserir e excluir linhas não causa fragmentação, pois o Excel simplesmente expande ou reduz as regras de condição que cobrem a área em que a linha foi inserida ou excluída.

Alguém sugeriu o uso de $ Q: $ Q em vez de $ Q $ 1: $ Q $ 30. Isso não ajuda e você ainda terá fragmentação ao copiar / colar a formatação de célula, conforme observado acima.

user3347790
fonte
Observe também que Recortar <kbd> ctrl-x <kbd> excluirá a formatação condicional do recorte da célula (agora a célula não tem formatação) e colará a formatação na nova célula. Aposto que alguém por aí sabe como evitar isso?
user5389726598465
@ user135711 Depende do que você está tentando fazer. Por padrão, copiar e recortar seleciona as fórmulas, a formatação e os links da célula de origem, com o recorte também removendo o mesmo da célula de origem. Se a intenção é remover a fórmula / valor da fonte, mas manter a formatação, copio / colo o material no destino e excluo a fonte. Excluir (a tecla Del) limpa apenas a fórmula ou o valor. Ele deixa a formatação e os links no lugar.
User3347790
1
A função INDIRECT () votada como resposta em outra versão desta pergunta não funciona porque é avaliada para as células quando usada no campo aplica-se a, como se você inserisse as células manualmente.
User5389726598465
superuser.com/a/1113566/79488 tem uma boa solução alternativa para limpar as regras fragmentadas se você usasse copy / pase
Fabian Schmied 03/01
5

Teve o mesmo problema ao aplicar o formato condicional a uma coluna da tabela. Ao adicionar linhas, achei melhor aplicar a regra a toda a coluna usando $A:$A, ou qualquer que fosse a coluna.

insira a descrição da imagem aqui

CharlieRB
fonte
Na minha experiência, quando a planilha ficar um pouco maior, isso fará com que os formatos condicionais fiquem inchados e os cálculos possam ser reduzidos a um rastreamento.
rohrl77
3

(Esta é uma solução alternativa, então eu a colocaria como um comentário, mas não tenho reputação suficiente.)

Infelizmente, parece que você está fadado a limpar os conjuntos de regras quando eles ficam bagunçados.

Uma maneira fácil de fazer isso é criar uma planilha contendo a formatação necessária, mas sem dados. Isso pode estar na mesma pasta de trabalho que sua planilha original ou em outra pasta de trabalho que você mantém como modelo.

Quando você precisar limpar, vá para esta planilha, clique com o botão direito do mouse no Selecionar tudo , escolha o Pincel e , em seguida, clique no botão Selecionar tudo na planilha original. Os formatos são substituídos pela versão não contaminada.


fonte
2

Copiar / colar / cortar / inserir células manualmente causa o problema e é difícil evitá-lo.

Problema resolvido através da macro VBA.

Em vez de copiar / colar / cortar / inserir células manualmente, faço isso por meio de uma macro do Excel, que preserva os intervalos de células (ativados por meio de um botão).

Sub addAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows.Add (currentRowIndex)
    Set currentCell = Table.DataBodyRange.Cells(currentRowIndex, Table.ListColumns("Column name").Index)
    currentCell.Value = "Cell value"
    Call setCreateButtons
End Sub

Sub removeAndBtnClick()
    Set Button = ActiveSheet.Buttons(Application.Caller)
    With Button.TopLeftCell
        ColumnIndex = .Column
        RowIndex = Button.TopLeftCell.Row
    End With
    currentRowIndex = RowIndex
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.ListRows(currentRowIndex - 1).Delete
End Sub

Sub setCreateButtons()
    Set Table = ActiveSheet.ListObjects("Table name")
    ActiveSheet.Buttons.Delete
    For x = 1 To Table.Range.Rows.Count
        For y = 1 To Table.Range.Columns.Count

            If y = Table.ListColumns("Column name").Index Then
                Set cell = Table.Range.Cells(x, y)
                If cell.Text = "Some condition" Then
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - 2 * cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "-"
                    btn.OnAction = "removeAndBtnClick"
                    Set btn = ActiveSheet.Buttons.Add(cell.Left + cell.Width - cell.Height, cell.Top, cell.Height, cell.Height)
                    btn.Text = "+"
                    btn.OnAction = "addAndBtnClick"
                End If
            End If
        Next
    Next
End Sub

Para redefinir a formatação (não é realmente necessário):

Sub setCondFormat()
    Set Table = ActiveSheet.ListObjects("Table name")
    Table.Range.FormatConditions.Delete
    With Table.ListColumns("Column name").DataBodyRange.FormatConditions _
        .Add(xlExpression, xlEqual, "=ISTLEER(A2)") 'Rule goes here
        With .Interior
            .ColorIndex = 3 'Formatting goes here
        End With
    End With
    ...
End Sub
Peter Gerhat
fonte
3
Não publique a mesma resposta em várias perguntas. Se a mesma informação realmente responder a ambas as perguntas, uma pergunta (geralmente a mais recente) deve ser fechada como duplicata da outra. Você pode indicar isso votando para fechá-lo como duplicado ou, se você não tiver reputação suficiente para isso, levante uma bandeira para indicar que é uma duplicata. Caso contrário, adapte sua resposta a essa pergunta e não cole a mesma em vários lugares.
DavidPostill