セルの文章の一部の色や太さを変えるには
シートの中で特定の文字列の色や太さを変更して強調表示したいことがあります。
これをExcelで行う場合は、対象のセルを選んで、その中の特定の文字列を範囲選択して、フォントなどの設定を行う、という流れになります。
この方法はとても面倒です。1セルずつしか設定できませんし、特定の文字列を選択するのはかなり手間が掛かります。
そういう面倒を解消する以下のマクロは選択セル範囲の指定文字列の色や太さを変更するための汎用関数です。私自身、資料作成時にとても活用しています。
また、固定文字列ではなく、正規表現を利用する方法については「正規表現で一致するセルの文字に色を付ける」で紹介しています。例えば、CSVファイルのようにダブルクォーテーションに囲まれている文字列を全て抽出したい場合には「”(.*?)”」と正規表現で指定するとその部分が対象になります。
「”aaaa”,”1234″,”5″,98765,0,”end”」
↓
「“aaaa”,“1234”,“5”,98765,0,“end”」
なお、このマクロのせいではないのですが、マクロ実行後にF2キーでセルを直接編集すると異常終了することがよくあります。その対応方法については後述します。
選択セル範囲の各セルの指定文字列の色と太さを変更する
以下の関数は選択セル範囲の各セルに対して、指定した文字列の色と太さを変更します。
この関数は単独では動作せず、呼び出し元の関数を用意して利用します。
第一引数は変更したい文字列を指定します。第二引数にはRGB関数値での文字色を指定します。第三引数には文字の太さをTrue(太字)かFalse(標準)で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
Sub 指定文字列のフォント変更(a_sSearch, a_lColor, a_bBold) Dim f As Font '// Fontオブジェクト Dim i '// 引数文字列のセルの位置 Dim iLen '// 引数文字列の文字数 Dim r As Range '// セル範囲の1セル iLen = Len(a_sSearch) i = 1 '// 選択セル範囲を1セルずつループ For Each r In Selection '// 指定されたセルの文字列から引数文字列を全て検索 Do '// セル文字列から引数文字列を検索 i = InStr(i, r.Value, a_sSearch) '// 引数文字列が存在しない場合 If (i = 0) Then '// 次検索用に検索開始位置を1に初期化 i = 1 '// このセルの処理を終了 Exit Do End If '// 引数文字列部分のFontオブジェクトを取得 Set f = r.Characters(i, iLen).Font '// フォント設定 f.Color = a_lColor '// 文字色 f.Bold = a_bBold '// 太さ '// 次検索用に検索開始位置をずらす i = i + iLen Loop Next End Sub |
コード説明
2行目 | セルの文字列に引数文字列部分があった場合、その部分のFontオブジェクトを指定するための変数です。 |
3行目 | InStr関数の第一引数に使います。セルの文字列の中で引数文字列がどの位置にあるのかを示すための変数です。 |
4行目 | 引数文字列の文字数です。関数が呼び出されてからは1度しか取得する必要がないため7行目で取得してあとは使い回しをしています。 |
5行目 | 選択セル範囲の中にある各セルを格納する変数です。 |
7行目 | 引数文字列の文字数を取得します。以降の処理で引数文字列の文字数は変更されないためここで取得しています。 |
8行目 | InStr関数用の第一引数の最小は1のため、1に初期化しています。 |
11行目 | 選択セル範囲であるSelectionを1セルずつすべてループ処理します。 |
13行目 | セルの文字列の中にある引数文字列を全て検索するためのループ処理です。 |
15行目 | InStr関数を使ってセル文字列から引数文字列を検索します。 |
18行目 | InStr関数で0が返却された場合は引数文字列が検索できなかったことを指します。 |
20行目 | 次のセルの処理のInStr関数の1回目用に検索開始位置を最小の1に初期化します。 |
23行目 | このセルの文字列からは全ての引数文字列の検索が終了したため、次のセルの処理を行うためにループ処理を終わります。 |
27行目 | 検索で見つかった引数文字列の部分のFontオブジェクトを取得します。 |
30行目 | 引数文字列部分の文字色を引数の文字色で設定します。 |
31行目 | 引数文字列部分の文字の太さを引数の太さで設定します。 |
34行目 | 次のInStr関数の検索位置をずらすために検索開始位置を1増やしています。 |
使用例
セル、文字列、範囲、という文字列をそれぞれ色と太さを設定します。
1 2 3 4 5 |
Sub 指定文字列のフォント変更Test() Call 指定文字列のフォント変更("セル", RGB(255, 0, 0), True) Call 指定文字列のフォント変更("文字列", RGB(0, 190, 100), True) Call 指定文字列のフォント変更("範囲", RGB(100, 100, 255), True) End Sub |
1. 設定したい部分を範囲選択します。空白セルを選択していても構いません。
2. 使用例の関数を実行します。
3. 実行後です。1行目や8行目や11行目のように同じセルに違う指定文字列が複数あっても正しく設定されます。
重要な注意点
このマクロは部分文字列への書式設定を行う便利な方法ですが、このマクロを実行したあとにセルをF2キーで直接編集すると、高い確率で異常終了します。
残念ながら回避方法はExcelの再起動しかありません。なので、このマクロを使う場合は、以下の手順をお勧めします。
- 一度Excelを終了してから対象のブックだけを開く。
- マクロを実行する。マクロの実行は複数回OK。
- マクロの実行が終わったらブックを保存する。
- Excelを終了(再起動)する。
なぜマクロ実行後にF2キーでExcelが異常終了するかについてですが、Excelはセルの文字単位で書式設定を持っており、フォント情報を持ったリッチテキストとしてExcelで管理しているのですが、何度も書式設定を行うと内部的に重複する書式情報の整合性が崩れることがあります。これはExcelのバグなのですが、もう随分前のバージョンから直ってないのでおそらく修正は期待できません。
どういうバグかというと、Excelは文字列の書式を「区間(start, length)」「フォントプロパティ」で管理しているのですが、何度も設定や部分文字列の更新を繰り返すと、この区間情報が重複や分解により整合性が破壊され、その情報を表示しようとすると異常終了する、というものです。
この区間情報が壊れた状態はExcelを再起動しないと直りません。
なので、マクロを使って部分文字色を編集するのはOKなのですが、マクロが終わったらブックを保存して、一度Excelを終了することをお勧めします。