和風スパゲティのレシピ

日本語でコーディングするExcelVBA

92本目:セルの色を16進数で返す関数

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:セルの色を16進で返す関数

#VBA100本ノック 92本目
セルの色を16進(赤="#FF0000"、青="#0000FF")で戻すユーザー定義関数を作成します。
=関数(セル範囲,対象)
対象: 1=塗りつぶし、2=フォント色
セル範囲の大きさにあわせて戻り値を配列で戻す。
つまり配列数式またはスピルに対応してください。
※"#RGB"です。順番に注意。

関数利用サンプル

◇ 出題ページはこちら

ソースコード

メインモジュール

' 100本ノック092:セルの色を16進で返す関数
Function GetHTMLカラーコード(対象セル As Range) As Variant
    
    ' 複数エリアには実行しない
    If 対象セル.Areas.Count > 1 Then Exit Function
    
    ' 単独セルならば値を返してExit
    If 対象セル.CountLarge = 1 Then
        GetHTMLカラーコード = "#" & ConvRGB値→HTMLカラーコード(対象セル.Interior.Color)
        Exit Function
    End If
    
    ' 同サイズの二次元配列を作りカラーコードを搭載して返す
    Dim Arr結果配列
    ReDim Arr結果配列(1 To 対象セル.Rows.Count, 1 To 対象セル.Columns.Count)
    
    Dim R As Long, C As Long
    For R = 1 To UBound(Arr結果配列, 1)
        For C = 1 To UBound(Arr結果配列, 2)
            
            Arr結果配列(R, C) = "#" & ConvRGB値→HTMLカラーコード(対象セル.Cells(R, C).Interior.Color)
            
        Next
    Next
    
    GetHTMLカラーコード = Arr結果配列
    
End Function

汎用関数モジュール

Function ConvRGB値→HTMLカラーコード(RGB値 As Long) As String
    Dim RGBHex値 As String
    RGBHex値 = Right("000000" & Hex(RGB値), 6)
    ConvRGB値→HTMLカラーコード = Right(RGBHex値, 2) _
                                             & Mid(RGBHex値, 3, 2) _
                                             & Left(RGBHex値, 2)
End Function

解説

カラーコードの取得自体は簡単な「10進数⇒16進数」の変換です。

Hex関数を使用すれば変換自体はすぐに行えますが、
RGB値は計算上BGRの順番になってしまっているため、
Left/Mid/Right関数を駆使して反転させる必要があります。


このあたりの詳しい解説はこちらの記事にありますので、
よろしければご参考ください。
www.limecode.jp


さてこの問題の本題は「スピル対応」ですが、
ユーザー定義関数をスピルさせたい場合は二次元配列を返り値にするだけでOKです。


引数として受け取ったRangeオブジェクトが、

  • 単独セルならその背景色を16進数にして返す
  • セル範囲なら同じ大きさの二次元配列を用意して返す

という分岐を行うことで対応させることが可能です。


セルの値(Valueプロパティ)を扱う関数を作る場合は、
ここからさらに「二次元配列を受け取った場合」の分岐を書く必要が出ます。

スピル関数たちには「スピルで作った配列を渡す」ことも多いですからね。
それに対応しなければスピル対応とは呼べないでしょう。


しかし今回の場合は使用するのが背景色(Interior.Color)ですので、
引数はセルまたはセル範囲(Rangeオブジェクト)で確定させて良いです。

この場合はこの程度のコード量で済みますので、
お気に入りのユーザー定義関数があれば、スピル対応させてみてください。