Excel: formata condicionalmente uma célula usando o formato de outra célula de correspondência de conteúdo

3

Eu tenho uma planilha do Excel na qual gostaria de criar uma "chave" de células formatadas com valores exclusivos e, em seguida, em outras células de formato de folha usando a formatação de chave.

Por exemplo, minha chave é a seguinte, com um valor por célula e a formatação visual indicada entre parênteses:

A (red background)
B (green background)
C (blue background)

Isso está em uma planilha (ou em um canto remoto da planilha atual, o que for melhor). Em seguida, em uma área que marquei para formatação condicional, posso digitar uma dessas três letras e ter a célula em que a digitei visualmente formatada de acordo com a chave. Então, se eu digitar um "B" em uma das células formatadas condicionalmente, ele obterá um plano de fundo verde.

(Observe que estou usando planos de fundo aqui apenas para facilitar a explicação: o ideal é ter toda a formatação visual copiada, seja cor de primeiro plano, cor do plano de fundo, espessura da fonte, bordas ou o que for. o que eu posso conseguir, obviamente.)

E - só para torná-lo extra-complicado - se eu alterar a formatação na chave, essa alteração deverá ser refletida nas células que fazem referência à chave. Assim, se eu alterar a formatação “B” na chave de um plano de fundo verde para um plano de fundo roxo, qualquer “B” na folha principal deve mudar para a nova cor. Da mesma forma, deve ser possível adicionar ou remover valores da chave e fazer com que essas alterações sejam aplicadas ao conjunto de dados principal.

Estou bem com a alteração de formatação-atualização-na-chave acionada clicando em um botão ou algo assim. Eu suspeito que, se tudo isso for possível, será necessário usar o VBA, mas nunca usei, por isso não sei por onde começar, se for esse o caso. Espero que seja possível sem o VBA.

Eu sei que é possível usar apenas vários formatos condicionais, mas meu caso de uso aqui é que estou tentando criar o recurso descrito acima para alguém que não conheça a formatação condicional. Gostaria de permitir que eles definam uma chave, atualizem-na, se necessário, e continuem a trabalhar sem que eu tenha que reescrever as regras de formatação da planilha para eles.

--- ATUALIZAÇÃO ---

Então, acho que fiquei um pouco incerto sobre o meu pedido original. Deixe-me tentar novamente com uma imagem.

Aimagemmostraa“tecla”àesquerda,ondevaloreseestilossãodefinidosusandoaentradadotecladoedomouse.Àdireita,vocêvêosdadosquedevemserformatadosparacorresponderàchave.

Assim,seeudigitarum"C" em uma célula na área de dados, ele deve ser azul. Além disso, se eu alterar a formatação de "C" na chave para ter um fundo roxo, todos as células "C" devem mudar de azul para roxo. Para mais loucura, se eu adicionar mais à Key (digamos, “D” com um fundo amarelo), então qualquer célula “D” será estilizada para combinar; se eu remover uma entrada de chave, os valores correspondentes na área de dados devem reverter para o estilo padrão.

Isso é mais claro? É possível, no todo ou em parte? Eu não tenho que usar formatação condicional para isso; na verdade, neste momento, suspeito que provavelmente não deveria. Mas estou aberto a qualquer abordagem!

    
por Eric A. Meyer 11.09.2012 / 21:09

2 respostas

3

Isso usa células em A1 para definir a condição de células em D1: D9 - alterar intervalos para atender às suas necessidades:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Target.Address = "$A$1" and Sh.Name="Sheet1" Then
    Sheets(1).Range("D1:D9").FormatConditions(1).Font.Color = Target.Font.Color
    Sheets(1).Range("D1:D9").FormatConditions(1).Interior.Color = Target.Interior.Color
End If

End Sub

Depois de alterar a cor, você terá que alterar a célula editando-a e pressionando Enter (para que o evento de alteração seja acionado)
as condições de formato são ordenadas pela ordem em que as regras são aplicadas. Existem muito mais alterações que poderiam ser aplicadas, basta adicionar outro .FormatConditions(1).Whatever = Target.Whatever ao código

Este código não configura nenhuma condição, apenas altera o (s) que estão lá. As condições são numeradas na ordem da regra exibida na tela

se você não quiser usar a formatação condicional e apenas colorir as células, poderá fazer um loop de cada célula dessa maneira:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

If Intersect(Target, Range("A:A")) Is Nothing Or Sh.Name <> "Sheet1" Then Exit Sub
' exit if not in key range (formatting key is A:A on sheet1
If VarType(Target) > vbArray Then Exit Sub
' if multiple cells are changed at once, then exit, as i'm not going to fight with multi cell change

Dim TargetRange As Range
Dim lCell As Object

Set TargetRange = Sh.Range("D1:D9")
' changing cells in this area

For Each lCell In TargetRange.Cells
    If lCell.Value = Target.Value Then
    ' only change cells that match the edited cell
        lCell.Font.Color = Target.Font.Color
        lCell.Interior.Color = Target.Interior.Color
        ' copy whatever you feel needs to be copied
    End If
Next

End Sub
    
por 11.09.2012 / 23:47
0

Aqui está uma extensão do que Sean fez (mostrando apenas o interior do Sub):

If Intersect(Target, Range("A:G")) Is Nothing Or Sh.Name <> "Sheet3" Then Exit Sub
' exit if not in key range (formatting key is A:A on sheet1
If VarType(Target) > vbArray Then Exit Sub
' if multiple cells are changed at once, then exit, as i'm not going to fight with multi cell change

Dim KeyRange As Range
Dim TargetRange As Range
Dim lCell As Object
Dim kCell As Object

Set KeyRange = Sh.Range("A1:A10")
' formatting key is here
Set TargetRange = Sh.Range("D1:F9")
' changing cells in this area

For Each kCell In KeyRange.Cells
 If kCell.Value <> "" Then
  For Each lCell In TargetRange.Cells
    If lCell.Value = kCell.Value Then
    ' only change cells that match the edited cell
        lCell.Font.Color = kCell.Font.Color
        lCell.Interior.Color = kCell.Interior.Color
        ' copy whatever you feel needs to be copied
    End If
  Next
  End If
Next
    
por 13.09.2012 / 17:33