和風スパゲティのレシピ

日本語でコーディングするExcelVBA

セルの文字色・背景色を列挙型Enumで記憶する

セルの文字色・背景色を設定するとき、その色のカラーコードやRGB値を調べなくてはいけません。
初回はしょうがないのですが、何度も使うような色は、できれば定数などで持っておきたいところです。

この色の記憶に、列挙型変数(Enum)がとても便利なので、
ぜひ活用してみてください。

列挙型(Enum)のおさらい

列挙型変数(Enum)は、数値(Long)の定数をまとめて持っておくしくみです。

↓のように、列挙型の定数で列番号を扱うのが、一番重要な活用方法です。

列挙型のサンプル

' 列番号を列挙型で定義
Enum くだもの売上表の列
    品物 = 2
    単価    ' ここから↓は3,4,…と自動連番
    個数
    金額
End Enum

' サンプルコード
Cells(R, 4) = Cells(R, 2) * Cells(R, 3)
Cells(R, くだもの売上表の列.金額) = Cells(R, くだもの売上表の列.単価) * Cells(R, くだもの売上表の列.個数)

' ↑2つは同じ処理だけと、列挙型の方が読みやすくて変更に強い

Colorプロパティに使う値を列挙型変数で管理する

例えば、セルの文字色を赤色にするときは、

Range("A1").Font.Color = RGB(255, 0, 0)
Range("A1").Font.ColorIndex = 3

このどちらかを実行します。

しかし、この「3」とか「255」とか、どちらも調べるのが面倒ですよね。
赤ならまだしも、よほどの色マスターでないと記憶なんてできません。

セルの書式設定から色の中身を調べて、RGBの値をメモったり、
「ColorIndex vba」をGoogleさんに聞いたりしなくてはいけません。


まあ初回は調べるよりほかないのですが、何度も同じ色を使う場合は、
「Const 赤色Index = 3」のように、定数で持っておくべきです。

この定数を使う際に、列挙型を活用することができます。

ColorIndexプロパティ

' 列挙型の宣言例
Enum ColorIndex
    赤 = 3= 4= 5= 6
End Enum

' サンプルコード
Range("A1").Font.ColorIndex = ColorIndex.

いい感じですね。
よく使うColorIndexを登録しておけば、もうNoを調べなくてもよくなるし、あとでマクロを見返したときにも、何色にしているかがコードを読んだだけでわかるようになります。

ColorプロパティとRGB値

ColorIndexはバリエーションに乏しく、またExcelのバージョンやテーマによって色が変わったりしますので、せっかくならRGBカラーで記憶させましょう。

しかし、残念ながら↓のコードはエラーになります。

Enum RGBColor
    赤 = RGB(255, 0, 0)= RGB(0, 255, 0)= RGB(0, 0, 255)
End Enum

列挙型は定数なので、関数を内部には書けません

じゃあどうするかというと、RGB関数の返す値をそのまま入力してあげればいいです。


イミディエイトウィンドウを開きましょう。
(使ったことない方は、VBAの画面(VBE)で、「Ctrl + G」を押してみてください)

そこに、

?RGB(0, 0, 255)

を入力します。 ちなみに「?」は、「Debug.Print」の省略表記です。

すると、

 16711680

が返ってきます。これがRGB関数の結果値になります。

この数値を使えば、列挙型をRGB値で設定することができます。

' RGBカラーの宣言例
Enum RGBColor
    赤 = 255= 65280= 16711680
End Enum

' サンプルコード
Range("A1").Font.Color = RGBColor.

これでOKです。
これでColorIndexに頼らずに、好きな色を好きなときに呼びだせますね。

セルから直接RGB値を取得する

Colorプロパティに使う値を調べるときは、RGB(0, 0, 255)で調べると書きました。

しかしそもそも、このRGBそれぞれの値「0,0,255」はどこで手に入れましたか?


ネットの色辞典などから持ってきている場合はどうしようもないので、
↑の方法でColorプロパティ値を調べて下さい。

しかし、色のついたセルがすでにある場合は、
RGBそれぞれの値をわざわざ調べる必要はありません。


イミディエイトウィンドウさんに、

?Selection.Font.Color
?Selection.Interior.Color

と聞いてみてください。

選択セルのRGB値を、「16711680」のようにダイレクトに教えてくれます。
それをそのまま列挙型に使えばOKです。

イミディエイトウィンドウさんは、「?」で聞けばなんでも答えてくれるので、あまり使っていなかった人は、この機会に覚えてしまいましょう。
ちなみに「?1+1」 にも、律儀に2を返してくれます。

代表色のColorプロパティ一覧

列挙型カラーサンプル

Public Enum Colorテキスト色
    灰 = 8421504= 255= 3243501= 49407= 5287936= 12611584= 13369446
End Enum
Public Enum Color背景_薄色
    灰 = 14277081= 14079740= 14083324= 13431551= 14348258= 16247773= 16771059
End Enum
Public Enum Color背景_濃色
    灰 = 12566463= 11382264= 11389944= 10086143= 11854022= 15652797= 16764390
End Enum

テキストは濃い色が良く、背景色は薄い色が良いなど、
色の分類ごとに別の列挙型に持っておくと便利です。

要素名を1文字に統一できるのが、日本語変数のいいところですね。


色が薄めなのは私の好みです。

背景色が原色だと、目が痛くなりません?
真っ黄っ黄、真っ赤っ赤の背景にするの、マジやめて。


なお、背景色に「白」を用意していないのは、Excelの背景色のデフォルトが「白」でなく「色なし」だからです。
Colorプロパティでは設定できないようで、ColorIndex = 0 でしか設定できません。
色フィルターなどで罠にはまることがあるので、注意しておきましょう。


「16764390」などのRGB値から、RGBそれぞれの値(230,205,255)を調べたい場合はこの記事を参照ください。
【ExcelVBA】RGB値(Colorプロパティの値)から、RGBそれぞれの値を求める

おまけ:長ったらしいプロパティは辞書登録しよう

「.プロパティ=列挙型.」の一連の式を、ユーザー辞書に登録して、変換で呼び出すと便利です。

  • ふぉんと ⇒ 「.Font.Color = Colorテキスト色.」
  • はいけい ⇒ 「.Interior.Color = Color背景_」

プログラムでない文章が汚染されるのが嫌なら、英語の頭文字を読みに使うこともできますので、

  • fc ⇒ 「.Font.Color = Colorテキスト色.」
  • いc ⇒ 「.Interior.Color = Color背景_」

こちらがいいですね。
日本語入力は「.」が打ちづらいので、それも単語内に組み込むのがミソです。


また、列挙型名をすべて「Color」から始めているのは、
Colorハンガリアンの予測入力

これがやりたいからです。
英語部分だけ入力して、「Ctrl + Space」で候補を表示できます。

色に関する列挙型をすべてColorから始めておけば、Colorと打つだけで色の候補を表示できます。


この「システム英語+日本語」で組む手法をアプリケーションハンガリアン記法と呼びます。

例えば、ws(シート)、Adrs(セルアドレス)、CNo(列番号)などを頭に付けることをルールにすると、

アプリケーションハンガリアン日本語変数の入力アニメ

こんな風に入力できます。

日本語入力をOFFのまま、選択肢から入力できるようになるので、興味があればこの記事も是非。

www.limecode.jp