Excel VBA 色操作

Excel VBA のトップに戻る
Excel VBA 目次

色を並べる

索引

色を並べる

 仕事で、なんと70もの分類が必要な、帯グラフを書くため、色を一次元で並べようとして苦労していて、下記のサイトを見つけました。

 RGB←→HSB相互変換
http://www13.plala.or.jp/kymats/study/gazou/HSB/HSB.html

 パソコンで、色を出力するとき、RGB(赤・緑・青)の三原色の値を決めて、色を定義します。
 その結果は、3次元の立方体になってしまって、一次元にうまく並びません

マンセルの色立体『世界大百科事典』日立デジタル平凡社から  色を表現するパラメータの組み合わせとしては、RGB以外に、HSB(色相・彩度・明度)というものもあります。
 この色相とは、スペクトルの色を波長の順に赤から紫まで並べたとき、その位置を示すものです。色相は、赤と紫の色でスペクトルの両端をつないで、連続した色の環を作って「色相環」として表現されます。
 「色相環」は、360度の円で、色相環上の相対する色は、補色(合わせると無彩色(グレー)になる組合せ)と呼ばれます。
 HSB(色相・彩度・明度)で表現した場合には、色相環を水平に、無彩色をその中心に置いて、中心から各色相に向かう方向に,その色相に属する色を彩度の低いものから順に並べて二次元の円を作り、同じ彩度の色では明度の高低に応じて上下に並べて、円柱ができます。(マンセルの色立体)
 色は、HSBで分類したときにも、その配置は、三次元になってしまうのです。
 参考:HSV色空間←出典: フリー百科事典『ウィキペディア(Wikipedia)』

 私は、この色相にそって、色を並べると、虹のように、多くの色を連続的にならべられるのではないか、と期待したのですが、現実には、それほどうまくは行きませんでした。
 256色の環境であつかえる、RGB(赤・緑・青)の組合せは、6×6×6 の 216色しか存在せず、彩度・明度を限定すると、その色の数は限られたものになってしまうからです。

並べ方  下のマクロは、
http://www13.plala.or.jp/kymats/program/HSB/HSB.cpp
で公開されている Cプログラムを、VBAに移植したもので、
彩度・明度を指定すると、360とおりの色相を自動で作ります。
 できた色で、セルを塗り分けますが、Excel 2003 以前のバージョンの Excel では、「56色」しか表示できません。
 このため、html に出力して、ブラウザ(IE)で、作成した色を表示できるようにしました。

注:インターネット・エクスプローラの画面の背景色を印刷するには

 Internet Explorer の初期設定では、背景にある画像を印刷しません。
 背景画像・背景色を印刷したいときには、下記の手順で設定変更します。
メニューの[ツール]→[インターネットオプション]をクリック
[インターネットオプション]の小画面の[詳細設定]タブをクリック
リストの一番下に有る、[背景の色とイメージを印刷する]チェックをOnにします。
[インターネットオプション]を、[OK]ボタンで閉じます。


 Cプログラムの作者のホームページ、「Windowsプログラミング研究所」
http://www13.plala.or.jp/kymats/
には、連絡先が書かれていないので、無断転載させていただきます。不都合があれば、お知らせ下さい。

 私は、もう一つのマクロ(Sub 色組合せ色相、「216色パレット」のシート)で、216パレット色の RGB を発生させて、その HSB(色相・彩度・明度)を計算して、色相(昇順)・明度(降順)・彩度(降順)に並べました。(216色パレット)

 これらの Excel をダウンロードできます。→color.xls

 HTMLにテキスト出力する部分のコードは、籠谷 裕人さんが、下記で公開されているコードを使わせていただきました。
http://www.vector.co.jp/soft/winnt/prog/se320375.html

 HTMLに出力した結果を、インターネット・エクスプローラで表示する部分は、
ひしだま's 技術メモページ
http://www.ne.jp/asahi/hishidama/home/
の下記のコードを、そのまま使わせていただきました。
http://www.ne.jp/asahi/hishidama/home/tech/excel/browser.html

貴重なノウハウの公開に、感謝いたします。


Option Explicit
216色の内、彩度204


'Hue:色相(色そのもの),Saturation:彩度(鮮やかさ),Brightness:明度(明暗の度合い)
'★★★ RGB→HSB変換 ★★★
'このコードは、「Windowsプログラミング研究所」
'http://www13.plala.or.jp/kymats/
'http://www13.plala.or.jp/kymats/study/gazou/HSB/HSB.html
'http://www13.plala.or.jp/kymats/program/HSB/HSB.cpp
'を、使わせていただいています。

Public Stime As Variant
Public Etime As Variant


Sub HSB色作成()


    Dim 色(6) As Integer
    Dim 赤 As Integer
    Dim 緑 As Integer
    Dim 青 As Integer
    Dim 最大 As Long
    Dim 最小 As Integer
    Dim ステップ As Integer
    Dim 色相 As Integer
    Dim 彩度 As Integer
    Dim 明度 As Integer
    Dim 処理行 As Integer
    Dim 段階 As Integer
    Dim 合致(3) As Integer
    Dim 色相出 As Integer
    Dim 彩度出 As Integer
    Dim 明度出 As Integer
    Dim 赤16 As String
    Dim 緑16 As String
    Dim 青16 As String

    
    Stime = Now()

    ' 処理を高速化するため、画面描画停止、自動計算停止

    Application.ScreenUpdating = False

    '216用のRGBの「とびとび」の値を取得
    Worksheets("216色パレット").Activate

    For 段階 = 1 To 6
        色(段階) = Range("A6").Cells(段階, 1).Value
    Next 段階

    Worksheets("HSB色作成").Activate

    '前回の処理結果の行を、前もって削除
    Range(Range("B8"), Range("B8").End(xlDown)).Select  
        'セルB8から、B列の最後まで、行削除
    Selection.EntireRow.Delete
    Range("B7").Select
    
    '指定パラメータを読み込み
    ステップ = Range("B7").Value
    彩度 = Range("C7").Value
    明度 = Range("D7").Value
    
    'メイン処理
    処理行 = 1
    
    For 色相 = 0 To 360 Step ステップ
    
        Erase 合致
        
        最大 = 明度
        最小 = 最大 - 彩度 * 最大 / 255
        
        If 色相 < 60 Then
            赤 = 最大
            緑 = 最小 + 色相 * (最大 - 最小) / 60
            青 = 最小
            
        ElseIf 色相 < 120 Then
            赤 = 最大 - (色相 - 60) * (最大 - 最小) / 60
            緑 = 最大
            青 = 最小
            
        ElseIf 色相 < 180 Then
            赤 = 最小
            緑 = 最大
            青 = 最小 + (色相 - 120) * (最大 - 最小) / 60
            
        ElseIf 色相 < 240 Then
            赤 = 最小
            緑 = 最大 - (色相 - 180) * (最大 - 最小) / 60
            青 = 最大
            
        ElseIf 色相 < 300 Then
            赤 = 最小 + (色相 - 240) * (最大 - 最小) / 60
            緑 = 最小
            青 = 最大
            
        Else '色相 < 360
            赤 = 最大
            緑 = 最小
            青 = 最大 - (色相 - 300) * (最大 - 最小) / 60
            
        End If
         
        Range("B8").Cells(処理行, 1).Value = 色相
        Range("C8").Cells(処理行, 1).Value = 彩度
        Range("D8").Cells(処理行, 1).Value = 明度
        Range("E8").Cells(処理行, 1).Interior.Color = RGB(赤, 緑, 青)
        Range("F8").Cells(処理行, 1).Value = 赤
        Range("G8").Cells(処理行, 1).Value = 緑
        Range("H8").Cells(処理行, 1).Value = 青
        
        If Len(Hex(赤)) = 1 Then
            赤16 = "0" & Hex(赤)
        Else
            赤16 = Hex(赤)
        End If
        If Len(Hex(緑)) = 1 Then
            緑16 = "0" & Hex(緑)
        Else
            緑16 = Hex(緑)
        End If
        If Len(Hex(青)) = 1 Then
            青16 = "0" & Hex(青)
        Else
            青16 = Hex(青)
        End If
        
        Range("M8").Cells(処理行, 1).Value _
        = "#" & 赤16 & 緑16 & 青16

        
        '生成した色が、216色パレットに有るかどうかチェック
        For 段階 = 1 To 6
            If 色(段階) = 赤 Then 合致(1) = 1
            If 色(段階) = 緑 Then 合致(2) = 1
            If 色(段階) = 青 Then 合致(3) = 1
        Next 段階
        
        If 合致(1) * 合致(2) * 合致(3) = 1 Then
        Range("I7").Cells(処理行, 1).Value = "216パレット色"
        End If
        
        '上のHSBからRGBへの変換が正しくできているか確認するため、
        'RGBからHSBに逆変換して、同じ値になるかチェックする。
        Call RGB→HSB(赤, 緑, 青, 色相出, 彩度出, 明度出)
        
        Range("J8").Cells(処理行, 1).Value = 色相出
        Range("K8").Cells(処理行, 1).Value = 彩度出
        Range("L8").Cells(処理行, 1).Value = 明度出

        処理行 = 処理行 + 1

    Next 色相
    
    ' 画面描画再開、自動計算停止解除
    Application.ScreenUpdating = True
    
    Etime = Now()
    MsgBox "処理が終了しました。" & Chr(13) & "処理時間は、"  _
    & Format(Etime - Stime, "nn分ss秒") & " でした。", vbOKOnly

End Sub

 解説:
 RGB 関数は、色の RGB 値を表す長整数型 (Long) の値を返します。色の設定を行うアプリケーションのメソッドやプロパティでは、色の RGB 値を表す整数が使われます。

 構文は、RGB(red, green, blue)で、各色の名前付き引数は、バリアント型 (内部処理形式 Integer の Variant) のデータ形式で指定します。色の RGB 値は、赤、緑、および青の相対的な明度の割合を 0 〜 255 の範囲の整数で指定します。 これらの明度の組み合わせによって、特定の色が表示されます。RGB 関数のそれぞれの引数の値が 255 を超えたときは、255 とみなされます。

 色の指定方法は、RGB 以外に、PatternColorIndex もあります。

 Hex 関数は、指定した値を 16 進数で表した文字列型 (String) を返します。

この種類の目次に戻る↑ 索引へ↓ トップページに戻る




ホームページのトップに戻る