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