PCメモ

Excelを中心とした業務改善の記録

VBA100本ノック13本目:文字列の部分フォント

excel-ubara.com

 

出題内容

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

f:id:abv72:20210913115518p:plain





自分の解答

Sub vba13()

    Dim 検索キーワード  As String
    Dim 発見位置        As Long
    Dim 文字数          As Long
    Dim i               As Long
    
    検索キーワード = "注意"
    文字数 = Len(検索キーワード)
    
    For i = 1 To Selection.Count
        
        発見位置 = InStr(Selection.Item(i), 検索キーワード)
        
        If 発見位置 <> 0 Then
        
            With Selection.Item(i).Characters(Start:=発見位置, Length:=文字数)
                .Font.ColorIndex = 3
                .Font.Bold = True
            End With
        
        Else
        End If
    
    Next

End Sub

2つ目の"注意"に対して処理できていない。
図形が選択されている時の対応ができていない。

f:id:abv72:20210913112625p:plain

修正

Instrで文字列検索する際に、開始位置をずらすことで2つ目の"注意”に対応できるように修正。
"注意"という文字列が存在しない場合は0になる。結果が0になった場合はループを抜ける。

Sub vba13()

    Dim 検索キーワード  As String
    Dim 発見位置        As Long
    Dim 文字数          As Long
    Dim i               As Long
    Dim ix              As Long
    
    検索キーワード = "注意"
    文字数 = Len(検索キーワード)
    
    If TypeName(Selection) <> "Range" Then
        Exit Sub
    End If
    
    For i = 1 To Selection.Count
        ix = 1
        Do
            発見位置 = InStr(ix, Selection.Item(i), 検索キーワード)
            If 発見位置 = 0 Then
                Exit Do
            Else
                With Selection.Item(i).Characters(Start:=発見位置, Length:=文字数)
                    .Font.ColorIndex = 3
                    .Font.Bold = True
                End With
                ix = 発見位置 + 文字数
            End If
            
        Loop
        
    Next

End Sub