在 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
我发现有两种方法可以解决这个问题,但都不是最佳方法。
第一种方法是将字符串分成两个单独的列,这样我就可以使用前面描述的自定义格式之一来设置其颜色。这不是一个理想的解决方案,因为我不得不在报告的“外观和感觉”上做出妥协,以容纳额外的列。
第二种方法是使用 VBA/宏,虽然我选择在这种特定情况下避免使用,但它可以胜任这项任务。虽然我不会打印出整个工作代码,但它的基本内容可以归结为:
- 找到您想要调整的单元格(通过
ActiveCell
或循环) - 使用
Instr
函数在字符串中查找想要修改颜色的位置 - 如果文本长度可变,请
Instr
再次使用以在字符串中查找希望停止颜色的位置 - 使用该
Characters(start, length)
函数突出显示您想要修改的精确字符,并传递之前找到的值。 - 改变颜色
Font.Color = RGB(r,g,b)
答案2
这里有一个使用宏的示例:
Excel 宏 - For 循环为部分单元格着色
使用包含 for 循环的 Excel 宏来循环遍历天气数据行,如果单元格文本中包含单词 Hot,则将其部分变为红色;如果单元格文本中包含单词 Cool,则将其部分变为蓝色:
请注意,对于 Instr,Hot 和 Cool 区分大小写。
指示
- 单击 Excel 中的“开发工具”选项卡
- 单击 Visual Basic 图标并将下面的宏文本复制到代码窗口中
- 单击 Excel 图标切换回 Excel 视图
- 单击宏图标,选择名为 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