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

Mos*_*ses 14 microsoft-excel microsoft-excel-2010

在 Excel 中,有几种方法可以根据其值动态地为整个单元格着色,但是有没有办法根据其值动态地仅对单元格的一部分进行着色?

例如,假设我正在构建一个类似于以下内容的报告:

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

在这种情况下,我只想为百分比值 (-25%) 和 (+10%) 着色,而不是单元格中的美元值 $75 和 $55。增加问题的是着色应该是动态的(绿色表示正值,红色表示负值),并且这些单元格是参考(因此手动着色不在表格中)。

我曾尝试使用内置TEXT()函数,但这也不起作用。具体来说我试图=TEXT(A1,"$##")&" "&TEXT(A2,"[Green]0%;[Red](-0%)")其中A1是单元参照金额和A2是单元参照百分比增量。

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

Mos*_*ses 8

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

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

第二种方法是通过使用 VBA/宏,虽然我在这个特定场景中选择避免使用它,但本来可以完成任务。虽然我不会打印出整个工作代码,但本质上归结为:

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

  • 没有足够的代表来拒绝投票,但这将是我的第一次:_“虽然我不会打印出整个工作代码”_ - 为什么不呢?对这样的论坛很有帮助。 (2认同)

小智 7

可以在此处找到使用宏的示例:

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

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

使用包含 for 循环的 Excel 宏循环遍历天气数据行和单元格文本的颜色部分(如果它包含单词 Hot 和蓝色如果它包含单词 Cool):

请注意 Instr 的 Hot 和 Cool 区分大小写。

指示

  1. 单击 Excel 中的开发工具选项卡
  2. 单击 Visual Basic 图标并将下面的宏文本复制到 1 代码窗口中
  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
Run Code Online (Sandbox Code Playgroud)

  • 超级用户的目的是建立一个知识库,而不是指向其他地方答案的链接集合。外部链接可能会中断,在这种情况下,您的答案将毫无价值。请在您的答案中包含基本信息,并使用链接进行归属和进一步阅读。 (2认同)