和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セル内の特定文字列だけを着色する - Characters

セル内の特定の文字列を着色する方法を解説します。

Instr関数で文字列の位置を特定し、
Charactersプロパティを用いて特定文字列だけを書式設定します。

サンプルコード

Sub セル内の特定文字列だけを着色する()
    
    Dim 対象セル As Range: Set 対象セル = Range("A1")
    Dim 着色文字列 As String: 着色文字列 = "(注)"
    
    ' セル内テキストを検索
    Dim instr位置 As Long
    instr位置 = InStr(対象セル.Value, 着色文字列)
    
    ' 文字列があれば赤色にする
    If instr位置 > 0 Then
        対象セル.Characters(instr位置, Len(着色文字列)).Font.Color = RGB(255, 0, 0)
    End If
    
End Sub

セル内の特定文字列だけを着色

解説

RangeオブジェクトのCharactersプロパティを使用することで、
セル内テキストの一部分だけを操作することができます。


基本構文は以下の通りで、Mid関数と似た仕様となっています。

対象セル.Characters(開始位置, 文字列の長さ)

 
特定文字列を探してその部分だけを着色したい場合は、

Characters(Instrで求めた開始位置, Lenで求めた文字数)

このコードで対象文字列を取得します。


取得した文字列の装飾は、Rangeオブジェクト全体を装飾するときと同様、
「Font」プロパティを使用して設定することができます。

Characters(Instrで求めた開始位置, Lenで求めた文字数).Font.Color = RGB(255, 0, 0)

 

今回の処理において、親オブジェクトにセル範囲は指定できません。
各セルで文字列の発見位置は異なりますからね。


指定セル範囲の特定文字列のみを着色したい場合は、
For Each文などを用いて本コードを全セルに対してループしてください。

Sub セル範囲内の特定文字列だけを着色する()
    
    Dim 対象セル範囲 As Range: Set 対象セル範囲 = Range("A1:C100")
    Dim 着色文字列 As String: 着色文字列 = "(注)"
    
    Dim 着色セル As Range
    For Each 着色セル In 対象セル範囲.Cells
    
        ' セル内テキストを検索
        Dim instr位置 As Long
        instr位置 = InStr(着色セル.Value, 着色文字列)
        
        ' 文字列があれば赤色にする
        If instr位置 > 0 Then
            着色セル.Characters(instr位置, Len(着色文字列)).Font.Color = RGB(255, 0, 0)
        End If
        
    Next
    
End Sub

特定文字列のサイズ/太字/フォント種類を変更する

CharactersのFontプロパティはRange.Fontと同様、
Color以外にも各種文字書式を設定するプロパティを持っています。

例えば以下のようなコードで様々な書式を設定できます。

' フォントサイズ
着色セル.Characters(instr位置, Len(着色文字列)).Font.Size = 12
            
' 太字
着色セル.Characters(instr位置, Len(着色文字列)).Font.Bold = True

' フォント種類
着色セル.Characters(instr位置, Len(着色文字列)).Font.Name = "MS Pゴシック"

 
各種設定とプロパティの対応はMicrosoft公式ページを参照ください。

https://learn.microsoft.com/ja-jp/office/vba/api/excel.font(object)

対象の文字列が複数回登場する場合

上記のコードでは最初に登場した文字列しか装飾できません。

対象の文字列がセル内に複数登場してもすべてを装飾したい場合は、
以下のコードを実行してください。

Sub セル範囲内の特定文字列をすべて着色する()
    
    Dim 対象セル As Range: Set 対象セル = Range("A1")
    Dim 着色文字列 As String: 着色文字列 = "(注)"
    
    Dim i As Long: i = 1
    Do
            
        i = InStr(i, 対象セル, 着色文字列)
        If i = 0 Then Exit Sub
        
        対象セル.Characters(i, Len(着色文字列)).Font.Color = RGB(255, 0, 0)
        
        i = i + 1
    Loop
    
End Sub

 
Instr関数は第1引数を省略せず指定した場合、
その位置より先にある文字列を検索してくれます。

これを利用し前回発見された位置+1文字目から再検索をすることで、
すべての文字列を順に検索することでができます。


やや面倒なコードになりますが、登場する全文字列を装飾したい場合は、
こちらのコードを使用してください。

汎用関数として持っておく

今回の処理をよく行う方は、汎用関数にしておくと便利です。

セル内の特定文字列だけを書式設定する汎用関数がこちらです。

Sub セル内の指定文字列のみを書式設定する(対象セル As Range, ByVal 指定文字列 As String _
    , Optional ByVal 着色RGB値 As Long = -1, Optional is太字にする As Boolean = False _
    , Optional is下線を引く As Boolean = False, Optional is取り消し線を引く As Boolean = False)
    
    If 指定文字列 = "" Then Exit Sub
    
    Dim i As Long: i = 1
    Do
            
        i = InStr(i, 対象セル, 指定文字列)
        If i = 0 Then Exit Sub
        
        With 対象セル.Characters(i, Len(指定文字列)).Font
            If 着色RGB値 >= 0 Then .Color = 着色RGB値
            If is太字にする Then .Bold = True
            If is下線を引く Then .Underline = xlUnderlineStyleSingle
            If is取り消し線を引く Then .Strikethrough = True
        End With
        
        i = i + 1
    Loop
End Sub
' 実行例
Call セル内の指定文字列のみを書式設定する(Range("A1"), "(注)", RGB(255, 0, 0), True)

 
実行例の通り、今回のコードが1行で実行できるようになり、
書きやすく、そして読みやすくなっているのがわかりますね。


今回のような複雑ではないけど意外と行数を要するコードは、
メインコードにベタ打ちするといたずらにコードを読みにくくします。

上記の通り汎用関数にすることで書くのも読むのも楽になりますので、
こういったコードは積極的に汎用関数化していきましょう。