Colorear texto parcial dentro de la celda en Excel

13

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

Por ejemplo, supongamos que estoy creando un informe que se parece a lo 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 de $ 75 y $ 55 que también están en la celda. Además del problema, el color debe ser dinámico (verde para valores positivos, rojo para valores negativos), y estas celdas son referencias (por lo que el color manual está fuera de la tabla).

He intentado usar la TEXT()función integrada, 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 yA2 es la referencia de celda al porcentaje delta.

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?

Moisés
fuente
1
Las funciones de Excel no pueden hacerlo, el formato condicional se aplica solo a celdas enteras y parece que ha agotado las posibilidades con formatos de números personalizados. Sin embargo, podría ser factible en VBA. (Para un ejemplo simple, echar un vistazo aquí estoy curioso, aunque Cómo estás recibiendo dos números en una celda, edificándolos como cadenas, tal vez..?
chuff
@chuff Sí, los estaba construyendo como cadenas para poder sortear las limitaciones de la cuadrícula de Excel (tamaño de columna de ancho fijo para cada fila).
Moisés

Respuestas:

8

Descubrí que había dos enfoques para solucionar este problema, y ​​ninguno era 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 comprometer el "aspecto" del informe para 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é todo el código de trabajo, lo esencial se reduce a esto:

  1. Encuentre la celda que desea ajustar (ya sea a través de ActiveCellun bucle)
  2. Use la Instrfunción para encontrar la ubicación en la cadena donde desea modificar el color
  3. Si la longitud del texto es variable, úsela Instrnuevamente para buscar la ubicación en la cadena donde desea detener el color
  4. Use la Characters(start, length)función para resaltar los caracteres exactos que desea modificar, pasando los valores encontrados anteriormente.
  5. Cambia el color con Font.Color = RGB(r,g,b)
Moisés
fuente
1
No tengo suficiente representante para votar negativamente, pero esta habría sido mi primera: "Si bien no imprimiré el código de trabajo completo" , ¿por qué no? Bastante útil para un foro como este.
hmedia1
5

Un ejemplo usando una macro se puede encontrar aquí:

Macro para colorear parte del texto en celdas en Excel

Macros de Excel: para bucle para colorear parte de celdas

Use una macro de Excel que contenga un bucle for para recorrer las filas de datos meteorológicos y coloree una parte del texto de la celda en rojo si contiene la palabra hot y blue si contiene la palabra cool:

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 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 de Macros, seleccione la macro llamada TextPartColourMacro y haga clic en ejecutar

La macro completada:

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
maverick_99
fuente
2
El propósito de Super User es construir una base de conocimiento en lugar de una colección de enlaces a respuestas en otros lugares. Los enlaces externos pueden romperse, en cuyo caso su respuesta no tendría valor. Incluya la información esencial en su respuesta y use el enlace para la atribución y la lectura adicional.
Fixer1234
Esta es una buena solución, la implementaré.
htm11h
0

Un enfoque factible, aunque no es una solución en MS EXCEL si divide la cuadrícula de la hoja de Excel (ancho de celda) igual a un espacio de caracteres, entonces puede usarlo del color de su elección:

Hoja de ejemplo

Khurrum Iqbal
fuente
0

Esta macro coloreará cualquier rango seleccionado de texto que contenga corchetes a rojo si el texto dentro de los 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
tmag
fuente
-1

Inserte la línea sobre el texto que desea resaltar, haga la línea tan ancha como sea necesario para resaltar, cambie el color del texto a amarillo (o cualquier color que elija) y reduzca la opacidad de la línea a su gusto.

marca
fuente