
No Excel, existem várias maneiras de colorir dinamicamente uma célula inteira com base em seu valor, mas existe alguma maneira de colorir dinamicamente apenas parte da célula com base em seu valor?
Por exemplo, digamos que eu esteja criando um relatório parecido com o seguinte:
_________________________
| | Dec | Nov |
|_______|___________|_____|
|Gross R| $75 (-25%)| $100|
|_______|___________|_____|
|Net Inc| $55 (+10%)| $50 |
|_______|___________|_____|
Neste cenário desejo apenas colorir os valores percentuais (-25%) e (+10%), não os valores em dólares $75 e $55 que também estão na célula. Para agravar o problema, a coloração deve ser dinâmica (verde para valores positivos, vermelho para valores negativos) e essas células são referências (portanto, a coloração manual está fora de questão).
Tentei usar a TEXT()
função integrada, mas também não funcionou. Especificamente, tentei =TEXT(A1,"$##")&" "&TEXT(A2,"[Green]0%;[Red](-0%)")
onde A1
está a referência da célula ao valor em dólares e A2
a referência da célula ao delta percentual.
O frustrante é que a formatação personalizada [Green]0%;[Red](-0%)
funciona bem quando aplicada à célula inteira (por meio da seção de formatação de número personalizada), mas quando aplicada por meio da TEXT()
função ela para de funcionar. Então, como posso personalizar a cor de um valor parcial dentro de uma célula?
Responder1
Descobri duas abordagens para contornar esse problema, e nenhuma delas foi realmente ideal.
A primeira abordagem foi dividir as strings em duas colunas separadas, dessa forma eu poderia usar uma das formatações personalizadas descritas anteriormente para definir sua cor. Esta não é uma solução ideal porque tive que comprometer a "aparência" do relatório para acomodar aquela coluna extra.
A segunda abordagem é através do uso de VBA/macros, que embora eu tenha optado por evitar neste cenário específico, estaria à altura da tarefa. Embora eu não imprima todo o código de trabalho, o essencial se resume a isto:
- Encontre a célula que deseja ajustar (através
ActiveCell
ou em loop) - Use
Instr
a função para encontrar o local na string onde você deseja modificar a cor - Se o comprimento do texto for variável, use
Instr
novamente para encontrar o local na string onde deseja interromper a cor - Use a
Characters(start, length)
função para destacar os caracteres exatos que você deseja modificar, passando os valores encontrados anteriormente. - Mude a cor com
Font.Color = RGB(r,g,b)
Responder2
Um exemplo usando uma macro pode ser encontrado aqui:
Macro para colorir parte do texto nas células do Excel
Macros do Excel - For Loop para colorir parte das células
Use uma macro do Excel que contenha um loop for para percorrer as linhas de dados meteorológicos e colorir parte do texto da célula em vermelho se contiver a palavra Quente e em azul se contiver a palavra Legal:
Observe que Hot e Cool diferenciam maiúsculas de minúsculas para Instr.
Instruções
- Clique na guia Desenvolvedor no Excel
- Clique no ícone do Visual Basic e copie o texto da macro abaixo na janela de código
- Clique no ícone do Excel para voltar à visualização do Excel
- Clique no ícone Macros, selecione a macro chamada TextPartColourMacro e clique em executar
A macro concluída:
Sub TextPartColourMacro()
' Declarations and Initialisation
Dim Row As Integer, Col As Integer
Dim CurrentCellText As String
Col = 1
' Loop Through Rows 2 to 5
For Row = 2 To 5
' Get Text in Current Cell
CurrentCellText = ActiveSheet.Cells(Row, Col).Value
' Get the Position of the Text Hot and Cool
HotStartPosition = InStr(1, CurrentCellText, "Hot")
CoolStartPosition = InStr(1, CurrentCellText, "Cool")
' Colour the Word Hot Red
If HotStartPosition > 0 Then
ActiveSheet.Cells(Row, Col).Characters(HotStartPosition, 3).Font.Color = RGB(255, 0, 0)
End If
' Colour the Word Cool Blue
If CoolStartPosition > 0 Then
ActiveSheet.Cells(Row, Col).Characters(CoolStartPosition, 4).Font.Color = RGB(0, 0, 255)
End If
Next Row
End Sub
Responder3
Esta macro irá colorir qualquer intervalo selecionado de texto contendo colchetes para vermelho se o texto entre colchetes contiver um caractere "-", caso contrário, irá colori-lo de verde. Todo o texto fora dos colchetes permanece inalterado.
Dim rngCell As Range
Dim CharCount As Integer
Dim BracketBegin As Integer
Dim BracketEnd As Integer
Dim strToColour As String
For Each rngCell In Selection
CharCount = Len(rngCell)
BracketBegin = InStr(1, rngCell, "(")
BracketEnd = InStr(1, rngCell, ")")
With rngCell.Characters(BracketBegin, CharCount - BracketEnd)
' Pull out string to check for +/-
strToColour = rngCell.Characters(BracketBegin, CharCount - BracketEnd).Text
' If negative, colour red, otherwise green
If InStr(strToColour, "-") Then
.Font.Color = vbRed
Else
.Font.Color = vbGreen
End If
End With
Next rngCell
End Sub
[Example][1]
[1]: https://i.stack.imgur.com/4lyN4.png