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オブジェクト)で確定させて良いです。
この場合はこの程度のコード量で済みますので、
お気に入りのユーザー定義関数があれば、スピル対応させてみてください。