Colorear texto parcial dentro de la celda en Excel

Colorear texto parcial dentro de la celda en Excel

En Excel, hay varias formas de colorear dinámicamente una celda completa según su valor, pero ¿hay alguna forma de colorear dinámicamente solo una parte de la celda según su valor?

Por ejemplo, supongamos que estoy creando un informe similar al siguiente:

 _________________________
|       |    Dec    | Nov |
|_______|___________|_____|
|Gross R| $75 (-25%)| $100|
|_______|___________|_____|
|Net Inc| $55 (+10%)| $50 |
|_______|___________|_____|

En este escenario solo deseo colorear los valores porcentuales (-25%) y (+10%), no los valores en dólares $75 y $55 que también están en la celda. Para agravar el problema, la coloración debe ser dinámica (verde para valores positivos, rojo para valores negativos) y estas celdas son referencias (por lo que la coloración manual está fuera de la mesa).

Intenté usar la TEXT()función incorporada, pero tampoco funcionó. Específicamente probé =TEXT(A1,"$##")&" "&TEXT(A2,"[Green]0%;[Red](-0%)")dónde A1está la referencia de celda al monto en dólares y A2es la referencia de celda al delta porcentual.

Lo frustrante es que el formato personalizado [Green]0%;[Red](-0%)funciona bien cuando se aplica a toda la celda (a través de la sección de formato de número personalizado), pero cuando se aplica a través de la TEXT()función deja de funcionar. Entonces, ¿cómo puedo personalizar el color de un valor parcial dentro de una celda?

Respuesta1

Descubrí dos enfoques para solucionar este problema, y ​​ninguno fue realmente óptimo.

El primer enfoque fue dividir las cadenas en dos columnas separadas, de esa manera podría usar uno de los formatos personalizados descritos anteriormente para establecer su color. Esta no es una solución ideal porque tuve que hacer concesiones en la "apariencia" del informe para poder acomodar esa columna adicional.

El segundo enfoque es mediante el uso de VBA/macros, que aunque opté por evitar en este escenario particular, habría estado a la altura de la tarea. Si bien no imprimiré el código de trabajo completo, lo esencial se reduce a esto:

  1. Encuentre la celda que desea ajustar (ya sea a través ActiveCello en bucle)
  2. Utilice Instrla función para encontrar la ubicación en la cadena donde desea modificar el color
  3. Si la longitud del texto es variable, utilícelo Instrnuevamente para buscar la ubicación en la cadena donde desea detener el color.
  4. Utilice la Characters(start, length)función para resaltar los caracteres exactos que desea modificar, pasando los valores encontrados anteriormente.
  5. Cambia el color conFont.Color = RGB(r,g,b)

Respuesta2

Puede encontrar un ejemplo usando una macro aquí:

Macro para colorear parte del texto en celdas en Excel

Macros de Excel: bucle For para colorear parte de las celdas

Utilice una macro de Excel que contenga un bucle for para recorrer filas de datos meteorológicos y colorear parte del texto de la celda de rojo si contiene la palabra Caliente y de azul si contiene la palabra Frío:

Tenga en cuenta que Hot y Cool distinguen entre mayúsculas y minúsculas para Instr.

Instrucciones

  1. Haga clic en la pestaña Desarrollador en Excel
  2. Haga clic en el icono de Visual Basic y copie el texto de la macro a continuación en la ventana de código
  3. Haga clic en el icono de Excel para volver a la vista de Excel.
  4. Haga clic en el icono Macros, seleccione la macro llamada TextPartColourMacro y haga clic en ejecutar

La macro completa:

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

Respuesta3

Esta macro coloreará cualquier rango de texto seleccionado que contenga corchetes en rojo si el texto entre corchetes contiene un carácter "-"; de lo contrario, lo coloreará en verde. Todo el texto fuera de los corchetes permanece sin cambios.

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

información relacionada