和風スパゲティのレシピ

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

13本目:文字列の部分フォント

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:文字列の部分フォント

#VBA100本ノック 13本目
選択セル(Selection:複数範囲あり)の文字列に「注意」という文字があった場合は、その「注意」の文字だけを"赤の太字"に設定してください。
セル以外(図形等)が選択されている場合は何もせずに正常終了するようにしてください。

データサンプル

◇ 出題ページはこちら

ソースコード

メインモジュール

Option Explicit

' 100本ノック013:文字列の部分フォント
Sub 選択範囲のセル内テキスト中にある_注意_を赤太字にする()
    
    Dim セル As Range
    For Each セル In Selection
        
        If セル.HasFormula = False Then
            Call セル内の指定文字列のみを書式設定する _
                (セル, "注意", RGB(255, 0, 0), is太字にする:=True)
        End If
        
    Next
    
End Sub

汎用関数モジュール

Option Explicit

' セル内テキストの部分装飾
' 参考:https://www.limecode.jp/entry/utility/highlight-specific-string-in-cell
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

解説

セル内テキストの一部分だけを文字装飾する問題でした。

セル内のテキストの一部分はCharactersプロパティで取得することができ、
これをForEachでループするか、文字数を指定して対象を指定します。


今回は特定の文字列を装飾する問題でしたので、
Instr関数を用いて対象文字を検索して結果をCharactersに渡しています。


あとは検索文字が何度も出てくることがありうるため、
Do文でInstr関数を何度も回すロジックにしています。


解答の通り、これらの処理は丸ごと汎用関数にしています。

かなり便利な関数ですので、ぜひとも実務でもご利用ください。
www.limecode.jp