セル文字列の書式設定を部分的に変更する

中級VBA

はじめに

 セルの文字列内の特定のワードの書式設定を変更するプログラムを書いてみましょう。
 「マクロの記録」を使ってセルの文字列の一部分を変更すればヒントが見えてきます。

マクロの記録で出力されるコード

 セルに適当な文字列を入力して、マクロの記録を開始して文字列の一部分の書式設定を変更してみましょう。
 今回は以下の様にフォントサイズを一部変更してみした。

Sub Macro1()
    ActiveCell.FormulaR1C1 = "ABCDABCD"
    With ActiveCell.Characters(Start:=1, Length:=0).Font
        .Name = "MS Pゴシック"
        .FontStyle = "標準"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    With ActiveCell.Characters(Start:=1, Length:=2).Font
        .Name = "MS Pゴシック"
        .FontStyle = "標準"
        .Size = 16
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
    With ActiveCell.Characters(Start:=3, Length:=6).Font
        .Name = "MS Pゴシック"
        .FontStyle = "標準"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
End Sub

 長々と出力されましたが、変更しているのはフォントサイズ部分だけなので、重複しているところはカットしてOKです。
 更に Withステートメントも外すと以下の様になります。

Sub Macro1改()
    ActiveCell.FormulaR1C1 = "ABCDABCD"
    ActiveCell.Characters(Start:=1, Length:=0).Font.Size = 11
    ActiveCell.Characters(Start:=1, Length:=2).Font.Size = 16
    ActiveCell.Characters(Start:=3, Length:=6).Font.Size = 11
End Sub

 だいぶスッキリと書けました。
 最初の行の、ActiveCell.FormulaR1C1 = “ABCDABCD” については数式バーを編集状態にした事で出力されたものだと思います。
 

ActiveCell.Characters の使い方

 さて、今回の主役となるのが、 ActiveCell.Characters です。引数は、StartLength の2つで、両方とも省略可能で、省略した場合は全ての文字列が対象となります。

ActiveCell.Characters は、セルの文字列に対してプロパティを設定する事ができますが、文字列の範囲を指定する事ができます。尚、セルに文字列以外の数値日付型などが設定されている場合は上手く動作しないので注意してください。

 Start開始位置
 Length対象とする文字数になります。

 引数を1つ取った場合はStartを指定した事になり、開始する位置を指定できます。
 Length:=0 とした場合は、全ての文字列が対象となります。

 という事で2行目は()部分を無くして、以下の様に書いてもOKです。
 
 ActiveCell.Characters.Font.Size = 11
 
 上記のプログラムでは、セルの文字列全体のフォントサイズを 11 にセットしています。
 続く2行は、先頭から2文字をフォントサイズ 16 に、3文字目から6文字をフォントサイズ 11 にセットしています。
 
 結果的に、今回は標準のフォントサイズが 11 なので、下線部分のコードのみで良かったことになります。

検索部分の文字列のフォントサイズ変更

 セルの文字列の一部分の書式設定を変更する方法がわかりましたので、検索して書式設定を変更するプログラムを書いてみます。
 
 セルの文字列から検索文字列を探すにはInStr関数を使います。InStr関数は、文字列と検索する文字列を与えると、ヒットした位置を返してくれます。(InStr関数の詳細はこちらを参照してください。)
 
 これを利用してセルの文字列の一部分を変更してみましょう。

Sub myMacro1()
    Dim hit As Long, sStr As String, l As Long
    sStr = "AB"
    l = Len(sStr)
    hit = InStr(ActiveCell.Text, sStr)
    ActiveCell.Characters(Start:=hit, Length:=l).Font.Size = 16
End Sub

 プログラム実行前は以下の状態です。

 実行してみると以下の様になります。

 最初の検索文字”AB”のフォントサイズが変更されています。ただ、検索文字列の“AB”は2回出てきますので2回目の“AB”もフォントサイズを変更したいところです。

複数回検索して文字列のフォントサイズを変更

 複数回検索するには、InStr関数の第一引数である検索開始位置を指定しながら繰り返す必要があります。

 InStr関数を使って文字列を複数回検索する方法については以下を参考にしてみてください。
 ・文字列を複数回検索する

Sub myMacro2()
    Dim hit As Long, sStr As String, l As Long
    sStr = "AB"
    l = Len(sStr)
    
    hit = 0
    Do
        hit = InStr(hit + 1, ActiveCell.Text, sStr)
        If hit < 1 Then Exit Do
        ActiveCell.Characters(Start:=hit, Length:=l).Font.Size = 16
    Loop
    
End Sub

 このプログラムでは、1回目の検索で得た結果から次の検索位置を指定して2回目以降の検索開始位置に指定しています。
 検索文字列が存在すれば何度もInStr関数が実行され、検索文字列が見つからなかった時点でループを抜けます。

まとめ

 セル文字列の書式設定を部分的に変更するには、マクロの記録でコードを出力するとオブジェクトやそのプロパティが確認できるので便利です。
 
 ActiveCell.Charactersに関しては文字列以外(数値や数式、日付型)では上手くいかないので注意してください。
 
 検索文字列が出現するのは1回とは限りませんので、InStr関数の開始位置を調節しながら繰り返す事で、全ての検索文字列にヒットさせることが可能です。

Do Loop のプログラムミスに注意

 Do Loop に関してはプログラムを間違えると無限ループとなりExcelが反応しなくなる事があります。
 ”Loop”の行にブレークポイントを設置するか、”Loop”の前に Stop を書けば、繰返し処理を1回づつ止めながら動作させる事ができるので、開発段階では設定するようにしましょう。
 Do Loop を書くときは注意を払いましょう。

タイトルとURLをコピーしました