
在 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 的“熱”和“冷”區分大小寫。
指示
- 按一下 Excel 中的「開發工具」標籤
- 點擊 Visual Basic 圖示並將下面的巨集文字複製到程式碼視窗 1
- 點選 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