• ベストアンサー

VBAで背景色にあった文字色を自動で判別したい

複数ある行に色をつけるマクロを組みました。 セルのInterior.ColorIndexに1から順番に当てはめていくだけで、これについては簡単なものです。 これで困るのが濃いめの色になったとき、文字が黒色のままだと見づらくなってしまうこと。 これをセルの背景色に合わせて自動で白抜きなど見やすい色にできないかなと。 例えばRGBなどの値を固定の数値分加えると、見やすい文字色になるというような法則みたいなものがないでしょうか? やはり各背景色に対しての文字色を自分でリストでも作っておいて、それを参照するみたいな方法しかないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ubku
  • ベストアンサー率37% (227/608)
回答No.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

noname#250245
質問者

お礼

コントラスト比で計算する方法があったんですね。 まさに求めていたものです。 細かい計算を理解するのが難しいですが、大変勉強になりました。 ご回答ありがとうございました。

その他の回答 (4)

  • SI299792
  • ベストアンサー率47% (788/1647)
回答No.4

明るさによって、黒と白の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 では半角¥になります。

noname#250245
質問者

お礼

わざわざソースを書いてくださってありがとうございます。 灰色とかは背景では使わないので、色合い的にはこちらが一番見やすいですね。 ご回答ありがとうございました。

  • kkkkkm
  • ベストアンサー率66% (1742/2617)
回答No.3

アートほどこだわらないのでしたら、RGBの値を足して127*3より小さければ濃い色だから白文字、大きければ薄い色だから黒文字、くらいの判定でいいんじゃないでしょうか。

noname#250245
質問者

お礼

ああ、試してみたら確かにそれでも充分そうですね(^_^; 大してこだわらない物については、この方法を使いたいと思います。 ご回答ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

素人が考えることだが、実行となると、色感覚の生理的な理論も必要でしょう。 こんなエクセル・ワードの初心者向けの、質問コーナーでなく、質問するカテゴリが違うのでは。 そういう色コード間で相関の理論があるかないかも知らないし、見聞きしたことはない。 また色コードは、普通パソコンでは、基礎はRGBコード(1600万色)で指定だろうが、エクセルでも、簡略化した、色々な仕組みが導入されている(例 ColorIndexや、color name)ので、勉強しようにも、並みのエクセルの本では書いてない。 たまたまGoogleで「パソコン 色 対比色」で照会すると、色々記事が出る。これらのものの少数でも読んでみたら。 A色ーー>B色の(見やすい色の)対応が、理論や好みて決まれば、色コードのを検索する、対比表を引く、「VBA的な表引」の問題になるが、好み一本で、対比表を作るか? でも、現在現物で、どんな色を設定しているか、自分がメモしとかないと、割り出しも難しいのでは。

noname#250245
質問者

お礼

ご回答ありがとうございました。

  • kkkkkm
  • ベストアンサー率66% (1742/2617)
回答No.1

エクセルの話とかではなくアート系の話になるような気がします。補色とか。

noname#250245
質問者

お礼

ご回答ありがとうございました。

関連するQ&A

専門家に質問してみよう