VBA

【VBA】カラーチャートを作成する関数(カラーインデックス一覧、RGB一覧)

記事内に商品プロモーションを含む場合があります

こんにちは、hokkyokunです。

VBAで背景色や文字色を指定する際に
便利なツールを作ってみました。

VBAで色を指定する際、いくつか方法がありますが、
今回は「カラーインデックス」「RGB」で指定する際の
見本一覧を呼び出す関数をご紹介ます。

関数はオリジナルですが、
コピペするだけですぐ使えますので
よかったら使用してみてください。

カラーインデックス

色の指定方法

コード事態は簡単です。

背景色は
レンジオブジェクト . Interior.ColorIndex = [インデックス番号]

文字色は
レンジオブジェクト . Font.ColorIndex = [インデックス番号]

Sub test_colorIndex()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

'背景色
ws.Cells(2, 2).Interior.ColorIndex = 6

'文字色
ws.Cells(2, 3).Font.ColorIndex = 3
End Sub

使っているとわかると思いますが、
カラーインデックスだけでは、何番がどんな色か全くわかりません。
ヒントもないので、ネットで調べるか、いちいち試していかないといけません

どちらも面倒だったので
下記の関数を作っていつでも呼び出せるようにしました。

カラーインデックス一覧を呼び出す関数

  • 関数名
    Color_Index ( ws_Name )
  • 引数
    ws_Name : シート名(データ型は文字列)
  • 戻り値
    なし

引数でシート名を文字列で指定します。
そのシート名で新たにシートを作成し、そこにカラーインデックスの一覧を作成します。

既に同名のシート名が存在する場合
上書き処理しますので、その点だけご注意ください。

Function Color_Index(ByVal ws_Name As String)
Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
    If ws.Name = ws_Name Then
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
    End If
Next

With ThisWorkbook
    Set ws = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))
End With
ws.Name = ws_Name

ws.Cells(1, 1).Value = "カラー"
ws.Cells(1, 2).Value = "color_index"
ws.Cells(1, 3).Value = "color"
ws.Cells(1, 4).Value = "RGB"

Dim i As Long
Dim color_Val As Long
Dim red, green, blue As Long
i = 2

Do
    ws.Cells(i, 1).Interior.ColorIndex = i - 1
    color_Val = ws.Cells(i, 1).Interior.Color
    
    ws.Cells(i, 2).Value = i - 1
    ws.Cells(i, 3).Value = color_Val
    
    'RGBの計算
    blue = color_Val \ 65536
    green = (color_Val - blue * 65536) \ 256
    red = color_Val - blue * 65536 - green * 256
    
    ws.Cells(i, 4).Value = red & "," & green & "," & blue
    i = i + 1
    
    On Error GoTo err
Loop

err:
err.Clear

ws.Range("A1:D1").EntireColumn.AutoFit
End Function

関数の使い方

関数を使用してみます。

Sub test()

Call Color_Index("color_Index")

End Sub

上記のような表をシート上に作ることができます。
B列がカラーインデックス番号なので
例えば赤っぽい色がよければ「3」をインデックス番号として指定してください。

RGBカラーチャート

RGBを指定して色を決める方法です。

RGBは
色の三原色(R=赤、G=緑、B=青)の
パラメータをいじって色を選択します。

といっても色彩素人がこれをいじっていい色を作るなんて不可能なので
実際はインデックス番号やカラー定数を使って色を決めることが多いと思います。

ちなみに、カラー定数というのは
VBAで組み込まれている定数で
例えば「vbYellow」というコードを打つと「黄色」を指定してくれます。
こういったすでに決められた色の定数が150ほどあります。

このカラー定数の一覧を呼び出す関数も作ってあるので
よかったら見てください。

【VBA】カラー定数の一覧表を取得する関数 こんにちは、hokkyokunです。 VBAで背景色や文字色を考える際にあらかじめ組み込まれているカラー定数というものがあります...

RGBを用いた色の指定方法

カラーインデックスとよく似ています

背景色は
レンジオブジェクト . Interior.Color = RGB ( 0~255 , 0~255 , 0~255 )

文字色は
レンジオブジェクト . Font.Color = RGB ( 0~255 , 0~255 , 0~255 )

実際にコーディングしてみます。

Sub test_RGB()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

'背景色 黄色はRGB(255,255,0)
ws.Cells(2, 2).Interior.Color = rgb(255, 255, 0)

'文字色 赤色はRGB(255,0,0)
ws.Cells(2, 3).Font.Color = rgb(255, 0, 0)

End Sub

RGBの使いどころ

RGBでいい色を出すのは難しいので、
使いどころがなさそうですが、
意外に使いどころは多かったりします

私はすでにエクセル入力されている「この色を使いたい」色に出くわしたら
RGBを調べます。

調べたRGBと同じ値を入力することで
同じ色に処理したりします。

ユーザー設定タブを選び、RGBを確認。この場合はRGB(255,255,0)となる

RGBカラーインデックスを呼び出す関数

RGBカラーインデックスを呼び出す関数です。

先ほどいい色を出すのが難しいという話をしましたが、

正確に言うとパラメータの範囲が広く、
すべてのパターンを試すことが事実上不可能だから難しい

黄色っぽい色を出したいからRGBを少しずついじる…
なんてやろうとも思わないと思います。

そこでRGBの値を25刻みで全パターンを一覧として表示する関数を作りました。

25ってざっくりなようですが、パターンとしては1000以上です。
これである程度あたりをつけて微調整するみたいな使い方をしても良いと思います。

  • 関数名
    RGB_chart ( ws_Name )
  • 引数
    ws_Name : シート名(データ型は文字列)
  • 戻り値
    なし
Function RGB_chart(ByVal ws_Name As String)
Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
    If ws.Name = ws_Name Then
        Application.DisplayAlerts = False
        ws.Delete
        Application.DisplayAlerts = True
    End If
Next

With ThisWorkbook
    Set ws = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))
End With
ws.Name = ws_Name

Dim i, j As Long
Dim reds, greens, blues As Variant
Dim red, green, blue As Variant
Dim rgbs As Variant

Dim arrs As Variant
'RGBの配列を作る25ずつ数値をずらして格納(最後は255になるように調整)
For i = 0 To 249 Step 25
    Call add_Elm(arrs, i)
Next i
Call add_Elm(arrs, 255)

reds = arrs
greens = arrs
blues = arrs

For Each red In reds
    For Each green In greens
        For Each blue In blues
            Call add_Elm(rgbs, Array(red, green, blue))
        Next
    Next
Next

i = 1
j = 1
Dim rgb_ As Variant

For Each rgb_ In rgbs
    ws.Cells(i, j).Interior.Color = rgb(rgb_(0), rgb_(1), rgb_(2))
    ws.Cells(i, j + 1).Value = Join(rgb_, ",")
    
    If i < 100 Then
        i = i + 1
    Else
        i = 1
        j = j + 2
    End If
Next

Dim maxCol As Long
maxCol = ws.Cells(1, Columns.Count).End(xlToLeft).Column
ws.Range(ws.Cells(1, 1), ws.Cells(1, maxCol)).EntireColumn.AutoFit

End Function

関数の使い方

関数を使用してみます。

Sub test_RGB_chart()

Call RGB_chart("rgb_chart")
End Sub

ブログ村ランキング参加中です。よかったらフォローお願いします!!

PVアクセスランキング にほんブログ村