使用HSL Function时如何修复“未定义Sub或Function”

时间:2019-10-17 12:41:48

标签: excel vba

我正在尝试使用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)

1 个答案:

答案 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年代对于计算机迷来说是一个疯狂的时期(通常令人困惑)。有趣的事实:比尔·盖茨与他雇用的第一位女程序员结婚。