Excel 单元格内的部分文本着色

Excel 单元格内的部分文本着色

在 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%)")单元格引用百分比增量的位置。A1A2

令人沮丧的是,自定义格式[Green]0%;[Red](-0%)在应用于整个单元格时(通过自定义数字格式部分)工作正常,但通过函数应用时TEXT()它停止工作。那么,我如何自定义单元格内部分值的颜色?

答案1

我发现有两种方法可以解决这个问题,但都不是最佳方法。

第一种方法是将字符串分成两个单独的列,这样我就可以使用前面描述的自定义格式之一来设置其颜色。这不是一个理想的解决方案,因为我不得不在报告的“外观和感觉”上做出妥协,以容纳额外的列。

第二种方法是使用 VBA/宏,虽然我选择在这种特定情况下避免使用,但它可以胜任这项任务。虽然我不会打印出整个工作代码,但它的基本内容可以归结为:

  1. 找到您想要调整的单元格(通过ActiveCell或循环)
  2. 使用Instr函数在字符串中查找想要修改颜色的位置
  3. 如果文本长度可变,请Instr再次使用以在字符串中查找希望停止颜色的位置
  4. 使用该Characters(start, length)函数突出显示您想要修改的精确字符,并传递之前找到的值。
  5. 改变颜色Font.Color = RGB(r,g,b)

答案2

这里有一个使用宏的示例:

用于在 Excel 单元格中为部分文本着色的宏

Excel 宏 - For 循环为部分单元格着色

使用包含 for 循环的 Excel 宏来循环遍历天气数据行,如果单元格文本中包含单词 Hot,则将其部分变为红色;如果单元格文本中包含单词 Cool,则将其部分变为蓝色:

请注意,对于 Instr,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

答案3

如果括号内的文本包含“-”字符,则此宏会将任何选定的包含括号的文本范围染成红色,否则将其染成绿色。括号外的所有文本保持不变。

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

相关内容