- ベストアンサー
VBAで背景色にあった文字色を自動で判別したい
複数ある行に色をつけるマクロを組みました。 セルのInterior.ColorIndexに1から順番に当てはめていくだけで、これについては簡単なものです。 これで困るのが濃いめの色になったとき、文字が黒色のままだと見づらくなってしまうこと。 これをセルの背景色に合わせて自動で白抜きなど見やすい色にできないかなと。 例えばRGBなどの値を固定の数値分加えると、見やすい文字色になるというような法則みたいなものがないでしょうか? やはり各背景色に対しての文字色を自分でリストでも作っておいて、それを参照するみたいな方法しかないでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
法則という意味では、ウェブコンテンツの世界ではこういう基準があります。 W3Cによる勧告 Web Content Accessibility Guidelines (WCAG) 2.0 https://waic.jp/docs/WCAG20/Overview.html 背景色と文字色の比はコントラスト比という数値で表されます。(最大 21:1、最小 1:1 ) 下記のサンプルプログラムは、背景色に対して黒文字の場合と白文字の場合のコントラスト比を求め、大きい方を採用するというものです。ほとんどの場合これで読みやすくなると思います。 しかし残念ながら、一部のカラーインデックスについては適切でないかもしれません。(特に12番、16番、50番) Option Explicit Sub main() Dim rng As Range Dim row As Long Dim idx As Long idx = 1 For row = 1 To 56 'A1セルからA56セルまで Set rng = ActiveSheet.Cells(row, "A") rng.Interior.colorIndex = idx Call SetFontColor(rng) rng.Value = "あああ" idx = idx + 1 Next End Sub Sub SetFontColor(ByRef rng As Range) Dim R As Double Dim G As Double Dim B As Double Dim Rg As Double Dim Gg As Double Dim Bg As Double Dim L As Double Dim Lb As Double Dim Lw As Double Dim RatioBlack As Double Dim RatioWhite As Double Dim color As Long color = rng.Interior.color R = (color Mod 256) / 255 G = (Int(color / 256) Mod 256) / 255 B = (Int(color / 256 / 256)) / 255 If R <= 0.03928 Then Rg = R / 12.92 Else Rg = ((R + 0.055) / 1.055) ^ 2.4 End If If G <= 0.03928 Then Gg = G / 12.92 Else Gg = ((G + 0.055) / 1.055) ^ 2.4 End If If B <= 0.03928 Then Bg = B / 12.92 Else Bg = ((B + 0.055) / 1.055) ^ 2.4 End If L = 0.2126 * Rg + 0.7152 * Gg + 0.0722 * Bg Lb = 0.2126 * 0 + 0.7152 * 0 + 0.0722 * 0 Lw = 0.2126 * 1 + 0.7152 * 1 + 0.0722 * 1 RatioBlack = (L + 0.05) / (Lb + 0.05) RatioWhite = (Lw + 0.05) / (L + 0.05) If RatioBlack >= RatioWhite Then rng.Font.color = vbBlack '黒文字 Else rng.Font.color = vbWhite '白文字 End If End Sub
その他の回答 (4)
- SI299792
- ベストアンサー率47% (788/1647)
明るさによって、黒と白の2色に分けるプログラムです。 試したらこれが1番見やすかった。 補色も試しましたが、灰色の補色は灰色なのでだめでした。 Option Explicit ' Sub Macro1() Dim LColor As Long Dim RPtr As Integer Dim Sum As Integer Dim Index As Integer ' For RPtr = 1 To 56 Cells(RPtr, "A") = RPtr Cells(RPtr, "A").Interior.ColorIndex = RPtr Sum = 0 LColor = Cells(RPtr, "A").Interior.Color ' For Index = 0 To 2 Sum = Sum + LColor Mod 256 LColor = LColor \ 256 Next Index Cells(RPtr, "A").Font.Color = -vbWhite * (Sum < 384) Next RPtr End Sub \ はVBE では半角¥になります。
お礼
わざわざソースを書いてくださってありがとうございます。 灰色とかは背景では使わないので、色合い的にはこちらが一番見やすいですね。 ご回答ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
アートほどこだわらないのでしたら、RGBの値を足して127*3より小さければ濃い色だから白文字、大きければ薄い色だから黒文字、くらいの判定でいいんじゃないでしょうか。
お礼
ああ、試してみたら確かにそれでも充分そうですね(^_^; 大してこだわらない物については、この方法を使いたいと思います。 ご回答ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17070)
素人が考えることだが、実行となると、色感覚の生理的な理論も必要でしょう。 こんなエクセル・ワードの初心者向けの、質問コーナーでなく、質問するカテゴリが違うのでは。 そういう色コード間で相関の理論があるかないかも知らないし、見聞きしたことはない。 また色コードは、普通パソコンでは、基礎はRGBコード(1600万色)で指定だろうが、エクセルでも、簡略化した、色々な仕組みが導入されている(例 ColorIndexや、color name)ので、勉強しようにも、並みのエクセルの本では書いてない。 たまたまGoogleで「パソコン 色 対比色」で照会すると、色々記事が出る。これらのものの少数でも読んでみたら。 A色ーー>B色の(見やすい色の)対応が、理論や好みて決まれば、色コードのを検索する、対比表を引く、「VBA的な表引」の問題になるが、好み一本で、対比表を作るか? でも、現在現物で、どんな色を設定しているか、自分がメモしとかないと、割り出しも難しいのでは。
お礼
ご回答ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
エクセルの話とかではなくアート系の話になるような気がします。補色とか。
お礼
ご回答ありがとうございました。
お礼
コントラスト比で計算する方法があったんですね。 まさに求めていたものです。 細かい計算を理解するのが難しいですが、大変勉強になりました。 ご回答ありがとうございました。