セルの文章の一部の色や太さを変えるには

シートの中で特定の文字列の色や太さを変更して強調表示したいことがあります。

これをExcelで行う場合は、対象のセルを選んで、その中の特定の文字列を範囲選択して、フォントなどの設定を行う、という流れになります。

この方法はとても面倒です。1セルずつしか設定できませんし、特定の文字列を選択するのはかなり手間が掛かります。

そういう面倒を解消する以下のマクロは選択セル範囲の指定文字列の色や太さを変更するための汎用関数です。私自身、資料作成時にとても活用しています。

また、固定文字列ではなく、正規表現を利用する方法については「正規表現で一致するセルの文字に色を付ける」で紹介しています。例えば、CSVファイルのようにダブルクォーテーションに囲まれている文字列を全て抽出したい場合には「”(.*?)”」と正規表現で指定するとその部分が対象になります。

「”aaaa”,”1234″,”5″,98765,0,”end”」

“aaaa”,“1234”,“5”,98765,0,“end”

なお、このマクロのせいではないのですが、マクロ実行後にF2キーでセルを直接編集すると異常終了することがよくあります。その対応方法については後述します。

選択セル範囲の各セルの指定文字列の色と太さを変更する

以下の関数は選択セル範囲の各セルに対して、指定した文字列の色と太さを変更します。

この関数は単独では動作せず、呼び出し元の関数を用意して利用します。

第一引数は変更したい文字列を指定します。第二引数にはRGB関数値での文字色を指定します。第三引数には文字の太さをTrue(太字)かFalse(標準)で指定します。

 

コード説明

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. 実行後です。1行目や8行目や11行目のように同じセルに違う指定文字列が複数あっても正しく設定されます。

重要な注意点

このマクロは部分文字列への書式設定を行う便利な方法ですが、このマクロを実行したあとにセルをF2キーで直接編集すると、高い確率で異常終了します。

残念ながら回避方法はExcelの再起動しかありません。なので、このマクロを使う場合は、以下の手順をお勧めします。

  1. 一度Excelを終了してから対象のブックだけを開く。
  2. マクロを実行する。マクロの実行は複数回OK。
  3. マクロの実行が終わったらブックを保存する。
  4. Excelを終了(再起動)する。

なぜマクロ実行後にF2キーでExcelが異常終了するかについてですが、Excelはセルの文字単位で書式設定を持っており、フォント情報を持ったリッチテキストとしてExcelで管理しているのですが、何度も書式設定を行うと内部的に重複する書式情報の整合性が崩れることがあります。これはExcelのバグなのですが、もう随分前のバージョンから直ってないのでおそらく修正は期待できません。

どういうバグかというと、Excelは文字列の書式を「区間(start, length)」「フォントプロパティ」で管理しているのですが、何度も設定や部分文字列の更新を繰り返すと、この区間情報が重複や分解により整合性が破壊され、その情報を表示しようとすると異常終了する、というものです。

この区間情報が壊れた状態はExcelを再起動しないと直りません。

なので、マクロを使って部分文字色を編集するのはOKなのですが、マクロが終わったらブックを保存して、一度Excelを終了することをお勧めします。