Раскраска частичного текста в ячейке в Excel

13

В Excel есть несколько способов динамического цвета полной ячейки на основе ее значения, но есть ли способ динамического цвета только части ячейки на основе ее значения?

Например, скажем, я создаю отчет, который выглядит примерно так:

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

В этом сценарии я хочу только раскрасить значения в процентах (-25%) и (+ 10%), а не значения в долларах 75 и 55 долларов, которые также находятся в ячейке. Добавление к проблеме заключается в том, что раскраска должна быть динамической (зеленый для положительных, красный для отрицательных значений), и эти ячейки являются ссылками (поэтому ручная раскраска не стоит на столе).

Я попытался использовать встроенную TEXT()функцию, но это тоже не сработало. Конкретно я попытался , =TEXT(A1,"$##")&" "&TEXT(A2,"[Green]0%;[Red](-0%)")где A1это ссылка на ячейку на сумму в долларах и A2является ссылкой на ячейку в процентах дельты.

Огорчает то, что настраиваемое форматирование [Green]0%;[Red](-0%)прекрасно работает при применении ко всей ячейке (через раздел настраиваемого форматирования чисел), но при применении через TEXT()функцию перестает работать. Итак, как я могу настроить цвет частичного значения в ячейке?

Моисей
источник
1
Функции Excel не могут этого сделать, условное форматирование применяется только к целым ячейкам, и похоже, что вы исчерпали возможности с пользовательскими числовыми форматами. Это может быть выполнимо в VBA, хотя. (Для простого примера, посмотрите здесь . Мне любопытно, однако. Как вы получаете два числа в одной ячейке, возможно, создавая их в виде строк?
Чафф
@chuff Да, я строил их как строки, чтобы обойти ограничения сетки в Excel (фиксированный размер столбца ширины для каждой строки).
Моисей

Ответы:

8

Было найдено два подхода к решению этой проблемы, и ни один из них не был оптимальным.

Первым подходом было разбиение строк на два отдельных столбца, чтобы я мог использовать один из ранее описанных пользовательских форматов, чтобы установить его цвет. Это не идеальное решение, потому что мне пришлось пойти на компромисс с «внешним видом» отчета, чтобы вместить этот дополнительный столбец.

Второй подход заключается в использовании VBA / макросов, что, хотя я решил избежать в этом конкретном сценарии, было бы до этой задачи. Хотя я не буду распечатывать весь рабочий код, все сводится к следующему:

  1. Найдите ячейку, которую вы хотите настроить (либо через, либо через ActiveCellпетлю)
  2. Используйте Instrфункцию, чтобы найти место в строке, где вы хотите изменить цвет
  3. Если длина текста является переменной, используйте Instrснова, чтобы найти место в строке, где вы хотите остановить цвет
  4. Используйте Characters(start, length)функцию, чтобы выделить точные символы, которые вы хотите изменить, передавая значения, найденные ранее.
  5. Изменить цвет с Font.Color = RGB(r,g,b)
Моисей
источник
1
Не достаточно повторений, чтобы понизить голос, но это было бы мое первое: «Хотя я не буду распечатывать весь рабочий код» - почему бы и нет? Довольно полезно для такого форума.
hmedia1
5

Пример использования макроса можно найти здесь:

Макрос для окраски части текста в ячейках в Excel

Макросы Excel - для циклического окрашивания части ячеек

Используйте макрос Excel, который содержит цикл for, чтобы циклически проходить через строки данных о погоде и окрашивать часть текста ячейки в красный цвет, если он содержит слово hot, и синий, если он содержит слово cool:

инструкции

  1. Нажмите на вкладку Разработчик в Excel
  2. Нажмите на значок Visual Basic и скопируйте текст макроса ниже в окно кода
  3. Нажмите значок Excel, чтобы вернуться к представлению Excel.
  4. Нажмите на значок «Макросы», выберите макрос с именем TextPartColourMacro и нажмите «Выполнить».

Завершенный макрос:

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
источник
2
Цель Супер пользователя - создать базу знаний, а не набор ссылок на ответы где-либо еще. Внешние ссылки могут сломаться, и в этом случае ваш ответ не будет иметь значения. Пожалуйста, включите необходимую информацию в свой ответ и используйте ссылку для указания авторства и дальнейшего чтения.
fixer1234
Это хорошее решение, я буду его развертывать.
htm11h
0

Один выполнимый подход, хотя это не решение в MS EXCEL, если вы разделите сетку листа Excel (ширину ячейки) на символьное пространство, тогда вы можете использовать ее по вашему выбору:

Пример листа

Хуррум Икбал
источник
0

Этот макрос закрасит любой выбранный диапазон текста, содержащий скобки, в красный, если текст в скобках содержит символ «-», в противном случае он будет окрашен в зеленый цвет. Весь текст за скобками остается без изменений.

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
источник
-1

Вставьте строку поверх текста, чтобы выделить ее, сделайте ее настолько широкой, насколько вам нужно, чтобы выделить ее, измените цвет текста на желтый (или любой другой цвет по вашему выбору) и уменьшите непрозрачность линии по своему вкусу.

отметка
источник