テーマの色について


Excel 2007から、文字やセルの背景色などに使用できる色が増えました。リボンのボタンをクリックすると、今までにない淡い中間色を選択できます。

ここ、よく見ると「テーマの色」と書かれています。実は、Excel 2007から「テーマ」という機能が追加されました。「テーマ」は、いわば"見た目に関するテンプレート"のようなものです。ブックに適用するテーマを変更すると「テーマの色」も変わります。

テーマを切り替えるには、[ページレイアウト]タブ左端にある[テーマ]ボタンをクリックします。

標準は、左上の[Office]です。テーマを変更すると、「テーマの色」は次のように変わります。

各テーマの配色は、[ページレイアウト]タブ[テーマ]グループの[配色]ボタンをクリックすると表示されます。

このテーマの色を使う操作は、マクロ記録で次のように記録されます。

Sub Macro1()
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorAccent2
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
End Sub

Sub Macro2()
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1
        .TintAndShade = -0.249977111117893
        .PatternTintAndShade = 0
    End With
End Sub

テーマの色を指定するには、ThemeColorプロパティに、次の定数を指定します。。

セルにテーマの色を設定すると、上記のように「xl○○」の定数が記録され、グラフでテーマの色を設定すると、上図のような「mso○○」の定数が記録されます。両者の実体数は同じですので、どちらを指定しても同じ色が設定されます。

TintAndShadeプロパティは、Excel 2007で追加されたプロパティで、色の明暗を、-1(最も暗い)から1(最も明るい)の数値(単精度浮動小数点数)で指定します。「TintAndShade = 0」が中間であり、標準の明るさです。Excel 2007から使用できる「テーマの色」は、同じ色で明るさが異なりますが、それぞれTintAndShadeプロパティが次のようになっています。

おまけ

参考までに。

テーマを切り替える、という操作をマクロ記録すると、次のようなコードが記録されます。

Sub Macro3()
    ActiveWorkbook.ApplyTheme ( _
        "C:\Program Files (x86)\Microsoft Office 2010\Document Themes 14\Origin.thmx")
End Sub

ApplyThemeはメソッドで、上記のマクロはApplyThemeメソッドの返り値を使っていません。なので、VBAのルールでは

Sub Macro3()
    ActiveWorkbook.ApplyTheme  _
        "C:\Program Files (x86)\Microsoft Office 2010\Document Themes 14\Origin.thmx"
End Sub

のように括弧がつかないはずなのですが、なぜかマクロ記録では括弧がつきます。まぁ、それはいいんですが。

要するに、マクロでテーマを変えるときは、上記のように、ApplyThemeメソッドの引数に、テーマが定義されているファイルのフルパスを指定することになります。で、C:\Program Files (x86)\Microsoft Office 2010\Document Themes 14\フォルダを見ると、なるほど複数のテーマファイル(*.thmx)が保存されています。ちなみに、それぞれのファイルは次のテーマです。

ファイル名 テーマ名
Adjacency.thmx ナチュラル
Angles.thmx アングル
Apex.thmx ひらめき
Apothecary.thmx オータム
Aspect.thmx シック
Austin.thmx オースティン
Black Tie.thmx フォーマル
Civic.thmx クール
Clarity.thmx クラリティ
Composite.thmx コンポジット
Concourse.thmx ビジネス
Couture.thmx クチュール
Elemental.thmx エレメント
Equity.thmx ジャパネスク
Essential.thmx エッセンシャル
Executive.thmx エグゼクティブ
Flow.thmx リゾート
Foundry.thmx エコロジー
Grace.thmx みやび
Grid.thmx グリッド
Hardcover.thmx ハードカバー
Horizon.thmx ホライズン
Median.thmx デザート
Metro.thmx メトロ
Module.thmx モジュール
Newsprint.thmx ニュース
Opulent.thmx キュート
Oriel.thmx スパイス
Origin.thmx アース
Paper.thmx ペーパー
Perspective.thmx パースペクティブ
Pushpin.thmx プッシュピン
Slipstream.thmx スリップストリーム
Solstice.thmx フレッシュ
Spring Time.thmx 紅梅匂
Technic.thmx テクノロジー
Thatch.thmx ストロー
Trek.thmx トラベル
Urban.thmx アーバン
Verve.thmx ネオン
Waveform.thmx ウェーブ
Wind in the Pines.thmx 松風
Wistaria.thmx 雪藤

上のリストを見ると、標準の[Office]テーマがありません。ブックのテーマを[Office]に切り替える、という操作をマクロ記録すると次のようなコードが記録されます。

Sub Macro4()
    ActiveWorkbook.ApplyTheme()
End Sub

記録されたコードは、上のように、いきなり文字が赤くなっています。つまり、構文エラーです。もちろん、記録されたこのコードをそのまま実行するとエラーになります。当たり前です。何しろ、構文エラーなのですから。

では、マクロで[Office]テーマを設定するには、どうしたらいいのでしょう。

ここからは推測です。以前、Excel 2007が発売された直後、Excelの開発チームに非公式で次のような質問をしてみました。

「標準のテーマ(Office)を、ユーザーがカスタマイズできますか?」

答は「それは、できません」でした。メールではなく、直接会って聞いた質問です。標準のテーマはカスタマイズできないと。つまり、標準テーマの色やフォントなどの情報は、テーマファイル(*.thmx)に記録されているのではなく、プログラム内に組み込まれているのではないかと。だから、マクロ記録すると、ApplyThemeメソッドが記録されるものの、該当するファイルが存在しないので、ファイル名が記録されないのではないかと。そう思います。

では「現在、ブックに設定されているテーマは何か」を調べるには、どうしたらいいでしょう。Workbookオブジェクトのメンバーを調べると、次のようなプロパティがあります。

おお、いいプロパティがあるじゃないですか。で、このThemeプロパティ、いったい何を返すのでしょう。「テーマを返す」って?調べてみると、こいつが返す"テーマ"とは、OfficeThemeオブジェクトだと分かりました。

よ~し、このOfficeThemeオブジェクトのNameプロパティとか、FullPathプロパティとかを調べれば、どんなテーマが設定されているか分かるはずです。さっそく、OfficeThemeオブジェクトのメンバーを調べてみましょう。

へ?これだけ?Nameプロパティは?ないの?

ここで、Applicationプロパティ、Creatorプロパティ、Parentプロパティが役に立たないのは一目瞭然です。使えそうなのは、ThemeColorSchemeプロパティ、ThemeEffectSchemeプロパティ、ThemeFontSchemeプロパティですが、こいつらを調べたところで、設定されているテーマの名前が分かるとは思えません。でも、まぁ、せっかくなので、ちょっと調べてみましょうか。

まずは、ThemeColorSchemeプロパティから。

なんか、おもしろそうなプロパティやメソッドはありませんね(笑)。

Colorsプロパティを使うと、そのテーマに設定されている色のRGB値が分かります。色は全部で12色あります。

こんな感じでしょうか。

Sub Sample1()
    Dim i As Long
    For i = 1 To 12
        Cells(i, 1) = convRGB(ActiveWorkbook.Theme.ThemeColorScheme.Colors(i))
    Next i
End Sub

Function convRGB(Num As Long)
    Dim R As Long, G As Long, B As Long
    B = Int(Num / 65536)
    G = Int((Num - (B * 65536)) / 256)
    R = Num - (G * 256) - (B * 65536)
    convRGB = R & ", " & G & ", " & B
End Function

続いて、ThemeEffectSchemeプロパティ。

う・・・なに、この"ハズレ感"はw

最後に、ThemeFontSchemeプロパティ

おもしろそうなのは、MajorFontプロパティとMinorFontプロパティくらいかな。

Sub Sample2()
    Dim i As Long, msg As String
    With ActiveWorkbook.Theme.ThemeFontScheme
        msg = msg & "【MajorFont】" & vbCrLf
        For i = 1 To .MajorFont.Count
            msg = msg & i & ":" & .MajorFont(i).Name & vbCrLf
        Next i
        msg = msg & "【MinorFont】" & vbCrLf
        For i = 1 To .MinorFont.Count
            msg = msg & i & ":" & .MinorFont(i).Name & vbCrLf
        Next i
    End With
    MsgBox msg
End Sub

あれ?日本語フォントは取得できないの?

なんか・・・もういいや、って感じなので、このへんでやめておきます。まぁ、マクロでテーマを操作するってのは、一般的に多くのユーザーがやる操作ではないでしょうから、いいんですけどね。