TL;DR —
Range.Fontはセルの テキスト層 です。色、太字、斜体、サイズ、フォント名。 そのどれも下にある値は変えません — 赤い数値も、やはりただの数値のままです。人がつまずくのは 色の部分だけで、それは設定方法が 3 通り あり、そのうち 2 つが別々の数の空間に住んで いるからです。好きな色にしたいならRange("A1").Font.Color = RGB(200, 0, 0)を使いましょう。Range("A1").Font.ColorIndex = 3は、Excel の古い 56 スロットのパレットを扱っているときだけ 使います — そして 2 つを決して混ぜないこと。.Color = 3と.ColorIndex = 3はまったく別の 赤だからです。
' ヘッダー行を太字と濃い青にする - プロパティごとに 1 文。
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
With ws.Range("A1:F1").Font
.Bold = True
.Color = RGB(0, 32, 96) ' 24 ビット RGB - 95% の場面で欲しいのはこれ
.Size = 12
End With
テキストの見た目を変えること — それは、たいていの人が VBA で最初に自動化する作業であり、
同時に、この言語全体で最も紛らわしいバグが潜む場所でもあります。.Color と .ColorIndex の
違いです。本記事は、残りをすべて自明にする 1 つの考えを軸に組み立てられています。Font
オブジェクトは見た目だけを制御し、その色プロパティには互換性のない 2 つの流儀がある。 そこ
さえ押さえれば、太字、サイズ、フォント名、部分的な書式設定のすべてが腑に落ちます。
この記事で学べること
- 考え方の軸 —
Fontはテキスト層であり、値には決して触れない - 最も大事なルール —
.Color(RGB)と.ColorIndex(パレット)は別々の数の空間 - 太字、斜体、サイズ、フォント名 — テキスト層の残りを
Withで設定する Charactersでセルの一部を書式設定する、そしてそれが静かに何もしないとき- 値に基づく色付けがループではなく条件付き書式の担当である理由
- フォント色を、意外な数値を受け取らずに読み戻す
考え方の軸:Font はテキスト層
セルには 3 つの視覚的な層があり、VBA はそれぞれ別のオブジェクトを通して届きます。テキスト
(その Font)、その背後の塗り(その Interior)、そして数値がどう
表示されるか(その NumberFormat)です。本記事は最初の層です。
Range.Font の下のすべてのプロパティ — Color、Bold、Italic、Underline、Size、Name、
Strikethrough — は、文字がどう見えるかを変えるだけで、ほかには何もしません。
それがこの記事の要点そのものであり、はっきり言っておく価値があります。よくある誤解の根っこ
だからです。**テキストに色を付けても、それに印を付けたことにはなりません。*フォントを赤くした
セルは、依然として同じ数値を持ち、同じ数式に流れ込み、SUM、SUMIF、IF からは見えません。
色は人間の目のためのものであって、Excel の計算エンジンのためのものではありません。フォント色に
何かを意味*させている自分に気づいたら — 「赤いセルは期限切れ」のように — その意味を、数式が
読める本物の値としてどこかに置き、色はその結果にしましょう。
最も大事なルール:Color と ColorIndex は別々の数の空間
持ち帰るべきはこの 1 点です。Font には色のプロパティが 2 つあり、両者は同じ言語を話しません。
' .Color は 24 ビットの RGB 値を取る。RGB(red, green, blue) で作り、各 0-255。
ws.Range("A1").Font.Color = RGB(200, 0, 0) ' 強い赤
' .ColorIndex はパレットのスロット、1 から 56 を取る。Excel の従来の色テーブルから。
ws.Range("A2").Font.ColorIndex = 3 ' これも赤 - ただし別の赤
どちらの行もテキストを赤くするので、互換に見えます。そうではありません。.Color = 3 は
ColorIndex 3 の赤にはならず — RGB(3, 0, 0)、つまりほぼ黒になります。数値 3 は、ColorIndex
にとっては「パレットのスロット 3」を、Color にとっては「ごく小さな RGB 値 3」を意味します。
一方のプロパティにもう一方の数値を渡すこと — これがフォントの第 1 位のバグで、しかも静かに
失敗します。エラーは出ず、ただ色が違うのです。
ルールは単純です。**色は .Color = RGB(r, g, b) で設定する。**これで 1,600 万色すべてをカバー
でき、書いたとおりに読み戻せます。.ColorIndex に手を伸ばすのは 2 つの状況だけです。既存の
パレットベースのブックに合わせるとき、あるいは RGB に等価物のない 2 つの特別な値のどちらかが
欲しいときです。
ws.Range("A1").Font.ColorIndex = xlColorIndexAutomatic ' テーマの自動色に戻す
ws.Range("A1").Font.ColorIndex = xlColorIndexNone ' (Interior のみ、後述)
xlColorIndexAutomatic は本当に便利です — フォント色を「自動」(たいていは黒ですが、テーマに
追随します)に戻すもので、これはどの単一の RGB 値でも表現できません。それ以外のすべてでは、
RGB を使った .Color が正直な選択です。
太字、サイズ、フォント名:テキスト層の残り
ほかのフォントプロパティは、気持ちいいほど退屈です — 素朴なブール値、数値、文字列です。ふつうは
複数を一度に設定するので、With を使えば読みやすさが保て、そのたびに範囲を解決し直さずに
済みます(VBA With で扱ったのと同じ理由です)。
With ws.Range("B2:B50").Font
.Bold = True
.Italic = False
.Underline = xlUnderlineStyleSingle
.Size = 11 ' ポイント
.Name = "Calibri"
.Color = RGB(0, 0, 0)
End With
知っておく価値のある点がいくつか。.Bold、.Italic、.Strikethrough は True/False です。
.Size はピクセルではなくポイント単位です。.Name は書体を文字列で指定するもので、綴りを
間違えたり、インストールされていないフォント名を指定したりすると、Excel はエラーを出す代わりに
静かに既定のフォントで代用します — なので「何も起きなかった」バグは、たいていフォント名の
打ち間違いです。
セルの一部を書式設定する:Characters()
ここまではすべてセル全体を書式設定してきました。テキストの一部にスタイルを当てるには —
最初の単語を太字にする、末尾に色を付ける — Characters(start, length) を使います。
' A1 の最初の 4 文字だけを太字にする。
ws.Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True
これは強力ですが、人がつまずく厳しい制限が 1 つあります。**Characters は、文字列リテラルを
保持するセルにしか効きません。**セルに数式、数値、または日付が入っていると、指定できる編集可能な
文字が存在せず、呼び出しは何もしません(あるいはエラーになります)。部分的な書式設定は、打ち込んだ
テキストの性質であって、計算結果の性質ではありません — なのでラベルやメモ用であり、コードが
上書きするセル用ではありません。
値で色を付けるのにループしない — それは条件付き書式の仕事
ここは意見の分かれる部分で、そして最も多くの苦労を救ってくれます。定番の初心者マクロは、範囲を 歩いて、条件に合うセルに色を付けます。
' 惹かれるが、データが変わった瞬間に古びる。
Dim c As Range
For Each c In ws.Range("B2:B1000")
If c.Value < 0 Then c.Font.Color = RGB(200, 0, 0)
Next c
これはちょうど 1 回だけ効きます。色は、ループが走った時点で撮られたスナップショットです。 あとから値を編集すれば、書式は今や間違っています。何も再評価しないからです。値に駆動される色 こそ、条件付き書式が存在する理由そのものであり、それも VBA から設定できます。
' ルールを一度設定する。Excel が永遠に正しく保つ。
With ws.Range("B2:B1000").FormatConditions
.Delete
.Add(Type:=xlCellValue, Operator:=xlLess, Formula1:="0").Font.Color = RGB(200, 0, 0)
End With
直接の Font.Color ループを使うのは、静的で 1 回きりの印付けのときだけにしましょう —
これから PDF に書き出すレポート、凍結したいスナップショット。色付けが生きたデータに追随
すべきになった瞬間、代わりに FormatCondition を追加します。ルールがふさわしい場面でループに
手を伸ばすこと — それが「ハイライトがおかしい」という問い合わせが存在する、最もよくある理由です。
フォント色を読み戻す
色の設定は簡単ですが、読み戻しには罠があります。.Color で設定したなら .Color で読む。
.ColorIndex で設定したなら .ColorIndex で読む。設定していないほうのプロパティを読むと、
変換された、しばしば意外な数値が返ります。
ws.Range("A1").Font.Color = RGB(200, 0, 0)
Debug.Print ws.Range("A1").Font.Color ' 13312 (24 ビットの数値、= RGB 200,0,0)
Debug.Print ws.Range("A1").Font.ColorIndex ' 3 または近いパレットの一致 - Excel が近似する
.Color は正確な 24 ビット値を返します(内部では BGR として格納される点に注意。手作業での
デコードは面倒です — 整数を目で追うより RGB(...) と比べましょう)。.Color で色を付けたセルに
対する .ColorIndex は、Excel の最も近いパレットの推測を返し、これは往復で一致しないことが
あります。ルールは設定側のルールを映したものです。**1 つの数の空間にとどまる。**コードが
フォント色の設定と確認の両方をするなら、.Color を選んで両側でそれを使いましょう。
ExcelMaster の活用
フォントの書式設定は、細部が積み重なるまでは些細に見えます。RGB 対 ColorIndex、静かに代替される
フォント名、数式セルでは何もしない Characters、そして本当は条件付き書式のルールであるべき
だった色付けループ。そのどれもが静かに失敗します — 違う色、変化なし、あるいは古びていく
ハイライト。
ExcelMaster なら、代わりに結果を
説明するだけで済みます。「ヘッダー行を太字にして、マイナスの値を赤にして」「ステータスが Overdue の
行をハイライトして」と言えば、静的な処理には Font.Color = RGB(...) を、色がデータに追随すべき
ときには FormatCondition を書き — そしてループする代わりに範囲全体を一度に設定します。ブックも
コードもあなたの手元に残り、間違ったプロパティに入れた 3 がすべてを違う色合いで塗ってしまう、
あの一幕だけを飛ばせます。
よくある質問
Excel VBA でフォント色を変えるには?
Range("A1").Font.Color = RGB(red, green, blue) を使い、各値は 0 から 255 までにします —
たとえば赤なら RGB(200, 0, 0)。RGB はあらゆる色をカバーし、指定したとおりに設定し、同じように
読み戻せます。Range("A1").Font.ColorIndex = n(1 から 56 のパレットスロット)を使うのは、古い
パレットベースのブックに合わせるときだけにして、2 つの数値が同じ色を意味すると決して思い込まないで
ください。
Font.Color と Font.ColorIndex の違いは?
.Color は RGB(r, g, b) で作る 24 ビットの RGB 値を取り、1,600 万色すべてにアクセスできます。
.ColorIndex は Excel の従来の 56 色パレットへのインデックスを取ります。同じ整数でも両者で意味が
違い — .Color = 3 はほぼ黒の RGB(3,0,0)、.ColorIndex = 3 は赤です。設定には .Color を選び、
設定したのと同じプロパティで読み戻しましょう。
VBA でセルを太字にするには?
Range("A1").Font.Bold = True、解除するには False です。Bold、Italic、Strikethrough は
どれも Font オブジェクトの True/False プロパティです。複数のフォントプロパティを一度に設定
するには、With Range(...).Font ... End With ブロックで包み、範囲を一度だけ名指しましょう。
セル内のテキストの一部だけに色を付けるには?
部分文字列にスタイルを当てるには Range("A1").Characters(Start:=1, Length:=4).Font.Bold = True を
使います。これはセルに打ち込んだテキストが入っているときにだけ効きます — 数式、数値、日付では
編集可能な文字が存在せず、呼び出しは何もしません。コードが再計算するセルではなく、ラベルやメモに
使いましょう。
シートを編集すると VBA の色付けが正しくなくなるのはなぜ?
Font.Color のループは 1 回きりのスナップショットを塗るだけで、データが変わっても再実行されない
からです。値に追随すべき色 — マイナスは赤、期限切れの行はハイライト — には、
Range(...).FormatConditions.Add で条件付き書式のルールを追加しましょう。Excel が自動で再評価
します。直接の色付けループは、凍結したい静的な書き出しのときだけ使いましょう。
検証環境
動作確認: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-08-11。
関連ガイド: VBA Cell Color · VBA NumberFormat · VBA With · VBA Range · VBA For Loop
