「あなたの好きな色は何色ですか?」と聞かれたら
赤、青、緑、黄、黒、白、紫…
まあ、普通はこんな感じで答えると思う。
ここで、狐色、若草色、深紅、枯草色といったちょっとこだわった感じの名前を返してくると、「おっ、情緒的でいいな」と思う。ラベンダー、アイボリー、アクアマリンなんて答えも素敵だ。
色にはそれぞれ素敵な名前がついている。その名前はモノを連想させたり、イメージを膨らませる。
さすがに団十郎茶、勿忘草色、空五倍子色、ラベンダーブラッシュ、コーンフラワーブルーなんて言われると「こいつ、ちょっとひねくれてるな」って感じがするけど。
団十郎て誰やねん。
知らんがな。
(いや、もちろん色を扱う特殊な職業の方なら良いと思う。)
さて、今回はVBAの色の話。
VBAではRGB関数を使って簡単に色を作成できるが、面倒くさくてもあえて名前で呼ぶというのは情緒があって良い。
それで、以前こんな記事を書いた。
thom.hateblo.jp
しかし、
案の定、面倒くさい。
何がって、探すのが。
まずもって色名をそんなに知らないうえ、シートに書き出しても英語名でアルファベット順なので。
こっから選べって言われてもなぁ。。
普通、人間が色を探すときって、赤系とか青系といった色相(しきそう)や明るい、暗いといった輝度(きど)で探す。
※感覚的には濃い・薄いという用語のほうがシックリくるけど、あれは絵の具の話なので、ディスプレイ上は輝度(きど)
彩度も重要な要素だけど私は最初から彩度を基準に探すってことはしないので、一般的にもそうだと思う。
それで今回は、XlRgbColor定数を色相順、輝度順で出力してみたいと思う。
Win32APIにRGB値から色相、輝度、彩度を求めるColorRGBToHLS関数があるので、そちらを利用する。
※HLSはHue(色相)、Luminance(輝度)、Saturation(彩度)の意味
参考:ColorRGBToHLS function | Microsoft Docs
まずMSDNに色名の表があるのでそちらを選択してExcelに張り付ける。
https://msdn.microsoft.com/ja-jp/library/office/ff197459.aspx
セルの色もそれぞれの色に合わせておこう。詳しくは以下参照。
VBA 新しい色の指定方法 ~XlRgbColor定数 - t-hom’s diary
それから、シート上に色相、輝度、彩度を入力する箇所を設ける。
次に標準モジュールに以下を貼り付ける。
Public Declare Sub ColorRGBToHLS Lib "Shlwapi.dll" (ByVal clrRGB As Long, _ pwHue As Integer, pwLuminance As Integer, pwSaturation As Integer)
次にシートモジュールに以下を張り付ける。
Enum 列 XlRgbColor定数名 = 1 定数値 日本語名 色相 輝度 彩度 End Enum Sub HLS値取得() Dim H, L, S, i For i = 2 To 143 '←単発モノなのでハードコード Debug.Print Cells(i, 列.定数値).Value Call ColorRGBToHLS(Cells(i, 列.定数値).Value, H, L, S) Cells(i, 列.色相) = H Cells(i, 列.輝度) = L Cells(i, 列.彩度) = S Next End Sub
そしてHLS値取得を実行すると、色相、輝度、彩度が入力されるので、あとはオートフィルタで並び替えるだけ。
色相順に並べてみた。
彩度の昇順で並び替えたあと、輝度の昇順で並び替えてみた。
無彩色でフィルタリングしてみた。
緑系だけフィルタリングしたのち、輝度・彩度の順に並び替えた。
これで色がずいぶん探しやすくなった。
というわけで皆、色名も使ってあげて。
2017/03/04追記
サイトに表をアップしたので、こちらもご参照ください。
https://www.thom.jp/vbainfo/xlrgbcolor.html