
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
この問題を回避するために私が発見したアプローチは 2 つありましたが、どちらも実際には最適ではありませんでした。
最初のアプローチは、文字列を 2 つの別々の列に分割することでした。こうすることで、前述のカスタム書式設定の 1 つを使用して色を設定できます。この追加の列に対応するためにレポートの「外観と操作性」を妥協する必要があったため、これは理想的な解決策ではありません。
2 番目の方法は、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