Option Explicit
Type HSL
H As Double ' Range 0 — 1
S As Double ' Range 0 — 1
L As Double ' Range 0 — 1
End Type
Function Luminance(Cell As Excel.Range) As Long
Application.Volatile
Luminance = Round(RGBtoHSL(Cell.Interior.Color).L * 255)
End Function
Function RGBtoHSL(RGB As Long) As HSL
Dim R As Double ' Range 0 — 1
Dim G As Double ' Range 0 — 1
Dim B As Double ' Range 0 — 1
Dim RGB_Max As Double
Dim RGB_Min As Double
Dim RGB_Diff As Double
Dim HexString As String
HexString = Right$(String$(7, "0") & Hex$(RGB), 8)
R = CDbl("&H" & Mid$(HexString, 7, 2)) / 255
G = CDbl("&H" & Mid$(HexString, 5, 2)) / 255
B = CDbl("&H" & Mid$(HexString, 3, 2)) / 255
RGB_Max = R
If G > RGB_Max Then RGB_Max = G
If B > RGB_Max Then RGB_Max = B
RGB_Min = R
If G < RGB_Min Then RGB_Min = G
If B < RGB_Min Then RGB_Min = B
RGB_Diff = RGB_Max - RGB_Min
With RGBtoHSL
.L = (RGB_Max + RGB_Min) / 2
If RGB_Diff = 0 Then
.S = 0
.H = 0
Else
Select Case RGB_Max
Case R: .H = (1 / 6) * (G - B) / RGB_Diff - (B > G)
Case G: .H = (1 / 6) * (B - R) / RGB_Diff + (1 / 3)
Case B: .H = (1 / 6) * (R - G) / RGB_Diff + (2 / 3)
End Select
Select Case .L
Case Is < 0.5: .S = RGB_Diff / (2 * .L)
Case Else: .S = RGB_Diff / (2 - (2 * .L))
End Select
End If
End With
End Function