文字色の設定


VBAが使えるようになるには、ある程度の知識を学ばなければなりません。オブジェクトの理解もそのひとつです。オブジェクトとは、対象となるモノという意味です。たとえば、セルA1はRange("A1")のようにRangeオブジェクトで表します。このRangeオブジェクトに対して、データを入力したり、罫線を引いたりすることになります。

さらに、オブジェクトは独立して存在するものばかりではなく、何らかのオブジェクトに含まれているものもあります。たとえば、セル(Rangeオブジェクト)は、ワークシート(Worksheetオブジェクト)に含まれています。どのワークシートにも属さないセルというのは存在しませんよね。同じようにワークシート(Worksheetオブジェクト)も、ブック(Workbookオブジェクト)に含まれるオブジェクトです。つまり、セルA1を正確に記述するのなら「Book1のSheet1のセルA1」となります。これをVBA流に書くと「Workbooks("Book1").Worksheets("Sheet1").Range("A1")」となります。

もちろん、セル(Rangeオブジェクト)の中にも、いくつかのオブジェクトが含まれています。セルに挿入するコメントは、セル(Rangeオブジェクト)に含まれるCommentオブジェクトですし、セルに設定する入力規則は、セル(Rangeオブジェクト)に含まれるValidationオブジェクトです。そして、文字色やフォント、文字のサイズなどを司るFontオブジェクトもセル(Rangeオブジェクト)に含まれるオブジェクトのひとつです。セルの文字色を設定するには、このFontオブジェクトを操作します。

Excelのバージョンによる違い

セルの文字色を設定する方法を、マクロ記録で調べてみましょう。まずExcel 2003で、やってみます。

    【Excel 2003での操作】

  1. 文字色を設定したいセルを選択します

  2. マクロ記録を開始します

  3. ツールバーで文字の色を「赤」に設定します

  4. マクロ記録を終了します

さて、記録されたコードを見てみましょう。なお、コメントは削除しています。

Sub Macro1()
    Selection.Font.ColorIndex = 3
End Sub

Selection は、選択されたセルを表しますので、ここではRange("B2")ですね。セルの文字色を設定するには、FontオブジェクトのColorIndexプロパティに数値を指定するのだと分かります。ColorIndexについては、後で詳しく解説します。

さて、今度は、同じ操作をExcel 2007以降でやってみましょう。

    【Excel 2007での操作】

  1. 文字色を設定したいセルを選択します

  2. マクロ記録を開始します

  3. リボンのボタンで文字の色を「赤」に設定します

  4. マクロ記録を終了します

次のようなコードが記録されました。こちらも、コメント部分は削除しています。

Sub Macro1()
    With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
    End With
End Sub

記録されたコードは、次の2行に整理できます。

Sub Macro1()
    Selection.Font.Color = -16776961
    Selection.Font.TintAndShade = 0
End Sub

TintAndShadeは、Excel 2007で追加されたプロパティで、色の明暗を「-1」から「1」までの数値で指定します。「0」はちょうど真ん中の標準という意味です。Excel 2007で記録されたコードを見ると、ColorIndexプロパティがありません。代わりにColorプロパティが使われています。

このように、文字色の変更をマクロ記録すると、Excelのバージョンによって、次のプロパティが記録されます。

  • Excel 2003まで → ColorIndexプロパティ
  • Excel 2007以降 → Colorプロパティ

もしかして、Excel 2007では仕様が変わって、色を設定するためのプロパティが変更されたのでしょうか。いえ、そうではありません。実は、Excel 2003でもColorプロパティが使えましたし、もちろん、Excel 2007でも同じようにColorIndexプロパティを使用できます。以下、それぞれのプロパティについて解説します。

ちなみに「-16776961って何?」という方は、下記のページをご覧ください。詳しく解説しています。

ColorプロパティとRGB関数について

ColorIndexプロパティ

Excelは、あらかじめ色を定義した「色パレット」を持っています。

それぞれの色には、その位置によって、次の番号が割り当てられています。

標準では、赤は3、緑が4、青が5です。ColorIndexプロパティは、この色番号(色パレットの位置)を指定するプロパティです。あまり知られていませんが、この色パレットは、ユーザーが自由に定義することができます。下図は、青と赤を入れ替えたところです。

こうすると、それまで赤だった色パレットの3番は青になりますので、ColorIndexプロパティに3を設定すると、青色になります。

Sub Sample1()
    Range("B2").Font.ColorIndex = 3
End Sub

もちろん、この状態で色パレットを変更すると、セル内の色も変更されます。ColorIndexプロパティは色パレットの位置を指定するプロパティなので、その場所に何色が定義されているかによって、適用される色が異なります。

色パレットに登録されている色を調べるには、Colorsプロパティを使います。詳しくは下記ページをご覧ください。

色パレットに登録されている色を調べる

色パレットはExcel 2007以降にも実装されていますので、従来と同じように、ColorIndexを使って色を設定することも可能です。

上の色パレットを見て分かるように、ColorIndexプロパティで指定できる色は56色です。実は、Excel 2003までは、ワークシート上で56色しか表現できませんでした。これは、ヘルプにも明記されています。

【Excel 2003のヘルプ】

Excel 2007では、ブックで使用できる色が約1,600万色に拡張されました。

【Excel 2007のヘルプ】

使用できる色数は拡張されたのですが、ColorIndexプロパティで使う色パレットに登録できる色数は56色のままです。せっかく、多くの色を表示できるようにしても、ColorIndexプロパティで色を設定する限り、従来と変わらず、ワークシート上では56色しか表現できません。

Colorプロパティ

そこで、Excel 2007からは、積極的にColorプロパティが使われるようになりました。ColorIndexプロパティが色パレットの位置を指定したのに対して、ColorプロパティはRGB関数によって得られる色の値を指定します。RGB関数は、色のRGB値を返す関数で

RGB(赤, 緑, 青)

のように指定し、赤緑青にそれぞれ、0から255までの数値を指定します。たとえば、文字色を赤に設定するなら、

Font.Color = RGB(255, 0, 0)

とします。

Excel 2003までのバージョンにも、ColorプロパティやRGB関数が用意されていました。両者を使うと、色パレットで定義された56色だけでなく、淡い中間色なども指定できます。指定はできますが、指定したところで、結局のところ表示できる色は56色までです。実際に試してみましょう。Excel 2003で次のコードを実行してみます。RGB関数に指定する色の数値を5ずつ増加させました。なお、ここでは見やすくするために、文字の色ではなく、セルの背景色を設定します。

Sub Sample2()
    Dim i As Long, j As Long
    For i = 0 To 255 Step 5
        j = j + 1
        Cells(j, 1).Interior.Color = RGB(i, 0, 0)
        Cells(j, 1) = i & ", 0, 0"
        Cells(j, 2).Interior.Color = RGB(255, i, 0)
        Cells(j, 2) = "255, " & i & ", 0"
        Cells(j, 3).Interior.Color = RGB(0, 255, i)
        Cells(j, 3) = "0, 255, " & i
    Next i
End Sub

Excel 2003までは、Colorプロパティで中間色を指定したとき、Excelが表示できる56色の中から、指定された色に最も近い(とExcelが判断した)色が設定されます。対して、Excel 2007では約1,600万色の色を表示可能ですので、ColorプロパティとRGB関数を使って、淡い中間色を表現できます。上のコードをExcel 2010で実行すると、下図のようになります。

このように、色の設定をマクロ記録したとき、Excel 2003までは「Colorプロパティで中間色を指定しても意味がないから、色パレットを使ったColorIndexプロパティ」が記録され、Excel 2007以降では「1,600万色を表示できるのだから、56色に限定されるColorIndexではなく、もっと表現力の高いColorプロパティ」が記録されるわけです。

色とテーマの関係

Excel 2007以降は、セルの文字色や背景色に、淡い中間色を指定できるようになりました。

では、Excel 2007から使えるようになった、新しい中間色の設定をマクロ記録してみましょう。手順は、上に書いたのと同じですから割愛します。記録されるのは、次のようなコードです。

Sub Macro2()
    With Selection.Font
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0
    End With
End Sub

Excel 2007から使えるようになった新しい中間色を設定すると、ColorプロパティではなくThemeColorプロパティと定数xlThemeColorAccent2が記録されました。これは、どういうことでしょう。

実は、上図の「Excel 2007から使える新しい色」は、固定された色ではなく、ブックで選択しているテーマに依存します。よく見ると、ちゃんと書いてありますよね「テーマの色」って。選択するテーマによって色がどう変わるか、実際に試してみましょう。

下図は、セルの文字や背景色を設定したり、グラフを作成したり、SmartArtを挿入してみたりしました。

では、テーマを変更してみましょう。テーマを変更するには、[ページレイアウト]タブ左端にある[テーマ]ボタンをクリックします。

現在は、左上の[Office]が選択されています。これが初期設定のテーマです。たとえば、[クチュール]を選択すると、色は次のように変わります。

ワークシート上のオブジェクトだけでなく、「テーマの色」も変化したことに注目してください。

テーマごとに定義されている色は、リボンの[配色]ボタンをクリックすると確認できます。

どんな色を定義できるかを調べるには、一番下の[新しい配色パターンの作成]をクリックします。実行すると[新しい配色パターンの設定]ダイアログボックスが表示されます。

ここで、独自の配色パターンを作成して登録することも可能です。これ以上は「テーマの使い方」になってしまいますので、このへんで終わります。つまり、Excel 2007で追加された新しい中間色は、Excel 2003までの色パレットと似ていて「何色を設定する」ではなく「テーマで決められている何番目の色を設定する」という仕組みで実現されています。セルの文字色や背景色を「赤色にする」という動作を想定したマクロでも、テーマの色を設定するようなコードでは、マクロを実行する環境(どんなテーマが選択されているか)によっては、赤色にならない場合もあるということです。確実に「赤色」を指定したいときは、マクロ記録したコードではなく、RGB関数などで赤色を設定してください。

ちなみに「どんなテーマが選択されているか」は、ブックごとに記録されます。Excelで同時に開いているBook1とBook2で、片方のテーマが「Office」で、一方のテーマが「クチュール」のような使い方もできます。