我正在尝试使用HSL而不是RGB设置某些单元的内部颜色。
根据Microsoft提供的此文档,它非常简单: https://docs.microsoft.com/en-us/office/client-developer/visio/hsl-function
语法只是HSL(**色相**,**饱和度**,**光度**)
那么,为什么我的VBA告诉我未定义子或函数?
以下两行代码都发生相同的错误:
Range("A1").Interior.Color = HSL(160, 240, 120)
Range("A1").Interior.ColorIndex = HSL(160, 240, 120)
答案 0 :(得分:1)
这是使用Windows API在VBA中的RGB→HSL之间进行转换的另一种方法。由于它是“经典Windows”功能,因此具有一些特质。
ColorRGBToHLS
的RGB到HSL
ColorRGBToHLS
是Windows API函数,因此使用了自1980年代以来一直沿用的过时的颜色范围(最初在名为 MS Chart 的已停产的程序中使用)。您可能熟悉将百分比之间的R / G / B值转换为255
中的值。
- 但是,在这种情况下,转换必须是与values out of
240
之间的转换,而不是255。- 只是为了将来在这里进一步使我们感到困惑,他们使用了
HLS
而不是更常见的HSL
(十六进制颜色字符串是0xBBGGRR
而不是#RRGGBB
)。
tl; dr
Option Explicit
Public Declare PtrSafe Sub ColorRGBToHLS Lib "shlwapi.dll" (ByVal clrRGB As Long, _
wHue As Integer, wLuminance As Integer, wSaturation As Integer)
Function rgb_to_hsl(r As Integer, g As Integer, b As Integer)
Dim h As Integer, s As Integer, l As Integer
ColorRGBToHLS RGB(r, g, b), h, l, s
h = 360 * (h / 239)
s = 100 * (s / 240)
l = 100 * (l / 240)
rgb_to_hsl = "hsl(" & h & "," & s & "%," & l & "%)"
End Function
...和一个demo:
Sub test()
Debug.Print rgb_to_hsl(255, 180, 63) 'returns "hsl(36,100%,62%)"
End Sub
顺便说一下,API还具有ColorHLSToRGB
函数。
80年代对于计算机迷来说是一个疯狂的时期(通常令人困惑)。有趣的事实:比尔·盖茨与他雇用的第一位女程序员结婚。